dballe-5.18/0000755000175000017500000000000011754670141007701 500000000000000dballe-5.18/missing0000755000175000017500000002415211730345667011232 00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2012-01-06.13; # UTC # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, # 2008, 2009, 2010, 2011, 2012 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, see . # 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=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # 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 msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -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' autom4te touch the output file, or create a stub one 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 yacc create \`y.tab.[ch]', if possible, from existing .[ch] Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and \`g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # normalize program name to check for. program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). This is about non-GNU programs, so use $1 not # $program. case $1 in lex*|yacc*) # Not GNU programs, they don't have --version. ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $program in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. 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*) echo 1>&2 "\ WARNING: \`$1' is $msg. 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*) echo 1>&2 "\ WARNING: \`$1' is $msg. 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*) echo 1>&2 "\ WARNING: \`$1' is $msg. 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*) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` 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' $msg. 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 test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex*|flex*) echo 1>&2 "\ WARNING: \`$1' is $msg. 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 test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man*) echo 1>&2 "\ WARNING: \`$1' is $msg. 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 "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit $? fi ;; makeinfo*) echo 1>&2 "\ WARNING: \`$1' is $msg. 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." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. 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 prerequisites 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 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: dballe-5.18/COPYING0000644000175000017500000004310511173330007010644 00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 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) year 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. dballe-5.18/README0000644000175000017500000001461311173330007010473 00000000000000README for Data Base All Enhanced version 0.7, still unreleased =============================================================== Introduction ------------ DB-All.e is a fast on-disk database where meteorological observed and forecast data can be stored, searched, retrieved and updated. This framework allows to manage large amounts of data using its simple Application Program Interface, and provides tools to visualise, import and export in the standard formats BUFR, AOF and CREX. The main characteristics of DB-ALL.e are: * Fortran, C, C++ and Python APIs are provided. * To make computation easier, data is stored as physical quantities, that is, as measures of a variable in a specific point of space and time, rather than as a sequence of report. * Internal representation is similar to BUFR and CREX WMO standard (table code driven) and utility for import and export are included (generic and ECMWF template). * Representation is in 7 dimensions: latitude and longitude geographic coordinates, table driven vertical coordinate, reference time, table driven observation and forecast specification, table driven data type. * It allows to store extra information linked to the data, such as confidence intervals for quality control. * It allows to store extra information linked to the stations. * Variables can be represented as real, integer and characters, with appropriate precision for the type of measured value. * It is based on physical principles, that is, the data it contains are defined in terms of homogeneous and consistent physical data. For example, it is impossible for two incompatible values to exist in the same point in space and time. * It can manage fixed stations and moving stations such as airplanes or ships. * It can manage both observational and forecast data. * It can manage data along all three dimensions in space, such as data from soundings and airplanes. * Report information is preserved. It can work based on physical parameters or on report types. * It is temporary, to be used for a limited time and then be deleted. * Does not need backup, since it only contains replicated or derived data. * Write access is enabled for its users. Dependencies ------------ DB-All.e requires unixodbc, gperf and popt in order to be built. Additionally, to build the Fortran API the CNF library is required, and gfortran is required to build its unit tests. To build the documentation, you need doxygen and LaTeX. If latex2html is present, HTML documentation will also be built. If rst2html is present, the README file will also be converted to HTML. In Fedora, the names of the packages depended on are: * unixODBC-devel gperf gcc-gfortran doxygen tetex tetex-latex latex2html * For CNF there is an unofficial starmet package: contact the DB-All.e team about it. In Debian, the names of the packages depended on are: * unixodbc-dev gperf libpopt-dev libcnf-dev gfortran doxygen python-docutils * tetex-bin tetex-extra (in etch), or * texlive-base texlive-latex-base texlive-latex-extra texlive-latex-recommended (in lenny and sid) * latex2html (optional, from non-free) (see http://www.arpa.emr.it/dettaglio_documento.asp?id=514&idlivello=64) Building DB-All.e ----------------- DB-All.e is already packaged in both .rpm and .deb formats, and that provides easy installation for most Linux distributions. If you want to build and install DB-All.e yourself, you can proceed as in most other Unix software:: ./configure make make install Getting started --------------- DB-All.e requires ODBC access to a MySQL database for most of its functionality. To set up DB-All.e on the MySQL side, you need to create a database and grant users create table, drop table, insert, delete and select access. MySQL needs to run with InnoDB support. To set up ODBC access to the database (this is called a DSN) you can run a graphical configuration file like ODBCConfig. Otherwise, this is a sample .odbc.ini you can use:: [dballe] Description = MySQL Driver = MySQL Server = localhost Database = dballe Once this is set up, you can initialise the DB-All.e database using the command:: dbadb wipe --dsn=dballe --user=username [--pass=password] "--user" can be omitted if it is the same as your Unix username; "--pass" can be omitted if the user has no password. If you do not already have access to datasets to import, some are available from http://www.ncar.ucar.edu/tools/datasets/ after registering (for free) on the website. Documentation ------------- Documentation for all commandline tools can be found in their manpages. All commandline tools also have extensive commandline help that can be accessed using the "--help" option. The Fortran API is documented in the fapi.pdf document. The C API and all the C internals are documented through Doxygen. Administration and maintanance of DB-All.e are covered in the guide.pdf document. Testing DB-All.e ---------------- Unit testing can be run using "make check", but it requires an existing DSN connection to a MySQL database, which should be called 'test'. Please note that unit testing functions will wipe existing DB-All.e tables on the test DSN database. Useful resources ---------------- ODBC links: * http://www.unixodbc.org/doc/ProgrammerManual/Tutorial/ * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/odbcabout_this_manual.asp BUFR decoding: * http://www.knmi.nl/~meulenvd/code/bufr/dmtn1.html AOF decoding: * Reading of Fortran "unformatted sequential" from C/C++: http://astronomy.swin.edu.au/~pbourke/dataformats/fortran/ ECWMF BUFR template codes: * http://www.ecmwf.int/research/ifsdocs/OBSERVATIONS/Chap2_Obs_types3.html Contact and copyright information --------------------------------- The author of DB-ALLe is Enrico Zini DB-ALLe is Copyright (C) 2005, 2006 ARPA-SIM DB-ALLe is licensed under the terms of the GNU General Public License version 2. Please see the file COPYING for details. Contact informations for ARPA-SIM: Agenzia Regionale Prevenzione e Ambiente (ARPA) Servizio Idro-Meteorologico (SIM) Address: Viale Silvani 6, 40122 Bologna, Italy Tel: + 39 051 6497511 Fax: + 39 051 6497501 Email: urpsim@smr.arpa.emr.it Website: http://www.arpa.emr.it/sim/ The latest version of DB-ALLe can be downloaded from: http://www.smr.arpa.emr.it/software/DBalle.html dballe-5.18/TODO.provami0000644000175000017500000000336711634672332011777 00000000000000 - aggiornare AnaDetails anche quando la mappa o la ResultGrid prendono il focus - export volnd salvato con cPickle usando indici fissi - Al momento non si può perché MA non supporta pickle - fare piccoli tool per correggere dati, cosi' si prototipano le routine di correzione (esempio: correggere i dati ana di una stazione) - modifica dei dati (dato in una riga, dati in tutte le righe della query: setta a un valore, setta a dato mancante) - eventualmente tool extra (mergiare un'anagrafica in un'altra, cambiare lat long ident di un'anagrafica esistente) - quando il filtro è dirty, cambiare lo sfondo dei dati nella griglia per far vedere quali dati sono selezionati dal nuovo filtro - Fare un metodo di dba_record che faccia match di un altro dba_record - nelle aree risultato, mettere la descrizione in un tooltip - tooltip diverso per ogni cella: http://lists.wxwidgets.org/archive/wxPython-users/msg11486.html - sperimentare una magic lens per variabile in output, che al passaggio colora le stazioni con una palette dipendente dalla variabile selezionata (serve una palette per ogni diverso tipo di selezione: giocare su: - saturazione per distinguere nel filtro di area / fuori dal filtro di area - luminosità per il valore della variabile - colore per selezionato / non selezionato (nota: è possibile solo quando una stazione ha un solo valore possibile, il ché è complesso da ottenere (datetime, livello e scadenza devono tutti essere prefissati)) - linea temporale creata con un canvas, e istogrammi (in scala logaritmica) con numero di elementi per pixel *** Test - lanciare su un database vuoto - lanciare su un database con un solo elemento - lanciare su un database grosso dballe-5.18/show_code_notes0000755000175000017500000000006311173330007012715 00000000000000#!/bin/sh find . | xargs grep 'FIXME\|TODO' | less dballe-5.18/ltmain.sh0000644000175000017500000105202211730345657011450 00000000000000 # libtool (GNU libtool) 2.4.2 # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, # 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, # or obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Usage: $progname [OPTION]... [MODE-ARG]... # # Provide generalized library-building support services. # # --config show all configuration variables # --debug enable verbose shell tracing # -n, --dry-run display commands without modifying any files # --features display basic configuration information and exit # --mode=MODE use operation mode MODE # --preserve-dup-deps don't remove duplicate dependency libraries # --quiet, --silent don't print informational messages # --no-quiet, --no-silent # print informational messages (default) # --no-warn don't display warning messages # --tag=TAG use configuration variables from tag TAG # -v, --verbose print more informational messages than default # --no-verbose don't print the extra informational messages # --version print version information # -h, --help, --help-all print short, long, or detailed help message # # MODE must be one of the following: # # clean remove files from the build directory # compile compile a source file into a libtool object # execute automatically set library path, then run a program # finish complete the installation of libtool libraries # install install libraries or executables # link create a library or an executable # uninstall remove libraries from an installed directory # # MODE-ARGS vary depending on the MODE. When passed as first option, # `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # # host-triplet: $host # shell: $SHELL # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) # $progname: (GNU libtool) 2.4.2 Debian-2.4.2-1 # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to . # GNU libtool home page: . # General help using GNU software: . PROGRAM=libtool PACKAGE=libtool VERSION="2.4.2 Debian-2.4.2-1" TIMESTAMP="" package_revision=1.3337 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # NLS nuisances: We save the old values to restore during execute mode. lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${$lt_var+set}\" = set; then save_$lt_var=\$$lt_var $lt_var=C export $lt_var lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL $lt_unset CDPATH # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" : ${CP="cp -f"} test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. exit_status=$EXIT_SUCCESS # Make sure IFS has a sensible default lt_nl=' ' IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_dirname may be replaced by extended shell implementation # func_basename file func_basename () { func_basename_result=`$ECHO "${1}" | $SED "$basename"` } # func_basename may be replaced by extended shell implementation # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` } # func_dirname_and_basename may be replaced by extended shell implementation # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname may be replaced by extended shell implementation # These SED scripts presuppose an absolute path with a trailing slash. pathcar='s,^/\([^/]*\).*$,\1,' pathcdr='s,^/[^/]*,,' removedotparts=':dotsl s@/\./@/@g t dotsl s,/\.$,/,' collapseslashes='s@/\{1,\}@/@g' finalslash='s,/*$,/,' # func_normal_abspath PATH # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. # value returned in "$func_normal_abspath_result" func_normal_abspath () { # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` while :; do # Processed it all yet? if test "$func_normal_abspath_tpath" = / ; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result" ; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_relative_path SRCDIR DSTDIR # generates a relative path from SRCDIR to DSTDIR, with a trailing # slash if non-empty, suitable for immediately appending a filename # without needing to append a separator. # value returned in "$func_relative_path_result" func_relative_path () { func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=${func_dirname_result} if test "x$func_relative_path_tlibdir" = x ; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test "x$func_stripname_result" != x ; then func_relative_path_result=${func_relative_path_result}/${func_stripname_result} fi # Normalisation. If bindir is libdir, return empty string, # else relative path ending with a slash; either way, target # file name can be directly appended. if test ! -z "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result/" func_relative_path_result=$func_stripname_result fi } # The name of this program: func_dirname_and_basename "$progpath" progname=$func_basename_result # Make sure we have an absolute path for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=$func_dirname_result progdir=`cd "$progdir" && pwd` progpath="$progdir/$progname" ;; *) save_IFS="$IFS" IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break done IFS="$save_IFS" test -n "$progdir" || progdir=`pwd` progpath="$progdir/$progname" ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed="${SED}"' -e 1s/^X//' sed_quote_subst='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' # Sed substitution that converts a w32 file name or path # which contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. # Since each input `\' is now two `\'s, look for any number of runs of # four `\'s followed by two `\'s and then a '$'. `\' that '$'. bs='\\' bs2='\\\\' bs4='\\\\\\\\' dollar='\$' sed_double_backslash="\ s/$bs4/&\\ /g s/^$bs2$dollar/$bs&/ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g s/\n//g" # Standard options: opt_dry_run=false opt_help=false opt_quiet=false opt_verbose=false opt_warning=: # func_echo arg... # Echo program name prefixed message, along with the current mode # name if it has been set yet. func_echo () { $ECHO "$progname: ${opt_mode+$opt_mode: }$*" } # func_verbose arg... # Echo program name prefixed message in verbose mode only. func_verbose () { $opt_verbose && func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_error arg... # Echo program name prefixed message to standard error. func_error () { $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 # bash bug again: : } # func_fatal_error arg... # Echo program name prefixed message to standard error, and exit. func_fatal_error () { func_error ${1+"$@"} exit $EXIT_FAILURE } # func_fatal_help arg... # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { func_error ${1+"$@"} func_fatal_error "$help" } help="Try \`$progname --help' for more information." ## default # func_grep expression filename # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $GREP "$1" "$2" >/dev/null 2>&1 } # func_mkdir_p directory-path # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { my_directory_path="$1" my_dir_list= if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then # Protect directory names starting with `-' case $my_directory_path in -*) my_directory_path="./$my_directory_path" ;; esac # While some portion of DIR does not yet exist... while test ! -d "$my_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. my_dir_list="$my_directory_path:$my_dir_list" # If the last portion added has no slash in it, the list is done case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` done my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do IFS="$save_mkdir_p_IFS" # mkdir can fail with a `File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$my_dir" 2>/dev/null || : done IFS="$save_mkdir_p_IFS" # Bail out if we (or some other process) failed to create a directory. test -d "$my_directory_path" || \ func_fatal_error "Failed to create \`$1'" fi } # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$opt_dry_run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $MKDIR "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || \ func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi $ECHO "$my_tmpdir" } # func_quote_for_eval arg # Aesthetically quote ARG to be evaled later. # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT # is double-quoted, suitable for a subsequent eval, whereas # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters # which are still active within double quotes backslashified. func_quote_for_eval () { case $1 in *[\\\`\"\$]*) func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" ;; *) func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" esac } # func_quote_for_expand arg # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { case $1 in *[\\\`\"]*) my_arg=`$ECHO "$1" | $SED \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; esac case $my_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") my_arg="\"$my_arg\"" ;; esac func_quote_for_expand_result="$my_arg" } # func_show_eval cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$my_cmd" my_status=$? if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_show_eval_locale cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$lt_user_locale $my_cmd" my_status=$? eval "$lt_safe_locale" if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_tr_sh # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_version # Echo version message to standard output and exit. func_version () { $opt_debug $SED -n '/(C)/!b go :more /\./!{ N s/\n# / / b more } :go /^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ p }' < "$progpath" exit $? } # func_usage # Echo short help message to standard output and exit. func_usage () { $opt_debug $SED -n '/^# Usage:/,/^# *.*--help/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" echo $ECHO "run \`$progname --help | more' for full usage" exit $? } # func_help [NOEXIT] # Echo long help message to standard output and exit, # unless 'noexit' is passed as argument. func_help () { $opt_debug $SED -n '/^# Usage:/,/# Report bugs to/ { :print s/^# // s/^# *$// s*\$progname*'$progname'* s*\$host*'"$host"'* s*\$SHELL*'"$SHELL"'* s*\$LTCC*'"$LTCC"'* s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ p d } /^# .* home page:/b print /^# General help using/b print ' < "$progpath" ret=$? if test -z "$1"; then exit $ret fi } # func_missing_arg argname # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $opt_debug func_error "missing argument for $1." exit_cmd=exit } # func_split_short_opt shortopt # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. func_split_short_opt () { my_sed_short_opt='1s/^\(..\).*$/\1/;q' my_sed_short_rest='1s/^..\(.*\)$/\1/;q' func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` } # func_split_short_opt may be replaced by extended shell implementation # func_split_long_opt longopt # Set func_split_long_opt_name and func_split_long_opt_arg shell # variables after splitting LONGOPT at the `=' sign. func_split_long_opt () { my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^--[^=]*=//' func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` } # func_split_long_opt may be replaced by extended shell implementation exit_cmd=: magic="%%%MAGIC variable%%%" magic_exe="%%%MAGIC EXE variable%%%" # Global variables. nonopt= preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "${1}=\$${1}\${2}" } # func_append may be replaced by extended shell implementation # func_append_quoted var value # Quote VALUE and append to the end of shell variable VAR, separated # by a space. func_append_quoted () { func_quote_for_eval "${2}" eval "${1}=\$${1}\\ \$func_quote_for_eval_result" } # func_append_quoted may be replaced by extended shell implementation # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "${@}"` } # func_arith may be replaced by extended shell implementation # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` } # func_len may be replaced by extended shell implementation # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` } # func_lo2o may be replaced by extended shell implementation # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` } # func_xform may be replaced by extended shell implementation # func_fatal_configuration arg... # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_error ${1+"$@"} func_error "See the $PACKAGE documentation for more information." func_fatal_error "Fatal configuration error." } # func_config # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # Display the features supported by this script. func_features () { echo "host: $host" if test "$build_libtool_libs" = yes; then echo "enable shared libraries" else echo "disable shared libraries" fi if test "$build_old_libs" = yes; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag tagname # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname="$1" re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf="/$re_begincf/,/$re_endcf/p" # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Option defaults: opt_debug=: opt_dry_run=false opt_config=false opt_preserve_dup_deps=false opt_features=false opt_finish=false opt_help=false opt_help_all=false opt_silent=: opt_warning=: opt_verbose=: opt_silent=false opt_verbose=false # Parse options once, thoroughly. This comes as soon as possible in the # script to make things like `--version' happen as quickly as we can. { # this just eases exit handling while test $# -gt 0; do opt="$1" shift case $opt in --debug|-x) opt_debug='set -x' func_echo "enabling shell trace mode" $opt_debug ;; --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) opt_config=: func_config ;; --dlopen|-dlopen) optarg="$1" opt_dlopen="${opt_dlopen+$opt_dlopen }$optarg" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) opt_features=: func_features ;; --finish) opt_finish=: set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help_all=: opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_mode="$optarg" case $optarg in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_silent=false func_append preserve_args " $opt" ;; --no-warning|--no-warn) opt_warning=false func_append preserve_args " $opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $opt" ;; --silent|--quiet) opt_silent=: func_append preserve_args " $opt" opt_verbose=false ;; --verbose|-v) opt_verbose=: func_append preserve_args " $opt" opt_silent=false ;; --tag) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_tag="$optarg" func_append preserve_args " $opt $optarg" func_enable_tag "$optarg" shift ;; -\?|-h) func_usage ;; --help) func_help ;; --version) func_version ;; # Separate optargs to long options: --*=*) func_split_long_opt "$opt" set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-n*|-v*) func_split_short_opt "$opt" set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognized option \`$opt'" ;; *) set dummy "$opt" ${1+"$@"}; shift; break ;; esac done # Validate options: # save first non-option argument if test "$#" -gt 0; then nonopt="$opt" shift fi # preserve --debug test "$opt_debug" = : || func_append preserve_args " --debug" case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then func_fatal_configuration "not configured to build any kind of library" fi # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test "$opt_mode" != execute; then func_error "unrecognized option \`-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$progname --help --mode=$opt_mode' for more information." } # Bail if the options were screwed $exit_cmd $EXIT_FAILURE } ## ----------- ## ## Main. ## ## ----------- ## # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null \ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_unsafe_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if `file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case "$lalib_p_line" in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test "$lalib_p" = yes } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { func_lalib_p "$1" } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $opt_debug save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$save_ifs eval cmd=\"$cmd\" func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. func_source () { $opt_debug case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case "$lt_sysroot:$1" in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result="=$func_stripname_result" ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $opt_debug if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with \`--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=${1} if test "$build_libtool_libs" = yes; then write_lobj=\'${2}\' else write_lobj=none fi if test "$build_old_libs" = yes; then write_oldobj=\'${3}\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$lt_sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $opt_debug # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result="" if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result" ; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $opt_debug if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $opt_debug # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $opt_debug if test -z "$2" && test -n "$1" ; then func_error "Could not determine host file name corresponding to" func_error " \`$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result="$1" fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $opt_debug if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " \`$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result="$3" fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $opt_debug case $4 in $1 ) func_to_host_path_result="$3$func_to_host_path_result" ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via `$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $opt_debug $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $opt_debug case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result="$1" } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result="$func_convert_core_msys_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via `$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $opt_debug if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd="func_convert_path_${func_stripname_result}" fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $opt_debug func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result="$1" } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_msys_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_mode_compile arg... func_mode_compile () { $opt_debug # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify \`-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" func_append_quoted lastarg "$arg" done IFS="$save_ifs" func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with \`-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj="$func_basename_result" } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from \`$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name \`$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname="$func_basename_result" xdir="$func_dirname_result" lobj=${xdir}$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test "$build_libtool_libs" = yes; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test "$pic_mode" != no; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test "$suppress_opt" = yes; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then if test "$pic_mode" != yes; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test "$need_locks" != no; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test "$opt_mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a \`.o' file suitable for static linking -static only build a \`.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode \`$opt_mode'" ;; esac echo $ECHO "Try \`$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test "$opt_help" = :; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | sed -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | sed '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $opt_debug # The first argument is the command name. cmd="$nonopt" test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "\`$file' was not linked with \`-export-dynamic'" continue fi func_dirname "$file" "" "." dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir="$func_dirname_result" ;; *) func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file="$progdir/$program" elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if test "X$opt_dry_run" = Xfalse; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS fi } test "$opt_mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "\`$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument \`$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and \`=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the \`-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the \`$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the \`$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test "$opt_mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $opt_debug # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test "x$prev" = x-m && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else func_dirname_and_basename "$dest" "" "." destdir="$func_dirname_result" destname="$func_basename_result" # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "\`$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "\`$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking \`$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname="$1" shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme="" ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib="$destdir/$realname" func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name="$func_basename_result" instname="$dir/$name"i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest="$destfile" destfile= ;; *) func_fatal_help "cannot copy a libtool object to \`$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script \`$wrapper'" finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no fi done relink_command= func_source "$wrapper" outputname= if test "$fast_install" = no && test -n "$relink_command"; then $opt_dry_run || { if test "$finalize" = yes; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink \`$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file="$outputname" else func_warning "cannot relink \`$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name="$func_basename_result" # Set up the ranlib parameters. oldlib="$destdir/$name" func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run \`$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test "$opt_mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $opt_debug my_outputname="$1" my_originator="$2" my_pic_p="${3-no}" my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms="${my_outputname}S.c" else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${my_outputname}.nm" func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then func_verbose "generating symbol list for \`$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $opt_dry_run || { $RM $export_symbols eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename="" if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname" ; then func_basename "$dlprefile_dlname" dlprefile_dlbasename="$func_basename_result" else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename" ; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) if test "X$my_pic_p" != Xno; then pic_flag_for_symtable=" $pic_flag" fi ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' # Transform the symbol file into the correct name. symfileobj="$output_objdir/${my_outputname}S.$objext" case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for \`$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $opt_debug win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $opt_debug sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $opt_debug match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive which possess that section. Heuristic: eliminate # all those which have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $opt_debug if func_cygming_gnu_implib_p "$1" ; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1" ; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result="" fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" if test "$lock_old_archive_extraction" = yes; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test "$lock_old_archive_extraction" = yes; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $opt_debug my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib="$func_basename_result" my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`basename "$darwin_archive"` darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory in which it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ which is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options which match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include /* declarations of non-ANSI functions */ #if defined(__MINGW32__) # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined(__CYGWIN__) # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined (other platforms) ... */ #endif /* portability defines, excluding path handling macros */ #if defined(_MSC_VER) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC # ifndef _INTPTR_T_DEFINED # define _INTPTR_T_DEFINED # define intptr_t int # endif #elif defined(__MINGW32__) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined(__CYGWIN__) # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined (other platforms) ... */ #endif #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) #if defined(LT_DEBUGWRAPPER) static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (strcmp (str, pat) == 0) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else int len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { int orig_value_len = strlen (orig_value); int add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ int len = strlen (new_value); while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[len-1] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $opt_debug case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_mode_link arg... func_mode_link () { $opt_debug case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll which has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=no prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module="${wl}-single_module" func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir="$arg" prev= continue ;; dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" test -f "$arg" \ || func_fatal_error "symbol file \`$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file \`$arg' does not exist" fi arg=$save_arg prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds="$arg" prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "\`-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between \`-L' and \`$1'" else func_fatal_error "need path for \`-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of \`$dir'" dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "\`-no-install' is ignored for $host" func_warning "assuming \`-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-flto*|-fwhopr*|-fuse-linker-plugin) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test "$prev" = dlfiles; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the \`$prevarg' option requires an argument" if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname="$func_basename_result" libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps ; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test "$linkmode,$pass" = "lib,link"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs="$tmp_deplibs" fi if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS%" test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" ;; esac fi if test "$linkmode,$pass" = "lib,dlpreopen"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs="$dlprefiles" fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then func_warning "\`-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no func_dirname "$lib" "" "." ladir="$func_dirname_result" lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l *.ltframework) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "\`-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." else echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi ;; esac continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" fi # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "\`$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir="$func_dirname_result" dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" fi continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test "$prefer_static_libs" = yes || test "$prefer_static_libs,$installed" = "built,no"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib="$l" done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then func_fatal_error "cannot -dlopen a convenience library: \`$lib'" fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of \`$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir="$ladir" fi ;; esac func_basename "$lib" laname="$func_basename_result" # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$lt_sysroot$libdir" absdir="$lt_sysroot$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later func_append notinst_path " $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi case "$host" in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath:" in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test "$installed" = no; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule="" for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule="$dlpremoduletest" break fi done if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then echo if test "$linkmode" = prog; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname="$1" shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc*) func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" func_basename "$soroot" soname="$func_basename_result" func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from \`$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for \`$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$opt_mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we can not # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null ; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library" ; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add="$dir/$old_library" fi elif test -n "$old_library"; then add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$absdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && test "$hardcode_minus_L" != yes && test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$opt_mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system can not link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs="$temp_deplibs" fi func_append newlib_search_path " $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path="$deplib" ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of \`$dir'" absdir="$dir" fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl" ; then depdepl="$absdir/$objdir/$depdepl" darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" path= fi fi ;; *) path="-L$absdir/$objdir" ;; esac else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "\`$deplib' seems to be moved" path="-L$absdir" fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test "$pass" = link; then if test "$linkmode" = "prog"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" fi if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "\`-R' is ignored for archives" test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "\`-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "\`-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test "$module" = no && \ func_fatal_help "libtool library \`$output' must begin with \`lib'" if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test "$dlself" != no && \ func_warning "\`-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test "$#" -gt 1 && \ func_warning "ignoring multiple \`-rpath's for a libtool library" install_libdir="$1" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "\`-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 shift IFS="$save_ifs" test -n "$7" && \ func_fatal_help "too many parameters to \`-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$1" number_minor="$2" number_revision="$3" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|qnx|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; *) func_fatal_configuration "$modename: unknown library version type \`$version_type'" ;; esac ;; no) current="$1" revision="$2" age="$3" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT \`$current' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION \`$revision' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE \`$age' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE \`$age' is greater than the current interface number \`$current'" func_fatal_error "\`$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current" ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring:${iface}.0" done # Make executables depend on our current version. func_append verstring ":${current}.0" ;; qnx) major=".$current" versuffix=".$current" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; *) func_fatal_configuration "unknown library version type \`$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then func_warning "undefined symbols not allowed in $host shared libraries" build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi func_generate_dlsyms "$libname" "$libname" "yes" func_append libobjs " $symfileobj" test "X$libobjs" = "X " && libobjs= if test "$opt_mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test "X$deplibs_check_method" = "Xnone"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then # Remove ${wl} instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$opt_mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname="$1" shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile if test "x`$SED 1q $export_symbols`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols="$export_symbols" export_symbols= always_export_symbols=yes fi fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd1 in $cmds; do IFS="$save_ifs" # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test "$try_normal_branch" = yes \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=${output_objdir}/${output_la}.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test "$compiler_needs_object" = yes && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test "$compiler_needs_object" = yes; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-${k}.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test "X$objlist" = X || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\${concat_cmds}$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi if ${skipped_export-false}; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi fi test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi if ${skipped_export-false}; then if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi fi libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "\`-R' is ignored for objects" test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for objects" test -n "$release" && \ func_warning "\`-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object \`$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` else gentop="$output_objdir/${obj}x" func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for programs" test -n "$release" && \ func_warning "\`-release' is ignored for programs" test "$preload" = yes \ && test "$dlopen_support" = unknown \ && test "$dlopen_self" = unknown \ && test "$dlopen_self_static" = unknown && \ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " ${wl}-bind_at_load" func_append finalize_command " ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs="$new_libs" func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=yes case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=no ;; *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; esac if test "$wrappers_required" = no; then # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' fi exit $exit_status fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" func_warning "this platform does not like uninstalled shared libraries" func_warning "\`$output' will be relinked during installation" else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host" ; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save $symfileobj" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" if test "$preload" = yes && test -f "$symfileobj"; then func_append oldobjs " $symfileobj" fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase="$func_basename_result" case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name="$func_basename_result" func_resolve_sysroot "$deplib" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test "x$bindir" != x ; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that can not go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } { test "$opt_mode" = link || test "$opt_mode" = relink; } && func_mode_link ${1+"$@"} # func_mode_uninstall arg... func_mode_uninstall () { $opt_debug RM="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) func_append RM " $arg"; rmforce=yes ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then odir="$objdir" else odir="$dir/$objdir" fi func_basename "$file" name="$func_basename_result" test "$opt_mode" = uninstall && odir="$dir" # Remember odir for removal later, being careful to avoid duplicates if test "$opt_mode" = clean; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case "$opt_mode" in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test "$non_pic_object" != none; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test "$opt_mode" = clean ; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name" ; then func_append rmfiles " $odir/lt-${noexename}.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } { test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && func_mode_uninstall ${1+"$@"} test -z "$opt_mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode \`$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: # vi:sw=2 dballe-5.18/tables/0000755000175000017500000000000011754670141011153 500000000000000dballe-5.18/tables/D0000000000200014001.txt0000644000175000017500000025404011445636071013655 00000000000000 300002 2 000002 000003 300003 3 000010 000011 000012 300004 9 300003 000013 000014 000015 000016 000017 000018 000019 000020 300010 4 300003 101000 031001 000030 301001 2 001001 001002 301002 3 001003 001004 001005 301003 3 001011 001012 001013 301004 4 001001 001002 001015 002001 301005 2 001035 001034 301011 3 004001 004002 004003 301012 2 004004 004005 301013 3 004004 004005 004006 301014 3 102002 301011 301012 301021 2 005001 006001 301022 3 005001 006001 007001 301023 2 005002 006002 301024 3 005002 006002 007001 301025 3 301023 004003 301012 301026 7 301021 004003 004003 004004 004004 004005 004005 301027 5 008007 101000 031001 301028 008007 301028 8 008040 033042 007010 101000 031002 301023 019007 008040 301031 5 301001 002001 301011 301012 301022 301032 5 301001 002001 301011 301012 301024 301033 5 001005 002001 301011 301012 301021 301034 5 001005 002001 301011 301012 301023 301035 7 001005 001012 001013 002001 301011 301012 301023 301036 5 301003 002001 301011 301012 301023 301037 6 301001 002011 002012 301011 301012 301022 301038 6 301001 002011 002012 301011 301012 301024 301039 6 301003 002011 002012 301011 301012 301023 301040 6 301003 002011 002012 301011 301012 301024 301041 5 001007 002021 002022 301011 301012 301042 2 301041 301021 301043 5 001007 002023 301011 301013 301021 301044 5 001007 002024 301011 301013 301021 301045 9 301011 301012 201138 202131 004006 201000 202000 304030 304031 301046 10 001007 001012 002048 021119 025060 202124 002026 002027 202000 005040 301047 15 001007 025060 001033 001034 001012 301045 002021 301011 301012 201138 202131 004006 201000 202000 301023 301048 14 002104 002121 002113 002026 002027 002111 002140 202127 001013 202126 007001 202000 025010 021064 301049 5 002111 002112 021062 021063 021065 301051 6 001006 002061 301011 301012 301021 008004 301055 7 001005 002001 301011 301012 301021 001012 001014 301062 3 101000 031001 301001 301065 8 001006 001008 002001 002002 002005 002062 002070 002065 301066 6 301011 301013 301023 007004 002064 008004 301070 3 002143 002142 002144 301071 5 001007 001031 002020 002028 002029 301072 4 301071 301011 301013 301021 301074 4 002143 002142 002145 002146 301075 6 301001 001015 301024 008021 301011 301012 301076 3 002011 002143 002142 301090 6 301004 301011 301012 301021 007030 007031 301091 10 002180 002181 002182 002183 002184 002179 002186 002187 002188 002189 301092 9 001011 001003 002001 301011 301012 301021 007030 007031 033024 301093 3 301036 007030 007031 301110 5 301001 001011 002011 002014 002003 301111 6 301001 001011 002011 002013 002014 002003 301112 5 001006 002011 002013 002014 002003 301113 3 008021 301011 301013 301114 5 301021 007030 007031 007007 033024 301120 4 301001 001094 002011 301121 301121 5 008041 301122 301021 007031 007007 301122 7 301011 301012 201135 202130 004006 202000 201000 301123 33 102002 008041 001062 301001 001094 002011 001018 001095 025061 025068 001082 001083 001081 002067 002066 002014 025067 025065 025066 002095 002096 002097 002016 002083 002080 002081 001093 002084 002085 002086 002082 008041 301011 301125 6 001033 001034 025060 001007 002019 001012 301193 5 001007 001031 002196 002221 002222 301194 9 001194 001012 001013 002011 002012 301011 301012 301023 007001 301195 9 001195 001012 001013 002011 002012 301011 301012 301023 007001 301196 7 301003 002011 002012 301011 301012 301023 007001 301197 9 001006 001008 002061 002062 002002 002005 002070 002063 002001 301198 9 001011 001012 001013 002011 002012 301011 301012 301023 007001 301200 2 001032 033194 301201 2 101003 033193 301202 2 001031 001032 301237 12 001007 001012 002021 301011 004004 004005 201138 202131 004006 201000 202000 301023 301238 14 002104 002121 002113 002026 002027 002111 002192 202127 001013 202126 007001 202000 025010 021194 301239 5 002111 002112 021192 021193 021195 301240 5 201131 202129 022021 201000 202000 301241 5 201141 202130 007001 201000 202000 301242 6 021207 021208 021209 021210 021211 021212 301250 4 301193 301011 301013 301021 302001 4 010004 010051 010061 010063 302002 5 010004 007004 010003 010061 010063 302003 9 011011 011012 012004 012006 013003 020001 020003 020004 020005 302004 7 020010 008002 020011 020013 020012 020012 020012 302005 4 008002 020011 020012 020013 302006 4 010004 010051 010062 010063 302011 3 302001 302003 302004 302012 3 302002 302003 302004 302013 5 302006 302003 101000 031001 302005 302021 3 022001 022011 022021 302022 3 022002 022012 022022 302023 3 022003 022013 022023 302024 3 302022 101002 302023 302031 4 302001 010062 007004 010009 302032 4 007032 012101 012103 013003 302033 2 007032 020001 302034 2 007032 013023 302035 8 302032 302033 302034 007032 302004 101000 031001 302005 302036 7 105000 031001 008002 020011 020012 020014 020017 302037 3 020062 013013 012113 302038 4 020003 004024 020004 020005 302039 2 004024 014031 302040 4 007032 102002 004024 013011 302041 7 007032 004024 004024 012111 004024 004024 012112 302042 11 007032 002002 008021 004025 011001 011002 008021 103002 004025 011043 011041 302043 7 302038 101002 302039 302040 302041 302042 007032 302044 3 004024 002004 013033 302045 7 004024 014002 014004 014016 014028 014029 014030 302046 3 004024 004024 012049 302047 3 102003 008002 020054 302048 5 005021 007021 020012 005021 007021 302049 7 008002 020011 020013 020012 020012 020012 008002 302050 31 008041 005021 007005 202130 006021 202000 008041 201131 202129 002115 010004 002115 013003 202000 201000 002115 011001 011002 002115 102002 012101 004024 002115 012103 012102 101003 020012 020011 020013 101002 020003 302051 12 010004 010051 007004 010003 012004 012051 012016 012017 013004 102004 008051 008020 302052 7 007032 007033 012101 002039 012102 012103 013003 302053 3 007032 007033 020001 302054 9 302052 302053 007033 302034 007032 302004 101000 031001 302005 302055 8 020031 020032 020033 020034 020035 020036 020037 020038 302056 4 002038 007063 022043 007063 302057 3 302056 302021 302024 302058 8 007032 007033 004024 004024 012111 004024 004024 012112 302059 12 007032 007033 002002 008021 004025 011001 011002 008021 103002 004025 011043 011041 302060 4 302038 302040 302058 302059 302062 24 302001 302052 302053 007033 101000 031000 302034 007032 101000 031001 302005 008002 101000 031000 302055 101000 031000 302056 101000 031000 302021 101000 031000 302024 302063 8 302038 101000 031000 302040 101000 031000 302058 302059 302066 16 020023 020024 020027 020054 020023 020027 020054 020025 020026 020027 020040 020066 020027 020021 020067 020027 302069 4 007032 007033 033041 020001 302070 8 007032 007033 011001 011002 011043 011041 011016 011017 302071 14 007032 007033 008021 004025 011001 011002 008021 103002 004025 011043 011041 004025 011016 011017 302072 5 007032 007033 012101 012103 013003 302073 7 020010 105004 008002 020011 020012 033041 020013 302074 4 020003 004025 020004 020005 302075 5 008021 004025 013055 013058 008021 302076 7 020021 020022 026020 020023 020024 020025 020026 302077 8 007032 007033 004025 012111 012112 007032 004025 012112 302078 4 002176 020062 002177 013013 302079 5 007032 002175 002178 004025 013011 302080 3 002185 004025 013033 302081 2 004025 014031 302082 7 004025 014002 014004 014016 014028 014029 014030 302083 8 004025 008023 010004 011001 011002 012101 013003 008023 302205 5 201131 202129 022021 201000 202000 302206 9 302205 201130 202129 022011 201000 202000 022001 011001 011002 302207 5 022193 022194 022195 022196 022197 302250 5 102000 031001 020193 020194 020012 303001 3 007003 011001 011002 303002 3 007004 011001 011002 303003 4 007004 010003 012001 012003 303004 6 007004 010003 012001 012003 011001 011002 303011 4 007003 008001 011001 011002 303012 4 007004 008001 011001 011002 303013 7 007004 008001 010003 012001 013003 011001 011002 303014 7 007004 008001 010003 012001 012003 011001 011002 303021 4 007004 007004 204007 031021 303022 3 303021 010003 204000 303023 3 303021 012001 204000 303024 3 303021 013016 204000 303025 5 002025 204007 031021 012063 204000 303026 6 007004 008003 204007 031021 012001 204000 303027 5 007004 204007 031021 010003 204000 303031 6 007004 008003 007021 007022 008012 012061 303032 2 020011 020016 303033 2 020010 020016 303040 18 008041 004025 004026 301021 301122 201131 202129 025069 007004 013003 202000 201000 002013 012101 010009 102002 008040 035035 303041 8 002152 002023 007004 011001 011002 002153 002154 012071 303050 7 004086 008042 007004 005015 006015 011001 011002 303051 7 004086 008042 007004 005015 006015 011061 011062 303052 7 004086 008042 007009 005015 006015 011001 011002 303053 7 004086 008042 007009 005015 006015 011061 011062 303054 10 004086 008042 007004 010009 005015 006015 012101 012103 011001 011002 303249 7 002252 104000 031001 002199 007004 007004 013003 303250 8 002252 002023 007004 011001 011002 002197 002198 012193 303251 8 002252 105000 031001 002254 002251 002197 002198 012063 303252 8 002252 105000 031001 002254 002251 002197 002198 012194 304001 5 008003 010004 012001 011001 011002 304002 4 008003 010004 011001 011002 304003 2 008003 012001 304004 4 008003 010004 020010 012001 304005 4 002024 007004 007004 013003 304006 3 014001 014001 014003 304011 27 002163 002164 008012 007024 002057 008021 004001 004002 004003 004004 008021 004024 110004 008021 004004 004005 004006 008021 004004 004005 004006 011001 011002 103010 002163 007004 012001 304030 3 027031 028031 010031 304031 3 001041 001042 001043 304032 5 002153 002154 020081 020082 020012 304033 8 002152 002166 002167 002153 002154 012075 012076 012063 304034 9 102004 027001 028001 007022 005043 020010 020016 033003 010040 304035 15 002153 002154 012063 008001 012063 008001 012063 008001 008003 012063 008003 012063 008003 012063 008003 304036 12 020082 008012 020082 008012 020081 008003 020081 008003 020081 008003 020081 008003 304228 3 005217 006217 007217 304229 3 001208 001209 001210 304250 27 002231 002232 008012 007024 002057 008021 004001 004002 004003 004004 008021 004024 110004 008021 004004 004005 004006 008021 004004 004005 004006 011001 011002 103010 002231 007004 012001 305003 5 301012 004065 101000 031001 305001 305006 6 013072 013082 013019 012001 013073 013060 305007 6 301029 301012 004065 101000 031001 305006 305008 2 305006 012030 305009 6 301029 301012 004065 101000 031001 305008 305011 6 301029 301012 004065 101000 031001 305010 305018 8 301029 301012 004065 103000 031001 305008 305016 305017 306001 5 002032 102000 031001 007062 022042 306002 3 002031 022004 022031 306003 4 002002 011011 011012 012004 306004 7 002032 002033 103000 031001 007062 022043 022062 306005 6 002031 103000 031001 007062 022004 022031 306006 3 306003 306002 022063 306007 6 001012 001014 306008 004024 027003 028003 306008 3 002034 002035 002036 306019 8 001075 301011 301012 022042 022120 022121 004015 004065 306020 4 306024 102006 022038 022039 306021 7 001075 301011 301012 022122 022123 012001 303002 306022 5 001075 301011 301012 022038 022039 306023 8 001015 301023 301011 301012 022038 022039 022120 022121 306024 8 001075 301011 301012 022042 022120 022121 004025 004015 306025 4 306019 102006 022038 022039 307001 2 301031 302011 307002 2 301032 302011 307003 4 307001 101000 031001 302005 307004 4 307002 101000 031001 302005 307005 3 307001 101004 302005 307006 3 307002 101004 302005 307007 2 301031 302012 307008 2 301032 302012 307009 2 301031 302013 307011 16 001063 002001 301011 301012 301024 007006 011001 011016 011017 011002 011041 007006 012001 012003 010052 020009 307012 5 103000 031001 008023 005021 020001 307013 8 106000 031001 001064 008014 020061 008014 020061 020018 307014 3 101000 031001 020019 307015 4 101000 031001 302005 020002 307016 3 101000 031001 020020 307017 3 101000 031001 011070 307018 16 008016 102000 031001 008017 301012 104000 031001 007006 011001 011002 011041 020009 101000 031001 020001 307014 307020 3 307011 307014 307016 307021 9 307011 307012 307013 307014 307015 307016 307017 307018 307015 307022 31 001015 301011 301012 301022 008021 004025 010004 012001 013003 033038 008022 106025 002020 001050 005021 007021 015031 015032 008060 015033 015034 008060 015033 015034 015035 201131 202129 013016 202000 201000 015011 307030 2 015001 015002 307031 7 008022 008023 015001 008023 015001 008023 015002 307041 7 301001 001015 301022 301011 301012 301070 307030 307042 9 301001 001015 301022 301011 301012 008021 004025 301070 307031 307043 7 301001 001015 301024 301011 301012 301074 307030 307045 25 001063 008079 002001 301011 301012 301024 007032 011001 011016 011017 008054 011083 011084 011002 008054 011085 011086 011041 008054 007032 012023 012024 007032 010052 020009 307046 5 020060 Metar/speci visibility 102000 031001 005021 020059 307047 9 105000 Metar/speci clouds 031001 008002 020011 020012 020013 020092 020002 020091 307048 25 008016 102000 031001 008017 301012 112000 031000 007032 011001 008054 011083 011084 011002 008054 011085 011086 011041 008054 007032 020009 101000 031000 020060 307014 307047 307049 4 102000 031000 022043 022021 307050 14 101000 031000 020085 102000 031001 001064 020085 105000 031001 001064 020086 020087 020088 020089 307059 12 307045 Full METAR/SPECI 307046 307013 307014 307047 307016 307017 307049 307050 101000 031001 307048 Trend forecast 307052 12 001063 008039 301011 301012 008079 008039 301011 start of forecast 301012 008039 301011 end of forecast 301012 301024 307053 16 007032 011001 008054 011083 011084 011002 008054 011085 011086 011041 008054 007032 020009 020060 307014 307047 307054 13 007032 008039 004003 004004 008023 012023 008039 004003 004004 008023 012023 008023 007032 307055 9 033045 008016 008039 004003 301012 008039 004003 301012 307053 307056 6 307052 Aerodrome forecast 307053 307054 101000 031001 307055 307059 12 307045 Full METAR/SPECI 307046 307013 307014 307047 307016 307017 307049 307050 101000 031001 307048 Trend forecast 307060 2 007061 012030 307061 3 301031 101005 307060 307062 3 301032 101005 307060 307063 2 007061 012130 307071 67 301090 004074 004023 008023 010004 010051 007004 010009 007032 012101 002051 004051 012118 004052 012119 013004 008023 012151 007032 102005 008050 008020 014032 014033 008050 008020 102018 008052 008022 007032 008053 004003 012152 008053 004003 012153 008053 004003 008023 012101 008053 004003 008023 012101 008023 007032 002002 008053 004003 011046 008053 004003 004004 004023 007032 013060 013051 004053 008050 008020 102006 008052 008022 008053 004003 013052 007032 307072 38 004001 004001 004002 004003 004004 004074 004022 008023 010004 010051 007004 010009 007032 012101 002051 004051 012118 004052 012119 013004 012151 007032 014032 008023 004001 004001 004002 004003 004004 004022 007032 008023 013060 004053 008023 102008 008050 008020 307073 2 307071 307072 307079 30 301090 SYNOP data and marine data from costal stations 302031 302035 302036 101000 031000 302047 008002 101000 031000 302048 302037 102000 031000 022061 020058 101000 031000 302056 101000 031000 302055 302043 302044 101000 031001 302045 101000 031000 302046 307080 13 301090 BUFR template for synoptic reports 302031 302035 302036 302047 008002 302048 302037 302043 302044 101002 302045 302046 307081 24 301090 BUFR template for synoptic reports RA I 302031 302035 302036 302047 008002 302048 302037 012122 013056 013057 020101 020102 020103 020104 020105 020106 020107 020108 302043 302044 101002 302045 302046 307082 15 301090 BUFR template for synoptic reports RA II 302031 302035 302036 302047 008002 302048 302037 012121 012122 302043 302044 101002 302045 302046 307083 14 301090 BUFR template for synoptic reports RA III 302031 302035 302036 302047 008002 302048 302037 012122 302043 302044 101002 302045 302046 307084 17 301090 BUFR template for synoptic reports RA IV 302031 302035 302036 302047 008002 302048 302037 020055 101000 031000 205001 302043 302044 101002 302045 302046 307086 11 301090 BUFR template for synoptic reports RA VI 302031 302035 302036 008002 302037 302066 302043 302044 101002 302045 307090 13 301092 BUFR template for synoptic reports from mobile land stations 302031 302035 302036 302047 008002 302048 302037 302043 302044 101002 302045 302046 307091 66 301089 301090 008010 301091 302001 007004 010009 302072 103000 031000 101005 307063 007061 101000 031000 302069 007032 007033 105000 031000 020031 020032 002038 022043 302021 101000 031000 302078 101000 031000 302073 101000 031000 302074 101000 031000 302075 102000 031000 004025 302076 302071 302077 007033 101000 031000 302079 007032 101000 031000 302080 101000 031000 302081 101000 031000 302082 102000 031000 004025 013059 101000 031000 302083 033005 033006 307092 62 301089 Surface obs drom N-minute period 301090 008010 301091 004015 004065 125000 031001 010004 302070 302072 007032 012101 103000 031000 101005 307063 007061 101000 031000 302069 007032 007033 101000 031000 302073 101000 031000 302076 102000 031000 013055 013058 102000 031000 020031 020032 101000 031000 302078 102000 031000 302079 007032 101000 031000 302080 101000 031000 302081 101000 031000 302083 102000 031000 004025 013059 101000 031000 302083 033005 033006 308001 3 301033 302011 022042 308002 3 301034 302011 022042 308003 3 301035 302011 022042 308004 3 301036 302011 022042 308005 2 308004 302024 308006 8 010004 010061 010063 011001 011002 012004 013003 022042 308007 4 301055 302011 007062 022042 308008 84 001003 BUOY 001020 001005 002001 002036 002149 301011 301012 008021 301011 301012 008021 301021 027004 028004 007030 001051 002148 001012 001014 002040 033022 033023 033027 022063 302021 302022 302023 008081 025026 008081 025026 008081 025026 008081 002034 022060 007070 002190 025086 002035 002168 020031 002038 306004 002030 306005 007031 008081 012064 302001 008081 007032 007033 012101 012103 013003 007032 007033 008082 007033 002169 002002 008021 004025 011001 011002 008021 004025 011043 011041 008082 007033 007032 004024 013011 007032 008021 004024 014021 008021 025028 025028 025028 308009 7 301093 302001 302054 008002 302055 302057 302060 308010 16 001011 TRACKOB template 113000 031001 301011 301012 301021 004080 022049 004080 022059 004080 022005 002042 022032 002042 004080 308011 27 001011 Climat ship 002001 301011 301012 301023 007030 007031 004074 004023 008023 010051 007032 007033 012101 013004 007032 007033 302056 008023 004003 004004 004023 007032 013060 013051 004053 007032 308012 28 004001 Monthly normals from an ocean weather station 004001 004002 004003 004004 004074 004022 008023 010051 007032 007033 012101 013002 007032 007033 302056 008023 004001 004001 004002 004003 004004 004022 007032 008023 013060 004053 008023 308013 2 308011 308012 309001 4 301037 101000 031001 303011 309002 4 301038 101000 031001 303011 309003 4 301037 101000 031001 303012 309004 4 301038 101000 031001 303012 309005 5 301037 302004 101000 031001 303013 309006 5 301038 302004 101000 031001 303013 309007 5 301037 302004 101000 031001 303014 309008 5 301038 302004 101000 031001 303014 309011 4 301039 101000 031001 303011 309012 4 301039 101000 031001 303012 309013 5 301039 302004 101000 031001 303013 309014 5 301039 302004 101000 031001 303014 309015 4 301040 101000 031001 303011 309016 4 301040 101000 031001 303012 309017 5 301040 302004 101000 031001 303013 309018 5 301040 302004 101000 031001 303014 309019 5 301031 002003 101000 031001 303011 309020 8 301031 002003 104000 031001 007003 011003 011004 011005 309030 8 015004 015005 104000 031001 004015 008006 007004 015003 309031 8 015004 015005 104000 031001 004025 008006 007004 015003 309040 3 301075 301076 309030 309042 4 307042 301075 301076 309030 309050 9 301110 301113 301114 101000 031002 303050 101000 031001 303051 309051 9 301110 301113 301114 101000 031002 303052 101000 031001 303053 309052 11 301111 301113 301114 302049 022043 101000 031002 303054 101000 031001 303051 309053 9 301112 301113 301114 101000 031002 303054 101000 031001 303051 309054 27 301001 001011 301011 301012 301021 007030 007031 007007 004023 004059 115000 031001 008001 008023 007004 010009 012101 012103 008023 011001 011002 008023 011019 008050 008020 008050 008020 309060 4 301123 301121 302050 303040 309061 21 301120 008041 301122 201131 202129 025069 007004 202000 201000 033007 033035 033015 013009 033007 033035 033015 002013 012101 033007 033035 033015 309062 19 301120 008041 301122 005001 033035 033015 006001 033035 033015 007007 033035 033015 011003 033035 033015 011004 033035 033015 033007 309063 19 301120 008041 301122 005001 033035 033015 006001 033035 033015 007007 033035 033015 011003 033035 033015 011004 033035 033015 033007 309064 26 301120 008041 301122 201131 202129 104002 025069 007004 033035 033015 013003 033035 033015 202000 201000 104002 002013 012101 033035 033015 012103 033035 033015 010009 033035 033015 309065 18 301120 008041 301122 005001 033035 033015 006001 033035 033015 007007 033035 033015 011003 033035 033015 011004 033035 033015 309066 18 301120 008041 301122 008040 201131 202129 025069 007004 013003 202000 201000 002013 012101 012103 010009 010007 011002 011001 309194 5 301194 302004 101000 031001 303014 309195 5 301195 302004 101000 031001 303014 309196 5 301196 302004 101000 031001 303014 309198 5 301198 302004 101000 031001 303014 310001 5 301042 303031 303032 101026 303025 310002 5 301042 303031 303032 101009 303023 310003 5 301042 303031 303032 101006 303023 310004 5 301042 303031 303032 101003 303024 310005 6 301042 303031 303033 101000 031001 303025 310006 6 301042 303031 303033 101000 031001 303023 310007 6 301042 303031 303033 101000 031001 303024 310008 8 310011 101019 310012 002150 025079 025080 033032 014045 310009 3 310011 101015 310012 310010 3 310011 101005 310012 310011 45 008070 001033 001034 008070 001033 001034 001007 002048 005040 025075 201133 005041 201000 005043 025070 033030 033031 004001 004002 004003 004004 004005 202131 201138 004006 201000 202000 005001 006001 202126 007001 202000 007024 005021 007025 005022 033033 002151 012064 002151 012064 002151 012064 002151 012064 310012 10 002150 025076 025077 025078 033032 201132 202129 012063 202000 201000 310013 62 001007 005040 004001 004002 004003 004004 004005 004006 005001 006001 007025 005043 025085 201131 202129 002150 008023 008072 014027 008072 014027 002150 008023 008072 014027 008072 014027 002150 008023 008072 014027 008072 014027 202000 201000 201132 202129 002150 008023 008072 012063 008072 012063 002150 008023 008072 012063 008072 012063 008023 008072 012063 008072 012063 002150 008023 008072 012063 008072 012063 202000 201000 310014 3 301072 303041 304011 310015 13 301072 007024 010002 303041 101003 304032 002152 002024 007004 007004 013003 101003 304033 310016 13 301072 007024 010002 303041 101012 304032 002152 002024 007004 007004 013003 101012 304033 310019 68 001007 002019 301011 301013 301023 007025 008021 007025 008021 007025 008021 008029 005040 008075 008003 010004 008003 207002 015001 207000 033070 015030 207002 020081 207000 008003 033042 007004 207002 015001 207000 008003 113021 007004 007004 207002 008021 015005 008021 015005 033007 207000 008026 101020 025143 008026 008043 109015 007004 008090 207006 015008 207000 008090 207002 033007 207000 008043 033071 108008 202124 201107 002071 201000 202000 207002 020081 207000 310020 6 310022 301011 301013 301021 304034 310021 310021 10 108000 031001 201131 202129 007004 007004 202000 201000 015020 010002 310022 4 001007 002019 001033 002172 310023 17 301072 030021 030022 008012 007024 007025 010002 101012 304032 105002 002152 002024 007004 007004 013003 101012 304033 310024 17 301072 030021 030022 008012 007024 007025 010002 101003 304032 105002 002152 002024 007004 007004 013003 101003 304033 310025 61 001007 008021 004001 004002 004003 004004 004005 201138 202131 004006 202000 201000 201132 005041 201000 201129 005043 201000 005002 006002 013040 020029 104024 005042 012163 021083 021084 115003 004001 004002 004003 201142 202131 004026 202000 201000 005001 006001 201138 202129 007001 202000 201000 008021 004001 004002 004003 004004 004005 005040 101003 012070 025054 101004 025055 008007 104028 005002 006002 002111 005021 310026 82 310022 025060 008021 301011 301012 201138 202131 004006 202000 201000 033039 033007 304030 304031 002020 001050 202127 304030 202000 304031 201133 202131 004016 202000 201000 301021 304030 010035 005021 010036 113000 031002 301021 005021 108000 031001 002121 007040 015037 008023 201125 015037 201000 008023 033007 108000 031002 007007 015036 008023 201123 015036 201000 008023 033007 116000 031002 007009 010004 012001 013001 008023 201120 010004 201000 201122 012001 201000 201123 013001 201000 008023 033007 008003 007009 010004 008023 201120 010004 201000 008023 033007 310027 12 301071 301011 301013 301021 030021 030022 010002 304036 002152 002167 101011 304035 310029 12 110000 031001 201138 202130 007004 007004 202000 201000 015020 010002 012101 013098 310030 6 310022 301011 301013 301021 304034 310029 310050 14 310051 310052 101000 031002 310053 101004 310054 020010 310052 101015 310053 310052 101005 310053 310051 16 001007 005040 201133 005041 201000 201132 025070 201000 202126 007001 202000 007025 005022 102009 002151 012064 310052 12 002019 301011 301012 202131 201138 004006 201000 202000 301021 007024 005021 005043 310053 6 201134 005042 201000 025076 033032 012163 310054 13 201134 005042 201000 025076 033032 201131 202129 102002 008023 014027 008023 202000 201000 310055 8 310051 310052 102020 025076 025052 101000 031002 025050 310060 53 001007 001033 002019 002020 301011 301012 207003 004006 207000 304030 301021 007024 005021 007025 005022 008075 201133 005041 201000 005045 005043 005040 010001 201129 007002 201000 202127 201125 021166 201000 202000 008012 020010 020014 002165 033075 107003 008076 006029 006029 025140 025141 033076 033077 008076 033078 033003 104000 031002 201133 005042 201000 014044 310193 5 301250 303250 302250 303249 303251 310194 5 301250 303250 302250 303249 303252 310195 3 301250 303250 304250 310196 3 301250 303249 303251 310226 39 310022 025060 008021 301011 301012 201138 202131 004006 202000 201000 033039 033007 304030 304031 002020 001050 202127 304030 202000 304031 201133 202131 004016 202000 201000 301021 304030 010035 005021 010036 107000 031002 301021 005021 103000 031001 002121 007040 015037 311001 9 301051 007002 012001 011001 011002 011031 011032 011033 020041 311002 4 301065 301066 311003 311004 311003 5 010070 011001 011002 012001 013002 311004 18 101000 031000 011034 101000 031000 011035 101000 031000 011075 101000 031000 011076 101000 031000 033025 101000 031000 033026 311005 13 001008 001023 301021 301011 301013 007010 008009 011001 011002 011031 011036 012101 033025 311006 6 007010 011001 011002 002064 012101 012103 311007 7 007010 301021 011001 011002 002064 012101 012103 311008 8 001008 301011 301013 301021 008004 101000 031001 311006 311009 8 001008 301011 301013 301021 008004 101000 031001 311007 311193 16 301197 301011 301012 301023 008004 007004 008021 011001 011002 011031 011034 011035 012001 012003 013003 020041 312001 2 301043 304001 312002 2 301043 304002 312003 2 301042 304003 312004 2 301042 304004 312005 2 301042 020014 312006 2 301044 304005 312007 2 301042 304006 312010 6 001007 005040 002021 005041 004001 004043 312011 9 202131 201149 004006 201000 202126 010002 202000 005043 005053 312012 6 202129 201132 101019 012063 201000 202000 312013 6 005042 202129 201135 012063 201000 202000 312014 8 312010 312011 105056 301023 005042 005052 312012 312013 312015 10 109011 301023 005042 005052 202129 201132 101004 012063 202000 201000 312016 3 312010 312011 312015 312017 10 109008 301023 005042 005052 202129 201132 101003 012063 202000 201000 312018 3 312010 312011 312017 312019 13 301047 301048 015015 029002 021076 106012 201129 006030 201000 102012 005030 021075 021066 312020 11 301047 301048 015015 029002 021076 104012 006030 102012 005030 021075 021066 312021 6 301047 101003 301049 011012 011011 021067 312022 15 301047 008022 011012 011050 022070 022026 312041 010050 021068 021071 021072 021073 312042 021062 015011 312023 7 301047 103003 008022 012061 022050 021069 021085 312024 11 312020 008060 008022 008060 008022 025014 022101 022097 022098 022099 022100 312025 11 312019 008060 008022 008060 008022 025014 022101 022097 022098 022099 022100 312026 19 301046 301011 301013 301023 312031 101004 312030 021110 301023 321027 021111 301023 321027 021112 301023 321027 021113 301023 321027 312027 9 301047 105009 301023 007021 012061 007021 012061 021085 021070 312028 26 301046 301011 301013 301023 008025 201136 004006 201000 312031 312032 101004 312030 101002 312033 021110 301023 321028 021111 301023 321028 021112 301023 321028 021113 301023 321028 312030 13 201130 202129 011012 202000 201000 011052 201135 202130 011011 202000 201000 011053 021104 312031 8 005034 006034 021109 011081 011082 021101 021102 021103 312032 4 021120 021121 013055 021122 312033 4 002104 008022 012063 012065 312041 5 201141 202130 007001 201000 202000 312042 6 021077 021078 021079 021080 021081 021082 312045 21 001007 002019 001096 025061 005040 301011 301013 301021 007002 012180 012181 012182 012183 012184 012185 002174 021086 012186 021087 012187 033043 312050 23 001007 002019 001096 025061 005040 301011 301013 301021 007025 005022 010080 027080 008003 007004 013093 008003 201131 202129 007004 007004 202000 201000 013095 312051 48 001007 002019 001096 025061 005040 008075 301011 301013 301021 001012 201131 001013 201000 010032 010033 010034 007002 008012 025110 025111 025102 002104 025103 025104 025105 025106 025107 025108 002111 002121 002026 002027 021130 021131 021132 021133 021064 025014 021134 107018 005030 105024 201130 006030 201000 021135 021136 033044 312052 77 001007 002019 001096 025061 005040 025120 025121 025124 025125 025122 025123 301011 301013 301021 007002 002119 033047 010081 010082 010083 010084 002116 002117 002118 002156 002157 014055 022150 022151 022152 022153 022154 022155 022156 022157 022158 022159 021137 021138 021139 021140 021141 021142 010085 010086 010087 010088 010089 010090 010091 010092 010093 011002 025126 025127 025128 025129 025130 025131 025132 025133 025134 025135 025136 025137 013096 013097 011095 011096 012188 012189 002158 002159 033052 033053 021143 021144 312053 54 001007 002019 001096 025061 005040 008075 301011 301013 301021 001012 201131 001013 201000 010032 010033 010034 007002 008012 025110 025111 025102 002104 025103 025104 025105 025106 025107 025108 011001 011002 022160 025138 201130 202129 022021 202000 201000 033048 033049 002026 002027 021130 021131 021132 021133 025014 106036 005030 104024 201130 006030 201000 022161 033044 312055 5 005033 005040 006034 010095 021157 312056 11 025060 001032 011082 011081 020095 020096 021155 201133 021101 021102 201000 312057 12 201130 202129 011012 202000 201000 201131 202129 011011 202000 201000 021156 021104 312058 8 301125 301011 301013 301021 312055 021150 101003 321030 312059 4 312056 101000 031001 312057 312060 20 025060 025062 040001 040002 021062 021151 021152 021153 021154 021062 021062 040003 040004 040005 040006 040007 020065 040008 040009 040010 312061 3 312058 312060 312059 312070 27 001007 002019 001144 001124 030010 301011 301013 301021 007012 015012 012165 012166 012167 012168 027010 028010 002099 013048 025081 025082 025083 025084 012080 012081 012082 025174 033028 312200 10 301237 301238 029002 021206 104012 006232 102012 005232 021205 021196 312201 6 301237 101003 301239 011012 011011 021197 312202 13 301237 008022 011012 011050 301240 022243 301241 010050 021198 021201 021202 021203 301242 312203 8 301237 008022 012061 022050 021204 021199 021214 021215 312204 12 312201 001031 011012 011011 021200 021213 004004 008021 004024 055003 011012 011011 312207 3 312202 301202 033191 312208 17 301202 008022 008021 301011 301013 301023 302205 011002 001007 002021 301011 301013 301023 001032 001192 302205 011002 312209 11 301202 001192 301011 301013 301023 302206 104000 022192 102000 005232 022191 312210 13 312202 021192 015202 301011 004004 004005 201138 202131 004006 201000 202000 304228 304229 312211 19 301046 301011 301013 301023 312031 101004 312030 021110 101004 312212 021111 101004 312212 021112 101004 312212 021113 101004 312212 312212 2 301023 321027 313009 4 021001 101000 031001 021001 313010 4 021036 101000 031001 021036 313031 5 006002 006012 101000 031002 030001 313032 5 005002 005012 101000 031002 313031 313041 13 006002 110000 031001 104000 031001 006012 101000 031012 030001 006012 101000 031001 030001 313042 5 005002 005012 101000 031002 313041 313043 17 006002 005002 005012 112000 031001 110000 031001 104000 031001 006012 101000 031011 030001 006012 101000 031001 030001 315001 5 001011 301011 301012 301023 306001 315002 5 001011 301011 301012 301023 306004 315003 25 001087 001085 001086 002036 002148 002149 022055 022056 022067 301011 301012 301021 008080 033050 109000 031002 007065 008080 033050 022045 008080 033050 022064 008080 033050 316001 10 301011 004004 301023 001021 002041 019001 010051 019002 019003 019004 316002 15 008021 004001 004002 004003 004004 004005 001033 008021 004001 004002 004003 004004 004005 007002 007002 316003 12 110000 031001 008011 008007 104000 031001 005002 006002 010002 011002 008007 008011 316004 13 111000 031001 008011 008007 007002 007002 102000 031001 005002 006002 011031 008007 008011 316005 10 108000 031001 008005 008007 005002 006002 001026 019001 008007 008005 316006 14 112000 031001 008011 008007 007002 007002 102000 031001 005002 006002 020011 020012 008007 008011 316007 12 110000 031001 008011 008007 104000 031001 005002 006002 019005 019006 008007 008011 316008 13 111000 031001 008001 008007 008023 103000 031001 005002 006002 010002 008023 008007 008001 316009 13 111000 031001 008011 008007 007002 007002 102000 031001 005002 006002 020041 008007 008011 316010 9 107000 031001 008011 008007 001022 005002 006002 008007 008011 316011 19 117000 031001 008011 001022 008007 102000 031001 005002 006002 008021 004001 004002 004003 004004 004005 020090 008021 008007 008011 316020 5 001023 001025 001027 301011 301012 316021 23 301023 002041 019001 019007 019005 019006 019008 008005 010004 008005 010004 019007 008005 008021 004075 011040 019007 105004 005021 005021 102002 019003 019004 316022 24 001032 002041 019001 019010 118000 031001 008021 004014 008005 301023 019005 019006 010004 011041 008021 004075 011040 019008 105004 005021 005021 102002 019003 019004 316026 2 316020 316021 316030 10 301014 001037 010064 008019 001062 008019 001065 008019 001062 008019 316031 8 008021 301011 301012 301027 019005 019006 020028 008021 316032 5 008021 301011 301012 301027 008021 316033 7 008021 301011 301012 101000 031001 301027 008021 316034 17 008079 316030 008011 001022 008007 301023 008007 020090 316031 101000 031000 316032 101000 031001 316033 008011 008079 316035 9 008079 316030 008011 020023 020021 020008 316031 008011 008079 316036 13 008079 316030 008011 001027 316031 101000 031000 316032 101000 031001 316033 008011 008079 316037 7 008079 316030 008011 011031 316031 008011 008079 316038 8 008079 316030 008011 020041 020021 316031 008011 008079 316039 7 008079 316030 008011 020024 316031 008011 008079 316040 6 316030 008079 301014 001037 010064 008079 316050 16 301001 301011 301012 002160 008005 005002 006002 008005 019100 019005 019006 019101 019102 019103 019104 019105 316052 29 301005 301011 301012 001007 025150 122000 031001 001027 019150 019106 008005 005002 006002 008005 019107 019005 019006 019108 019109 019110 019111 019112 019113 019114 019115 019116 019117 019118 019119 318001 2 301025 024011 318003 4 301026 024005 024004 024021 318004 6 301025 004023 013011 024005 024004 024022 321001 6 002101 002114 002105 002106 002107 002121 321003 4 021051 021014 021017 021030 321004 5 301031 002003 101000 031001 321003 321005 12 025004 002121 002122 002123 002124 002125 002126 002127 002128 002129 002130 002131 321006 4 025001 025002 025003 025005 321007 8 025009 025010 025011 025012 025013 025015 025016 025017 321008 3 025006 025007 025008 321009 2 025018 025019 321010 13 002101 007002 002102 002103 002104 002105 002106 002107 002108 002109 002110 002132 002133 321011 3 030031 030032 029002 321012 3 101000 031001 002135 321021 15 002003 002101 201130 002106 201000 201132 202130 002121 202000 201000 201133 202129 025001 202000 201000 321022 11 007007 204001 031021 011001 204000 011002 204001 031021 011006 204000 021030 321023 9 007007 021091 021030 202129 021014 201129 021017 202000 201000 321024 7 007007 204001 031021 012007 011006 204000 021030 321025 17 007007 021091 021030 202129 021014 201129 021017 202000 201000 021092 021030 025092 201129 202129 021017 202000 201000 321026 10 007007 204001 031021 012007 025091 011071 011072 011073 011074 204000 321027 18 021118 202129 201132 002112 201000 201131 002111 201000 202000 002104 021105 021106 021107 021114 021115 021116 008018 021117 321028 18 021118 202129 201132 002112 201000 201131 002111 201000 202000 002104 021123 021106 021107 021114 021115 021116 008018 021117 321030 18 008085 202129 201131 002111 201000 202000 002134 021062 021063 021158 021159 021160 021161 021162 021163 021164 021165 021166 340001 45 001007 001031 002019 002020 004001 004002 004003 004004 004005 202131 201138 004006 201000 202000 005001 006001 007024 005021 007025 005022 005043 005040 201133 005041 201000 201132 025070 201000 202126 007001 202000 033060 033061 033062 033063 033064 033065 101010 340002 101087 340003 002019 025051 101007 340004 340002 3 025140 025141 025142 340003 5 104100 201136 005042 201000 014046 340004 9 005060 005061 025085 105006 005042 025142 014047 025142 014048 340005 94 001007 002019 001096 025061 005044 005040 001030 301011 301012 004007 005001 006001 008029 008074 008077 040011 025097 025095 025098 025099 021144 025096 040012 040013 021169 022151 022162 022163 025160 025133 022156 022164 022165 022166 021137 021138 022167 021139 021118 021145 021146 021147 022168 022169 022170 025161 025162 022171 022172 022173 022174 021170 021171 022175 021172 021118 021173 021174 021175 102003 002153 012063 013090 013091 007002 011097 011098 007002 011095 011096 010096 010081 010082 010083 010101 025132 025163 025126 025128 025164 010085 010097 010086 010087 010092 010088 010089 010098 010099 010090 010100 010093 025127 040014 340007 57 001007 001031 002019 002020 004001 004002 004003 004004 004005 202131 201138 004006 201000 202000 005001 006001 007024 005021 007025 005022 005043 005040 201133 005041 201000 201132 025070 201000 202126 007001 202000 103003 025140 025141 033060 033061 033062 033063 033064 033065 040020 101010 340002 101087 340003 002019 025051 101007 340004 020081 008029 020083 008029 040018 040019 040021 040022 340008 70 001007 001031 002019 002020 004001 004002 004003 004004 004005 202131 201138 004006 201000 202000 005001 006001 007024 005021 007025 005022 005043 005040 201133 005041 201000 201132 025070 201000 202126 007001 202000 103003 025140 025141 033060 033061 033062 033063 033064 033065 040020 101010 340002 104000 031002 201136 005042 201000 014046 108003 025140 025141 040015 040016 025062 101000 031002 040017 002019 025051 101007 340004 020081 008029 020083 008029 040018 040019 040021 040022 dballe-5.18/tables/Makefile.in0000644000175000017500000003250711754230756013153 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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@ 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 = tables DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_flag.m4 \ $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/python.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = 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)$(tabledir)" DATA = $(noinst_DATA) $(table_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FC = @FC@ FCFLAGS = @FCFLAGS@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBDBALLEF_VERSION_INFO = @LIBDBALLEF_VERSION_INFO@ LIBDBALLE_VERSION_INFO = @LIBDBALLE_VERSION_INFO@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LUA_CFLAGS = @LUA_CFLAGS@ LUA_LIBS = @LUA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ 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@ PKG_CONFIG = @PKG_CONFIG@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WIBBLE_CFLAGS = @WIBBLE_CFLAGS@ WIBBLE_LIBS = @WIBBLE_LIBS@ WREPORT_CFLAGS = @WREPORT_CFLAGS@ WREPORT_LIBS = @WREPORT_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ confdir = @confdir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ have_doxygen = @have_doxygen@ have_gperf = @have_gperf@ have_latex2html = @have_latex2html@ have_rst2html = @have_rst2html@ have_swig = @have_swig@ 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@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ tabledir = @tabledir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ crexbtables = B990203.txt B990204.txt B000299.txt crexdtables = D990203.txt D990204.txt D000299.txt bufrbtables = B000000002001200.txt \ B000000002001400.txt \ B0000000000200014001.txt bufrdtables = D000000002001200.txt \ D000000002001400.txt \ D0000000000200014001.txt table_DATA = repinfo.csv dballe.txt $(crexbtables) $(crexdtables) $(bufrbtables) $(bufrdtables) noinst_DATA = dballe.tex EXTRA_DIST = $(table_DATA) mkbdoc 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) --foreign tables/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign tables/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): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-tableDATA: $(table_DATA) @$(NORMAL_INSTALL) test -z "$(tabledir)" || $(MKDIR_P) "$(DESTDIR)$(tabledir)" @list='$(table_DATA)'; test -n "$(tabledir)" || list=; \ 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)$(tabledir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(tabledir)" || exit $$?; \ done uninstall-tableDATA: @$(NORMAL_UNINSTALL) @list='$(table_DATA)'; test -n "$(tabledir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(tabledir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: ctags: CTAGS CTAGS: 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 $(DATA) installdirs: for dir in "$(DESTDIR)$(tabledir)"; 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 clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-local dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-tableDATA 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 mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-tableDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distclean-local \ 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-pdf install-pdf-am install-ps install-ps-am \ install-strip install-tableDATA installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am uninstall uninstall-am uninstall-tableDATA dballe.tex: dballe.txt mkbdoc $(srcdir)/mkbdoc tex < $< > $@ B000000002001400.txt: dballe.txt cut -b 1-119 < $< > $@ B0000000000200014001.txt: dballe.txt cut -b 1-119 < $< > $@ B990204.txt: dballe.txt cp $< $@ B000299.txt: dballe.txt cp $< $@ distclean-local: rm -f dballe.tex # 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: dballe-5.18/tables/repinfo.csv0000644000175000017500000000056311254256236013256 0000000000000001,synop,synop,101,oss,0 02,metar,metar,81,oss,0 03,temp,sounding,98,oss,2 04,pilot,wind profile,80,oss,2 09,buoy,buoy,50,oss,31 10,ship,synop ship,99,oss,1 11,tempship,temp ship,100,oss,2 12,airep,airep,82,oss,4 13,amdar,amdar,97,oss,4 14,acars,acars,96,oss,4 42,pollution,pollution,199,oss,8 200,satellite,NOAA satellites,41,oss,255 255,generic,generic data,1000,?,255 dballe-5.18/tables/D000000002001400.txt0000644000175000017500000025404011432536576013361 00000000000000 300002 2 000002 000003 300003 3 000010 000011 000012 300004 9 300003 000013 000014 000015 000016 000017 000018 000019 000020 300010 4 300003 101000 031001 000030 301001 2 001001 001002 301002 3 001003 001004 001005 301003 3 001011 001012 001013 301004 4 001001 001002 001015 002001 301005 2 001035 001034 301011 3 004001 004002 004003 301012 2 004004 004005 301013 3 004004 004005 004006 301014 3 102002 301011 301012 301021 2 005001 006001 301022 3 005001 006001 007001 301023 2 005002 006002 301024 3 005002 006002 007001 301025 3 301023 004003 301012 301026 7 301021 004003 004003 004004 004004 004005 004005 301027 5 008007 101000 031001 301028 008007 301028 8 008040 033042 007010 101000 031002 301023 019007 008040 301031 5 301001 002001 301011 301012 301022 301032 5 301001 002001 301011 301012 301024 301033 5 001005 002001 301011 301012 301021 301034 5 001005 002001 301011 301012 301023 301035 7 001005 001012 001013 002001 301011 301012 301023 301036 5 301003 002001 301011 301012 301023 301037 6 301001 002011 002012 301011 301012 301022 301038 6 301001 002011 002012 301011 301012 301024 301039 6 301003 002011 002012 301011 301012 301023 301040 6 301003 002011 002012 301011 301012 301024 301041 5 001007 002021 002022 301011 301012 301042 2 301041 301021 301043 5 001007 002023 301011 301013 301021 301044 5 001007 002024 301011 301013 301021 301045 9 301011 301012 201138 202131 004006 201000 202000 304030 304031 301046 10 001007 001012 002048 021119 025060 202124 002026 002027 202000 005040 301047 15 001007 025060 001033 001034 001012 301045 002021 301011 301012 201138 202131 004006 201000 202000 301023 301048 14 002104 002121 002113 002026 002027 002111 002140 202127 001013 202126 007001 202000 025010 021064 301049 5 002111 002112 021062 021063 021065 301051 6 001006 002061 301011 301012 301021 008004 301055 7 001005 002001 301011 301012 301021 001012 001014 301062 3 101000 031001 301001 301065 8 001006 001008 002001 002002 002005 002062 002070 002065 301066 6 301011 301013 301023 007004 002064 008004 301070 3 002143 002142 002144 301071 5 001007 001031 002020 002028 002029 301072 4 301071 301011 301013 301021 301074 4 002143 002142 002145 002146 301075 6 301001 001015 301024 008021 301011 301012 301076 3 002011 002143 002142 301090 6 301004 301011 301012 301021 007030 007031 301091 10 002180 002181 002182 002183 002184 002179 002186 002187 002188 002189 301092 9 001011 001003 002001 301011 301012 301021 007030 007031 033024 301093 3 301036 007030 007031 301110 5 301001 001011 002011 002014 002003 301111 6 301001 001011 002011 002013 002014 002003 301112 5 001006 002011 002013 002014 002003 301113 3 008021 301011 301013 301114 5 301021 007030 007031 007007 033024 301120 4 301001 001094 002011 301121 301121 5 008041 301122 301021 007031 007007 301122 7 301011 301012 201135 202130 004006 202000 201000 301123 33 102002 008041 001062 301001 001094 002011 001018 001095 025061 025068 001082 001083 001081 002067 002066 002014 025067 025065 025066 002095 002096 002097 002016 002083 002080 002081 001093 002084 002085 002086 002082 008041 301011 301125 6 001033 001034 025060 001007 002019 001012 301193 5 001007 001031 002196 002221 002222 301194 9 001194 001012 001013 002011 002012 301011 301012 301023 007001 301195 9 001195 001012 001013 002011 002012 301011 301012 301023 007001 301196 7 301003 002011 002012 301011 301012 301023 007001 301197 9 001006 001008 002061 002062 002002 002005 002070 002063 002001 301198 9 001011 001012 001013 002011 002012 301011 301012 301023 007001 301200 2 001032 033194 301201 2 101003 033193 301202 2 001031 001032 301237 12 001007 001012 002021 301011 004004 004005 201138 202131 004006 201000 202000 301023 301238 14 002104 002121 002113 002026 002027 002111 002192 202127 001013 202126 007001 202000 025010 021194 301239 5 002111 002112 021192 021193 021195 301240 5 201131 202129 022021 201000 202000 301241 5 201141 202130 007001 201000 202000 301242 6 021207 021208 021209 021210 021211 021212 301250 4 301193 301011 301013 301021 302001 4 010004 010051 010061 010063 302002 5 010004 007004 010003 010061 010063 302003 9 011011 011012 012004 012006 013003 020001 020003 020004 020005 302004 7 020010 008002 020011 020013 020012 020012 020012 302005 4 008002 020011 020012 020013 302006 4 010004 010051 010062 010063 302011 3 302001 302003 302004 302012 3 302002 302003 302004 302013 5 302006 302003 101000 031001 302005 302021 3 022001 022011 022021 302022 3 022002 022012 022022 302023 3 022003 022013 022023 302024 3 302022 101002 302023 302031 4 302001 010062 007004 010009 302032 4 007032 012101 012103 013003 302033 2 007032 020001 302034 2 007032 013023 302035 8 302032 302033 302034 007032 302004 101000 031001 302005 302036 7 105000 031001 008002 020011 020012 020014 020017 302037 3 020062 013013 012113 302038 4 020003 004024 020004 020005 302039 2 004024 014031 302040 4 007032 102002 004024 013011 302041 7 007032 004024 004024 012111 004024 004024 012112 302042 11 007032 002002 008021 004025 011001 011002 008021 103002 004025 011043 011041 302043 7 302038 101002 302039 302040 302041 302042 007032 302044 3 004024 002004 013033 302045 7 004024 014002 014004 014016 014028 014029 014030 302046 3 004024 004024 012049 302047 3 102003 008002 020054 302048 5 005021 007021 020012 005021 007021 302049 7 008002 020011 020013 020012 020012 020012 008002 302050 31 008041 005021 007005 202130 006021 202000 008041 201131 202129 002115 010004 002115 013003 202000 201000 002115 011001 011002 002115 102002 012101 004024 002115 012103 012102 101003 020012 020011 020013 101002 020003 302051 12 010004 010051 007004 010003 012004 012051 012016 012017 013004 102004 008051 008020 302052 7 007032 007033 012101 002039 012102 012103 013003 302053 3 007032 007033 020001 302054 9 302052 302053 007033 302034 007032 302004 101000 031001 302005 302055 8 020031 020032 020033 020034 020035 020036 020037 020038 302056 4 002038 007063 022043 007063 302057 3 302056 302021 302024 302058 8 007032 007033 004024 004024 012111 004024 004024 012112 302059 12 007032 007033 002002 008021 004025 011001 011002 008021 103002 004025 011043 011041 302060 4 302038 302040 302058 302059 302062 24 302001 302052 302053 007033 101000 031000 302034 007032 101000 031001 302005 008002 101000 031000 302055 101000 031000 302056 101000 031000 302021 101000 031000 302024 302063 8 302038 101000 031000 302040 101000 031000 302058 302059 302066 16 020023 020024 020027 020054 020023 020027 020054 020025 020026 020027 020040 020066 020027 020021 020067 020027 302069 4 007032 007033 033041 020001 302070 8 007032 007033 011001 011002 011043 011041 011016 011017 302071 14 007032 007033 008021 004025 011001 011002 008021 103002 004025 011043 011041 004025 011016 011017 302072 5 007032 007033 012101 012103 013003 302073 7 020010 105004 008002 020011 020012 033041 020013 302074 4 020003 004025 020004 020005 302075 5 008021 004025 013055 013058 008021 302076 7 020021 020022 026020 020023 020024 020025 020026 302077 8 007032 007033 004025 012111 012112 007032 004025 012112 302078 4 002176 020062 002177 013013 302079 5 007032 002175 002178 004025 013011 302080 3 002185 004025 013033 302081 2 004025 014031 302082 7 004025 014002 014004 014016 014028 014029 014030 302083 8 004025 008023 010004 011001 011002 012101 013003 008023 302205 5 201131 202129 022021 201000 202000 302206 9 302205 201130 202129 022011 201000 202000 022001 011001 011002 302207 5 022193 022194 022195 022196 022197 302250 5 102000 031001 020193 020194 020012 303001 3 007003 011001 011002 303002 3 007004 011001 011002 303003 4 007004 010003 012001 012003 303004 6 007004 010003 012001 012003 011001 011002 303011 4 007003 008001 011001 011002 303012 4 007004 008001 011001 011002 303013 7 007004 008001 010003 012001 013003 011001 011002 303014 7 007004 008001 010003 012001 012003 011001 011002 303021 4 007004 007004 204007 031021 303022 3 303021 010003 204000 303023 3 303021 012001 204000 303024 3 303021 013016 204000 303025 5 002025 204007 031021 012063 204000 303026 6 007004 008003 204007 031021 012001 204000 303027 5 007004 204007 031021 010003 204000 303031 6 007004 008003 007021 007022 008012 012061 303032 2 020011 020016 303033 2 020010 020016 303040 18 008041 004025 004026 301021 301122 201131 202129 025069 007004 013003 202000 201000 002013 012101 010009 102002 008040 035035 303041 8 002152 002023 007004 011001 011002 002153 002154 012071 303050 7 004086 008042 007004 005015 006015 011001 011002 303051 7 004086 008042 007004 005015 006015 011061 011062 303052 7 004086 008042 007009 005015 006015 011001 011002 303053 7 004086 008042 007009 005015 006015 011061 011062 303054 10 004086 008042 007004 010009 005015 006015 012101 012103 011001 011002 303249 7 002252 104000 031001 002199 007004 007004 013003 303250 8 002252 002023 007004 011001 011002 002197 002198 012193 303251 8 002252 105000 031001 002254 002251 002197 002198 012063 303252 8 002252 105000 031001 002254 002251 002197 002198 012194 304001 5 008003 010004 012001 011001 011002 304002 4 008003 010004 011001 011002 304003 2 008003 012001 304004 4 008003 010004 020010 012001 304005 4 002024 007004 007004 013003 304006 3 014001 014001 014003 304011 27 002163 002164 008012 007024 002057 008021 004001 004002 004003 004004 008021 004024 110004 008021 004004 004005 004006 008021 004004 004005 004006 011001 011002 103010 002163 007004 012001 304030 3 027031 028031 010031 304031 3 001041 001042 001043 304032 5 002153 002154 020081 020082 020012 304033 8 002152 002166 002167 002153 002154 012075 012076 012063 304034 9 102004 027001 028001 007022 005043 020010 020016 033003 010040 304035 15 002153 002154 012063 008001 012063 008001 012063 008001 008003 012063 008003 012063 008003 012063 008003 304036 12 020082 008012 020082 008012 020081 008003 020081 008003 020081 008003 020081 008003 304228 3 005217 006217 007217 304229 3 001208 001209 001210 304250 27 002231 002232 008012 007024 002057 008021 004001 004002 004003 004004 008021 004024 110004 008021 004004 004005 004006 008021 004004 004005 004006 011001 011002 103010 002231 007004 012001 305003 5 301012 004065 101000 031001 305001 305006 6 013072 013082 013019 012001 013073 013060 305007 6 301029 301012 004065 101000 031001 305006 305008 2 305006 012030 305009 6 301029 301012 004065 101000 031001 305008 305011 6 301029 301012 004065 101000 031001 305010 305018 8 301029 301012 004065 103000 031001 305008 305016 305017 306001 5 002032 102000 031001 007062 022042 306002 3 002031 022004 022031 306003 4 002002 011011 011012 012004 306004 7 002032 002033 103000 031001 007062 022043 022062 306005 6 002031 103000 031001 007062 022004 022031 306006 3 306003 306002 022063 306007 6 001012 001014 306008 004024 027003 028003 306008 3 002034 002035 002036 306019 8 001075 301011 301012 022042 022120 022121 004015 004065 306020 4 306024 102006 022038 022039 306021 7 001075 301011 301012 022122 022123 012001 303002 306022 5 001075 301011 301012 022038 022039 306023 8 001015 301023 301011 301012 022038 022039 022120 022121 306024 8 001075 301011 301012 022042 022120 022121 004025 004015 306025 4 306019 102006 022038 022039 307001 2 301031 302011 307002 2 301032 302011 307003 4 307001 101000 031001 302005 307004 4 307002 101000 031001 302005 307005 3 307001 101004 302005 307006 3 307002 101004 302005 307007 2 301031 302012 307008 2 301032 302012 307009 2 301031 302013 307011 16 001063 002001 301011 301012 301024 007006 011001 011016 011017 011002 011041 007006 012001 012003 010052 020009 307012 5 103000 031001 008023 005021 020001 307013 8 106000 031001 001064 008014 020061 008014 020061 020018 307014 3 101000 031001 020019 307015 4 101000 031001 302005 020002 307016 3 101000 031001 020020 307017 3 101000 031001 011070 307018 16 008016 102000 031001 008017 301012 104000 031001 007006 011001 011002 011041 020009 101000 031001 020001 307014 307020 3 307011 307014 307016 307021 9 307011 307012 307013 307014 307015 307016 307017 307018 307015 307022 31 001015 301011 301012 301022 008021 004025 010004 012001 013003 033038 008022 106025 002020 001050 005021 007021 015031 015032 008060 015033 015034 008060 015033 015034 015035 201131 202129 013016 202000 201000 015011 307030 2 015001 015002 307031 7 008022 008023 015001 008023 015001 008023 015002 307041 7 301001 001015 301022 301011 301012 301070 307030 307042 9 301001 001015 301022 301011 301012 008021 004025 301070 307031 307043 7 301001 001015 301024 301011 301012 301074 307030 307045 25 001063 008079 002001 301011 301012 301024 007032 011001 011016 011017 008054 011083 011084 011002 008054 011085 011086 011041 008054 007032 012023 012024 007032 010052 020009 307046 5 020060 Metar/speci visibility 102000 031001 005021 020059 307047 9 105000 Metar/speci clouds 031001 008002 020011 020012 020013 020092 020002 020091 307048 25 008016 102000 031001 008017 301012 112000 031000 007032 011001 008054 011083 011084 011002 008054 011085 011086 011041 008054 007032 020009 101000 031000 020060 307014 307047 307049 4 102000 031000 022043 022021 307050 14 101000 031000 020085 102000 031001 001064 020085 105000 031001 001064 020086 020087 020088 020089 307059 12 307045 Full METAR/SPECI 307046 307013 307014 307047 307016 307017 307049 307050 101000 031001 307048 Trend forecast 307052 12 001063 008039 301011 301012 008079 008039 301011 start of forecast 301012 008039 301011 end of forecast 301012 301024 307053 16 007032 011001 008054 011083 011084 011002 008054 011085 011086 011041 008054 007032 020009 020060 307014 307047 307054 13 007032 008039 004003 004004 008023 012023 008039 004003 004004 008023 012023 008023 007032 307055 9 033045 008016 008039 004003 301012 008039 004003 301012 307053 307056 6 307052 Aerodrome forecast 307053 307054 101000 031001 307055 307059 12 307045 Full METAR/SPECI 307046 307013 307014 307047 307016 307017 307049 307050 101000 031001 307048 Trend forecast 307060 2 007061 012030 307061 3 301031 101005 307060 307062 3 301032 101005 307060 307063 2 007061 012130 307071 67 301090 004074 004023 008023 010004 010051 007004 010009 007032 012101 002051 004051 012118 004052 012119 013004 008023 012151 007032 102005 008050 008020 014032 014033 008050 008020 102018 008052 008022 007032 008053 004003 012152 008053 004003 012153 008053 004003 008023 012101 008053 004003 008023 012101 008023 007032 002002 008053 004003 011046 008053 004003 004004 004023 007032 013060 013051 004053 008050 008020 102006 008052 008022 008053 004003 013052 007032 307072 38 004001 004001 004002 004003 004004 004074 004022 008023 010004 010051 007004 010009 007032 012101 002051 004051 012118 004052 012119 013004 012151 007032 014032 008023 004001 004001 004002 004003 004004 004022 007032 008023 013060 004053 008023 102008 008050 008020 307073 2 307071 307072 307079 30 301090 SYNOP data and marine data from costal stations 302031 302035 302036 101000 031000 302047 008002 101000 031000 302048 302037 102000 031000 022061 020058 101000 031000 302056 101000 031000 302055 302043 302044 101000 031001 302045 101000 031000 302046 307080 13 301090 BUFR template for synoptic reports 302031 302035 302036 302047 008002 302048 302037 302043 302044 101002 302045 302046 307081 24 301090 BUFR template for synoptic reports RA I 302031 302035 302036 302047 008002 302048 302037 012122 013056 013057 020101 020102 020103 020104 020105 020106 020107 020108 302043 302044 101002 302045 302046 307082 15 301090 BUFR template for synoptic reports RA II 302031 302035 302036 302047 008002 302048 302037 012121 012122 302043 302044 101002 302045 302046 307083 14 301090 BUFR template for synoptic reports RA III 302031 302035 302036 302047 008002 302048 302037 012122 302043 302044 101002 302045 302046 307084 17 301090 BUFR template for synoptic reports RA IV 302031 302035 302036 302047 008002 302048 302037 020055 101000 031000 205001 302043 302044 101002 302045 302046 307086 11 301090 BUFR template for synoptic reports RA VI 302031 302035 302036 008002 302037 302066 302043 302044 101002 302045 307090 13 301092 BUFR template for synoptic reports from mobile land stations 302031 302035 302036 302047 008002 302048 302037 302043 302044 101002 302045 302046 307091 66 301089 301090 008010 301091 302001 007004 010009 302072 103000 031000 101005 307063 007061 101000 031000 302069 007032 007033 105000 031000 020031 020032 002038 022043 302021 101000 031000 302078 101000 031000 302073 101000 031000 302074 101000 031000 302075 102000 031000 004025 302076 302071 302077 007033 101000 031000 302079 007032 101000 031000 302080 101000 031000 302081 101000 031000 302082 102000 031000 004025 013059 101000 031000 302083 033005 033006 307092 62 301089 Surface obs drom N-minute period 301090 008010 301091 004015 004065 125000 031001 010004 302070 302072 007032 012101 103000 031000 101005 307063 007061 101000 031000 302069 007032 007033 101000 031000 302073 101000 031000 302076 102000 031000 013055 013058 102000 031000 020031 020032 101000 031000 302078 102000 031000 302079 007032 101000 031000 302080 101000 031000 302081 101000 031000 302083 102000 031000 004025 013059 101000 031000 302083 033005 033006 308001 3 301033 302011 022042 308002 3 301034 302011 022042 308003 3 301035 302011 022042 308004 3 301036 302011 022042 308005 2 308004 302024 308006 8 010004 010061 010063 011001 011002 012004 013003 022042 308007 4 301055 302011 007062 022042 308008 84 001003 BUOY 001020 001005 002001 002036 002149 301011 301012 008021 301011 301012 008021 301021 027004 028004 007030 001051 002148 001012 001014 002040 033022 033023 033027 022063 302021 302022 302023 008081 025026 008081 025026 008081 025026 008081 002034 022060 007070 002190 025086 002035 002168 020031 002038 306004 002030 306005 007031 008081 012064 302001 008081 007032 007033 012101 012103 013003 007032 007033 008082 007033 002169 002002 008021 004025 011001 011002 008021 004025 011043 011041 008082 007033 007032 004024 013011 007032 008021 004024 014021 008021 025028 025028 025028 308009 7 301093 302001 302054 008002 302055 302057 302060 308010 16 001011 TRACKOB template 113000 031001 301011 301012 301021 004080 022049 004080 022059 004080 022005 002042 022032 002042 004080 308011 27 001011 Climat ship 002001 301011 301012 301023 007030 007031 004074 004023 008023 010051 007032 007033 012101 013004 007032 007033 302056 008023 004003 004004 004023 007032 013060 013051 004053 007032 308012 28 004001 Monthly normals from an ocean weather station 004001 004002 004003 004004 004074 004022 008023 010051 007032 007033 012101 013002 007032 007033 302056 008023 004001 004001 004002 004003 004004 004022 007032 008023 013060 004053 008023 308013 2 308011 308012 309001 4 301037 101000 031001 303011 309002 4 301038 101000 031001 303011 309003 4 301037 101000 031001 303012 309004 4 301038 101000 031001 303012 309005 5 301037 302004 101000 031001 303013 309006 5 301038 302004 101000 031001 303013 309007 5 301037 302004 101000 031001 303014 309008 5 301038 302004 101000 031001 303014 309011 4 301039 101000 031001 303011 309012 4 301039 101000 031001 303012 309013 5 301039 302004 101000 031001 303013 309014 5 301039 302004 101000 031001 303014 309015 4 301040 101000 031001 303011 309016 4 301040 101000 031001 303012 309017 5 301040 302004 101000 031001 303013 309018 5 301040 302004 101000 031001 303014 309019 5 301031 002003 101000 031001 303011 309020 8 301031 002003 104000 031001 007003 011003 011004 011005 309030 8 015004 015005 104000 031001 004015 008006 007004 015003 309031 8 015004 015005 104000 031001 004025 008006 007004 015003 309040 3 301075 301076 309030 309042 4 307042 301075 301076 309030 309050 9 301110 301113 301114 101000 031002 303050 101000 031001 303051 309051 9 301110 301113 301114 101000 031002 303052 101000 031001 303053 309052 11 301111 301113 301114 302049 022043 101000 031002 303054 101000 031001 303051 309053 9 301112 301113 301114 101000 031002 303054 101000 031001 303051 309054 27 301001 001011 301011 301012 301021 007030 007031 007007 004023 004059 115000 031001 008001 008023 007004 010009 012101 012103 008023 011001 011002 008023 011019 008050 008020 008050 008020 309060 4 301123 301121 302050 303040 309061 21 301120 008041 301122 201131 202129 025069 007004 202000 201000 033007 033035 033015 013009 033007 033035 033015 002013 012101 033007 033035 033015 309062 19 301120 008041 301122 005001 033035 033015 006001 033035 033015 007007 033035 033015 011003 033035 033015 011004 033035 033015 033007 309063 19 301120 008041 301122 005001 033035 033015 006001 033035 033015 007007 033035 033015 011003 033035 033015 011004 033035 033015 033007 309064 26 301120 008041 301122 201131 202129 104002 025069 007004 033035 033015 013003 033035 033015 202000 201000 104002 002013 012101 033035 033015 012103 033035 033015 010009 033035 033015 309065 18 301120 008041 301122 005001 033035 033015 006001 033035 033015 007007 033035 033015 011003 033035 033015 011004 033035 033015 309066 18 301120 008041 301122 008040 201131 202129 025069 007004 013003 202000 201000 002013 012101 012103 010009 010007 011002 011001 309194 5 301194 302004 101000 031001 303014 309195 5 301195 302004 101000 031001 303014 309196 5 301196 302004 101000 031001 303014 309198 5 301198 302004 101000 031001 303014 310001 5 301042 303031 303032 101026 303025 310002 5 301042 303031 303032 101009 303023 310003 5 301042 303031 303032 101006 303023 310004 5 301042 303031 303032 101003 303024 310005 6 301042 303031 303033 101000 031001 303025 310006 6 301042 303031 303033 101000 031001 303023 310007 6 301042 303031 303033 101000 031001 303024 310008 8 310011 101019 310012 002150 025079 025080 033032 014045 310009 3 310011 101015 310012 310010 3 310011 101005 310012 310011 45 008070 001033 001034 008070 001033 001034 001007 002048 005040 025075 201133 005041 201000 005043 025070 033030 033031 004001 004002 004003 004004 004005 202131 201138 004006 201000 202000 005001 006001 202126 007001 202000 007024 005021 007025 005022 033033 002151 012064 002151 012064 002151 012064 002151 012064 310012 10 002150 025076 025077 025078 033032 201132 202129 012063 202000 201000 310013 62 001007 005040 004001 004002 004003 004004 004005 004006 005001 006001 007025 005043 025085 201131 202129 002150 008023 008072 014027 008072 014027 002150 008023 008072 014027 008072 014027 002150 008023 008072 014027 008072 014027 202000 201000 201132 202129 002150 008023 008072 012063 008072 012063 002150 008023 008072 012063 008072 012063 008023 008072 012063 008072 012063 002150 008023 008072 012063 008072 012063 202000 201000 310014 3 301072 303041 304011 310015 13 301072 007024 010002 303041 101003 304032 002152 002024 007004 007004 013003 101003 304033 310016 13 301072 007024 010002 303041 101012 304032 002152 002024 007004 007004 013003 101012 304033 310019 68 001007 002019 301011 301013 301023 007025 008021 007025 008021 007025 008021 008029 005040 008075 008003 010004 008003 207002 015001 207000 033070 015030 207002 020081 207000 008003 033042 007004 207002 015001 207000 008003 113021 007004 007004 207002 008021 015005 008021 015005 033007 207000 008026 101020 025143 008026 008043 109015 007004 008090 207006 015008 207000 008090 207002 033007 207000 008043 033071 108008 202124 201107 002071 201000 202000 207002 020081 207000 310020 6 310022 301011 301013 301021 304034 310021 310021 10 108000 031001 201131 202129 007004 007004 202000 201000 015020 010002 310022 4 001007 002019 001033 002172 310023 17 301072 030021 030022 008012 007024 007025 010002 101012 304032 105002 002152 002024 007004 007004 013003 101012 304033 310024 17 301072 030021 030022 008012 007024 007025 010002 101003 304032 105002 002152 002024 007004 007004 013003 101003 304033 310025 61 001007 008021 004001 004002 004003 004004 004005 201138 202131 004006 202000 201000 201132 005041 201000 201129 005043 201000 005002 006002 013040 020029 104024 005042 012163 021083 021084 115003 004001 004002 004003 201142 202131 004026 202000 201000 005001 006001 201138 202129 007001 202000 201000 008021 004001 004002 004003 004004 004005 005040 101003 012070 025054 101004 025055 008007 104028 005002 006002 002111 005021 310026 82 310022 025060 008021 301011 301012 201138 202131 004006 202000 201000 033039 033007 304030 304031 002020 001050 202127 304030 202000 304031 201133 202131 004016 202000 201000 301021 304030 010035 005021 010036 113000 031002 301021 005021 108000 031001 002121 007040 015037 008023 201125 015037 201000 008023 033007 108000 031002 007007 015036 008023 201123 015036 201000 008023 033007 116000 031002 007009 010004 012001 013001 008023 201120 010004 201000 201122 012001 201000 201123 013001 201000 008023 033007 008003 007009 010004 008023 201120 010004 201000 008023 033007 310027 12 301071 301011 301013 301021 030021 030022 010002 304036 002152 002167 101011 304035 310029 12 110000 031001 201138 202130 007004 007004 202000 201000 015020 010002 012101 013098 310030 6 310022 301011 301013 301021 304034 310029 310050 14 310051 310052 101000 031002 310053 101004 310054 020010 310052 101015 310053 310052 101005 310053 310051 16 001007 005040 201133 005041 201000 201132 025070 201000 202126 007001 202000 007025 005022 102009 002151 012064 310052 12 002019 301011 301012 202131 201138 004006 201000 202000 301021 007024 005021 005043 310053 6 201134 005042 201000 025076 033032 012163 310054 13 201134 005042 201000 025076 033032 201131 202129 102002 008023 014027 008023 202000 201000 310055 8 310051 310052 102020 025076 025052 101000 031002 025050 310060 53 001007 001033 002019 002020 301011 301012 207003 004006 207000 304030 301021 007024 005021 007025 005022 008075 201133 005041 201000 005045 005043 005040 010001 201129 007002 201000 202127 201125 021166 201000 202000 008012 020010 020014 002165 033075 107003 008076 006029 006029 025140 025141 033076 033077 008076 033078 033003 104000 031002 201133 005042 201000 014044 310193 5 301250 303250 302250 303249 303251 310194 5 301250 303250 302250 303249 303252 310195 3 301250 303250 304250 310196 3 301250 303249 303251 310226 39 310022 025060 008021 301011 301012 201138 202131 004006 202000 201000 033039 033007 304030 304031 002020 001050 202127 304030 202000 304031 201133 202131 004016 202000 201000 301021 304030 010035 005021 010036 107000 031002 301021 005021 103000 031001 002121 007040 015037 311001 9 301051 007002 012001 011001 011002 011031 011032 011033 020041 311002 4 301065 301066 311003 311004 311003 5 010070 011001 011002 012001 013002 311004 18 101000 031000 011034 101000 031000 011035 101000 031000 011075 101000 031000 011076 101000 031000 033025 101000 031000 033026 311005 13 001008 001023 301021 301011 301013 007010 008009 011001 011002 011031 011036 012101 033025 311006 6 007010 011001 011002 002064 012101 012103 311007 7 007010 301021 011001 011002 002064 012101 012103 311008 8 001008 301011 301013 301021 008004 101000 031001 311006 311009 8 001008 301011 301013 301021 008004 101000 031001 311007 311193 16 301197 301011 301012 301023 008004 007004 008021 011001 011002 011031 011034 011035 012001 012003 013003 020041 312001 2 301043 304001 312002 2 301043 304002 312003 2 301042 304003 312004 2 301042 304004 312005 2 301042 020014 312006 2 301044 304005 312007 2 301042 304006 312010 6 001007 005040 002021 005041 004001 004043 312011 9 202131 201149 004006 201000 202126 010002 202000 005043 005053 312012 6 202129 201132 101019 012063 201000 202000 312013 6 005042 202129 201135 012063 201000 202000 312014 8 312010 312011 105056 301023 005042 005052 312012 312013 312015 10 109011 301023 005042 005052 202129 201132 101004 012063 202000 201000 312016 3 312010 312011 312015 312017 10 109008 301023 005042 005052 202129 201132 101003 012063 202000 201000 312018 3 312010 312011 312017 312019 13 301047 301048 015015 029002 021076 106012 201129 006030 201000 102012 005030 021075 021066 312020 11 301047 301048 015015 029002 021076 104012 006030 102012 005030 021075 021066 312021 6 301047 101003 301049 011012 011011 021067 312022 15 301047 008022 011012 011050 022070 022026 312041 010050 021068 021071 021072 021073 312042 021062 015011 312023 7 301047 103003 008022 012061 022050 021069 021085 312024 11 312020 008060 008022 008060 008022 025014 022101 022097 022098 022099 022100 312025 11 312019 008060 008022 008060 008022 025014 022101 022097 022098 022099 022100 312026 19 301046 301011 301013 301023 312031 101004 312030 021110 301023 321027 021111 301023 321027 021112 301023 321027 021113 301023 321027 312027 9 301047 105009 301023 007021 012061 007021 012061 021085 021070 312028 26 301046 301011 301013 301023 008025 201136 004006 201000 312031 312032 101004 312030 101002 312033 021110 301023 321028 021111 301023 321028 021112 301023 321028 021113 301023 321028 312030 13 201130 202129 011012 202000 201000 011052 201135 202130 011011 202000 201000 011053 021104 312031 8 005034 006034 021109 011081 011082 021101 021102 021103 312032 4 021120 021121 013055 021122 312033 4 002104 008022 012063 012065 312041 5 201141 202130 007001 201000 202000 312042 6 021077 021078 021079 021080 021081 021082 312045 21 001007 002019 001096 025061 005040 301011 301013 301021 007002 012180 012181 012182 012183 012184 012185 002174 021086 012186 021087 012187 033043 312050 23 001007 002019 001096 025061 005040 301011 301013 301021 007025 005022 010080 027080 008003 007004 013093 008003 201131 202129 007004 007004 202000 201000 013095 312051 48 001007 002019 001096 025061 005040 008075 301011 301013 301021 001012 201131 001013 201000 010032 010033 010034 007002 008012 025110 025111 025102 002104 025103 025104 025105 025106 025107 025108 002111 002121 002026 002027 021130 021131 021132 021133 021064 025014 021134 107018 005030 105024 201130 006030 201000 021135 021136 033044 312052 77 001007 002019 001096 025061 005040 025120 025121 025124 025125 025122 025123 301011 301013 301021 007002 002119 033047 010081 010082 010083 010084 002116 002117 002118 002156 002157 014055 022150 022151 022152 022153 022154 022155 022156 022157 022158 022159 021137 021138 021139 021140 021141 021142 010085 010086 010087 010088 010089 010090 010091 010092 010093 011002 025126 025127 025128 025129 025130 025131 025132 025133 025134 025135 025136 025137 013096 013097 011095 011096 012188 012189 002158 002159 033052 033053 021143 021144 312053 54 001007 002019 001096 025061 005040 008075 301011 301013 301021 001012 201131 001013 201000 010032 010033 010034 007002 008012 025110 025111 025102 002104 025103 025104 025105 025106 025107 025108 011001 011002 022160 025138 201130 202129 022021 202000 201000 033048 033049 002026 002027 021130 021131 021132 021133 025014 106036 005030 104024 201130 006030 201000 022161 033044 312055 5 005033 005040 006034 010095 021157 312056 11 025060 001032 011082 011081 020095 020096 021155 201133 021101 021102 201000 312057 12 201130 202129 011012 202000 201000 201131 202129 011011 202000 201000 021156 021104 312058 8 301125 301011 301013 301021 312055 021150 101003 321030 312059 4 312056 101000 031001 312057 312060 20 025060 025062 040001 040002 021062 021151 021152 021153 021154 021062 021062 040003 040004 040005 040006 040007 020065 040008 040009 040010 312061 3 312058 312060 312059 312070 27 001007 002019 001144 001124 030010 301011 301013 301021 007012 015012 012165 012166 012167 012168 027010 028010 002099 013048 025081 025082 025083 025084 012080 012081 012082 025174 033028 312200 10 301237 301238 029002 021206 104012 006232 102012 005232 021205 021196 312201 6 301237 101003 301239 011012 011011 021197 312202 13 301237 008022 011012 011050 301240 022243 301241 010050 021198 021201 021202 021203 301242 312203 8 301237 008022 012061 022050 021204 021199 021214 021215 312204 12 312201 001031 011012 011011 021200 021213 004004 008021 004024 055003 011012 011011 312207 3 312202 301202 033191 312208 17 301202 008022 008021 301011 301013 301023 302205 011002 001007 002021 301011 301013 301023 001032 001192 302205 011002 312209 11 301202 001192 301011 301013 301023 302206 104000 022192 102000 005232 022191 312210 13 312202 021192 015202 301011 004004 004005 201138 202131 004006 201000 202000 304228 304229 312211 19 301046 301011 301013 301023 312031 101004 312030 021110 101004 312212 021111 101004 312212 021112 101004 312212 021113 101004 312212 312212 2 301023 321027 313009 4 021001 101000 031001 021001 313010 4 021036 101000 031001 021036 313031 5 006002 006012 101000 031002 030001 313032 5 005002 005012 101000 031002 313031 313041 13 006002 110000 031001 104000 031001 006012 101000 031012 030001 006012 101000 031001 030001 313042 5 005002 005012 101000 031002 313041 313043 17 006002 005002 005012 112000 031001 110000 031001 104000 031001 006012 101000 031011 030001 006012 101000 031001 030001 315001 5 001011 301011 301012 301023 306001 315002 5 001011 301011 301012 301023 306004 315003 25 001087 001085 001086 002036 002148 002149 022055 022056 022067 301011 301012 301021 008080 033050 109000 031002 007065 008080 033050 022045 008080 033050 022064 008080 033050 316001 10 301011 004004 301023 001021 002041 019001 010051 019002 019003 019004 316002 15 008021 004001 004002 004003 004004 004005 001033 008021 004001 004002 004003 004004 004005 007002 007002 316003 12 110000 031001 008011 008007 104000 031001 005002 006002 010002 011002 008007 008011 316004 13 111000 031001 008011 008007 007002 007002 102000 031001 005002 006002 011031 008007 008011 316005 10 108000 031001 008005 008007 005002 006002 001026 019001 008007 008005 316006 14 112000 031001 008011 008007 007002 007002 102000 031001 005002 006002 020011 020012 008007 008011 316007 12 110000 031001 008011 008007 104000 031001 005002 006002 019005 019006 008007 008011 316008 13 111000 031001 008001 008007 008023 103000 031001 005002 006002 010002 008023 008007 008001 316009 13 111000 031001 008011 008007 007002 007002 102000 031001 005002 006002 020041 008007 008011 316010 9 107000 031001 008011 008007 001022 005002 006002 008007 008011 316011 19 117000 031001 008011 001022 008007 102000 031001 005002 006002 008021 004001 004002 004003 004004 004005 020090 008021 008007 008011 316020 5 001023 001025 001027 301011 301012 316021 23 301023 002041 019001 019007 019005 019006 019008 008005 010004 008005 010004 019007 008005 008021 004075 011040 019007 105004 005021 005021 102002 019003 019004 316022 24 001032 002041 019001 019010 118000 031001 008021 004014 008005 301023 019005 019006 010004 011041 008021 004075 011040 019008 105004 005021 005021 102002 019003 019004 316026 2 316020 316021 316030 10 301014 001037 010064 008019 001062 008019 001065 008019 001062 008019 316031 8 008021 301011 301012 301027 019005 019006 020028 008021 316032 5 008021 301011 301012 301027 008021 316033 7 008021 301011 301012 101000 031001 301027 008021 316034 17 008079 316030 008011 001022 008007 301023 008007 020090 316031 101000 031000 316032 101000 031001 316033 008011 008079 316035 9 008079 316030 008011 020023 020021 020008 316031 008011 008079 316036 13 008079 316030 008011 001027 316031 101000 031000 316032 101000 031001 316033 008011 008079 316037 7 008079 316030 008011 011031 316031 008011 008079 316038 8 008079 316030 008011 020041 020021 316031 008011 008079 316039 7 008079 316030 008011 020024 316031 008011 008079 316040 6 316030 008079 301014 001037 010064 008079 316050 16 301001 301011 301012 002160 008005 005002 006002 008005 019100 019005 019006 019101 019102 019103 019104 019105 316052 29 301005 301011 301012 001007 025150 122000 031001 001027 019150 019106 008005 005002 006002 008005 019107 019005 019006 019108 019109 019110 019111 019112 019113 019114 019115 019116 019117 019118 019119 318001 2 301025 024011 318003 4 301026 024005 024004 024021 318004 6 301025 004023 013011 024005 024004 024022 321001 6 002101 002114 002105 002106 002107 002121 321003 4 021051 021014 021017 021030 321004 5 301031 002003 101000 031001 321003 321005 12 025004 002121 002122 002123 002124 002125 002126 002127 002128 002129 002130 002131 321006 4 025001 025002 025003 025005 321007 8 025009 025010 025011 025012 025013 025015 025016 025017 321008 3 025006 025007 025008 321009 2 025018 025019 321010 13 002101 007002 002102 002103 002104 002105 002106 002107 002108 002109 002110 002132 002133 321011 3 030031 030032 029002 321012 3 101000 031001 002135 321021 15 002003 002101 201130 002106 201000 201132 202130 002121 202000 201000 201133 202129 025001 202000 201000 321022 11 007007 204001 031021 011001 204000 011002 204001 031021 011006 204000 021030 321023 9 007007 021091 021030 202129 021014 201129 021017 202000 201000 321024 7 007007 204001 031021 012007 011006 204000 021030 321025 17 007007 021091 021030 202129 021014 201129 021017 202000 201000 021092 021030 025092 201129 202129 021017 202000 201000 321026 10 007007 204001 031021 012007 025091 011071 011072 011073 011074 204000 321027 18 021118 202129 201132 002112 201000 201131 002111 201000 202000 002104 021105 021106 021107 021114 021115 021116 008018 021117 321028 18 021118 202129 201132 002112 201000 201131 002111 201000 202000 002104 021123 021106 021107 021114 021115 021116 008018 021117 321030 18 008085 202129 201131 002111 201000 202000 002134 021062 021063 021158 021159 021160 021161 021162 021163 021164 021165 021166 340001 45 001007 001031 002019 002020 004001 004002 004003 004004 004005 202131 201138 004006 201000 202000 005001 006001 007024 005021 007025 005022 005043 005040 201133 005041 201000 201132 025070 201000 202126 007001 202000 033060 033061 033062 033063 033064 033065 101010 340002 101087 340003 002019 025051 101007 340004 340002 3 025140 025141 025142 340003 5 104100 201136 005042 201000 014046 340004 9 005060 005061 025085 105006 005042 025142 014047 025142 014048 340005 94 001007 002019 001096 025061 005044 005040 001030 301011 301012 004007 005001 006001 008029 008074 008077 040011 025097 025095 025098 025099 021144 025096 040012 040013 021169 022151 022162 022163 025160 025133 022156 022164 022165 022166 021137 021138 022167 021139 021118 021145 021146 021147 022168 022169 022170 025161 025162 022171 022172 022173 022174 021170 021171 022175 021172 021118 021173 021174 021175 102003 002153 012063 013090 013091 007002 011097 011098 007002 011095 011096 010096 010081 010082 010083 010101 025132 025163 025126 025128 025164 010085 010097 010086 010087 010092 010088 010089 010098 010099 010090 010100 010093 025127 040014 340007 57 001007 001031 002019 002020 004001 004002 004003 004004 004005 202131 201138 004006 201000 202000 005001 006001 007024 005021 007025 005022 005043 005040 201133 005041 201000 201132 025070 201000 202126 007001 202000 103003 025140 025141 033060 033061 033062 033063 033064 033065 040020 101010 340002 101087 340003 002019 025051 101007 340004 020081 008029 020083 008029 040018 040019 040021 040022 340008 70 001007 001031 002019 002020 004001 004002 004003 004004 004005 202131 201138 004006 201000 202000 005001 006001 007024 005021 007025 005022 005043 005040 201133 005041 201000 201132 025070 201000 202126 007001 202000 103003 025140 025141 033060 033061 033062 033063 033064 033065 040020 101010 340002 104000 031002 201136 005042 201000 014046 108003 025140 025141 040015 040016 025062 101000 031002 040017 002019 025051 101007 340004 020081 008029 020083 008029 040018 040019 040021 040022 dballe-5.18/tables/D990204.txt0000644000175000017500000052523111432536512012513 00000000000000 D00002 2 B00002 B00003 D00003 3 B00010 B00011 B00012 D00004 9 D00003 B00013 B00014 B00015 B00016 B00017 B00018 B00019 B00020 D00010 3 D00003 R01000 B00030 D01001 2 B01001 B01002 D01002 3 B01003 B01004 B01005 D01003 3 B01011 B01012 B01013 D01004 4 B01001 B01002 B01015 B02001 D01011 3 B04001 B04002 B04003 D01012 2 B04004 B04005 D01013 3 B04004 B04005 B04006 D01021 2 B05001 B06001 D01022 3 B05001 B06001 B07001 D01023 2 B05002 B06002 D01024 3 B05002 B06002 B07001 D01025 3 D01023 B04003 D01012 D01026 7 D01021 B04003 B04003 B04004 B04004 B04005 B04005 D01029 3 B01018 B02001 D01011 D01030 4 B01018 B02001 D01011 D01024 D01031 5 D01001 B02001 D01011 D01012 D01022 D01032 5 D01001 B02001 D01011 D01012 D01024 D01033 5 B01005 B02001 D01011 D01012 D01021 D01034 5 B01005 B02001 D01011 D01012 D01023 D01035 7 B01005 B01012 B01013 B02001 D01011 D01012 D01023 D01036 5 D01003 B02001 D01011 D01012 D01023 D01037 6 D01001 B02011 B02012 D01011 D01012 D01022 D01038 6 D01001 B02011 B02012 D01011 D01012 D01024 D01039 6 D01003 B02011 B02012 D01011 D01012 D01023 D01040 6 D01003 B02011 B02012 D01011 D01012 D01024 D01041 5 B01007 B02021 B02022 D01011 D01012 D01042 2 D01041 D01021 D01043 5 B01007 B02023 D01011 D01013 D01021 D01044 5 B01007 B02024 D01011 D01013 D01021 D01049 5 B02111 B02112 B21062 B21063 B21065 D01051 6 B01006 B02061 D01011 D01012 D01021 B08004 D01055 7 B01005 B02001 D01011 D01012 D01021 B01012 B01014 D01062 2 R01000 D01001 D01065 8 B01006 B01008 B02001 B02002 B02005 B02062 B02070 B02065 D01066 6 D01011 D01013 D01023 B07004 B02064 B08004 D01070 3 B02143 B02142 B02144 D01071 5 B01007 B01031 B02020 B02028 B02029 D01072 4 D01071 D01011 D01013 D01021 D01074 4 B02143 B02142 B02145 B02146 D01075 6 D01001 B01015 D01024 B08021 D01011 D01012 D01076 3 B02011 B02143 B02142 D01090 6 D01004 D01011 D01012 D01021 B07030 B07031 D01091 10 B02180 B02181 B02182 B02183 B02184 B02179 B02186 B02187 B02188 B02189 D01193 5 001007 001031 002196 002221 002222 D01250 4 D01193 D01011 D01013 D01021 D02001 4 B10004 B10051 B10061 B10063 D02002 5 B10004 B07004 B10003 B10061 B10063 D02003 9 B11011 B11012 B12004 B12006 B13003 B20001 B20003 B20004 B20005 D02004 7 B20010 B08002 B20011 B20013 B20012 B20012 B20012 D02005 4 B08002 B20011 B20012 B20013 D02006 4 B10004 B10051 B10062 B10063 D02011 3 D02001 D02003 D02004 D02012 3 D02002 D02003 D02004 D02013 4 D02006 D02003 R01000 D02005 D02021 3 B22001 B22011 B22021 D02022 3 B22002 B22012 B22022 D02023 3 B22003 B22013 B22023 D02024 3 D02022 R01002 D02023 D02051 12 B10004 B10051 B07004 B10003 B12004 B12051 B12016 B12017 B13004 R02004 B08051 B08020 D02069 4 B07032 B07033 B33041 B20001 D02070 8 B07032 B07033 B11001 B11002 B11043 B11041 B11016 B11017 D02071 14 B07032 B07033 B08021 B04025 B11001 B11002 B08021 R03002 B04025 B11043 B11041 B04025 B11016 B11017 D02072 5 B07032 B07033 B12101 B12103 B13003 D02073 7 B20010 R05004 B08002 B20011 B20012 B33041 B20013 D02074 4 B20003 B04025 B20004 B20005 D02075 5 B08021 B04025 B13055 B13058 B08021 D02076 7 B02021 B20022 B26020 B20023 B20024 B20025 B20026 D02077 12 B07032 B07033 B04025 B12111 B12112 B07032 B04025 B12112 B02176 B20062 B02177 B13013 D02078 4 B02176 B20062 B02177 B13013 D02079 5 B07032 B02175 B02178 B04025 B13011 D02080 3 B02185 B04025 B13033 D02081 2 B04025 B14031 D02082 7 B04025 B14002 B14004 B14016 B14028 B14029 B14030 D02083 8 B04025 B08023 B10004 B11001 B11002 B12101 B13003 B08023 D03001 3 B07003 B11001 B11002 D03002 3 B07004 B11001 B11002 D03003 4 B07004 B10003 B12001 B12003 D03004 6 B07004 B10003 B12001 B12003 B11001 B11002 D03011 4 B07003 B08001 B11001 B11002 D03012 4 B07004 B08001 B11001 B11002 D03013 7 B07004 B08001 B10003 B12001 B13003 B11001 B11002 D03014 7 B07004 B08001 B10003 B12001 B12003 B11001 B11002 D03031 6 B07004 B08003 B07021 B07022 B08012 B12061 D03032 2 B20011 B20016 D03033 2 B20010 B20016 D03041 8 B02152 B02023 B07004 B11001 B11002 B02153 B02154 B12071 D03250 8 B02252 B02023 B07004 B11001 B11002 B02197 B02198 B12193 D04001 5 B08003 B10004 B12001 B11001 B11002 D04002 4 B08003 B10004 B11001 B11002 D04003 2 B08003 B12001 D04004 4 B08003 B10004 B20010 B12001 D04005 4 B02024 B07004 B07004 B13003 D04006 3 B14001 B14001 B14003 D04011 27 B02163 B02164 B08012 B07024 B02057 B08021 B04001 B04002 B04003 B04004 B08021 B04024 R10004 B08021 B04004 B04005 B04006 B08021 B04004 B04005 B04006 B11001 B11002 R03010 B02163 B07004 B12001 D04030 3 B27031 B28031 B10031 D04031 3 B01041 B01042 B01043 D04032 5 B02153 B02154 B20081 B20082 B20012 D04033 8 B02152 B02166 B02167 B02153 B02154 B12075 B12076 B12063 D04034 9 R02004 B27001 B28001 B07022 B05043 B20010 B20016 B33003 B10040 D04250 27 B02231 B02232 B08012 B07024 B02057 B08021 B04001 B04002 B04003 B04004 B08021 B04024 R10004 B08021 B04004 B04005 B04006 B08021 B04004 B04005 B04006 B11001 B11002 R03010 B02231 B07004 B12001 D05001 4 B11001 B11002 B13060 B13071 D05002 11 D01012 B12001 B13003 B14051 B13060 B13072 B13080 B13081 B13082 B13083 B13084 D05003 4 D01012 B04065 R01000 D05001 D05004 3 D01030 D05002 D05003 D05006 8 B13072 B13082 B13019 C07005 C01004 B12001 B13073 B13060 D05007 5 D01029 D01012 B04065 R01000 D05006 D05008 4 D05006 C07005 C01004 B12030 D05009 5 D01029 D01012 B04065 R01000 D05008 D05010 3 D05008 B02091 B02091 D05011 5 D01029 D01012 B04065 R01000 D05010 D05016 7 B14021 B07004 B13003 B11002 B11001 B11041 B11043 D05017 5 B13080 B13081 B13083 B13085 B13084 D05018 7 D01029 D01012 B04065 R03000 D05008 D05016 D05017 D06001 4 B02032 R02000 B07062 B22042 D06002 3 B02031 B22004 B22031 D06003 4 B02002 B11011 B11012 B12004 D06004 6 B02032 B02033 R03000 B07062 B22043 B22062 D06005 5 B02031 R03000 B07062 B22004 B22031 D06006 3 D06003 D06002 B22063 D06007 6 B01012 B01014 D06008 B04024 B27003 B28003 D06008 3 B02034 B02035 B02036 D06020 8 B01075 D01011 D01012 B22042 B22120 B22121 B04075 B04065 D06021 7 B01075 D01011 D01012 B22122 B22123 B12001 D03002 D06022 5 B01075 D01011 D01012 B22038 B22039 D06023 8 B01015 D01023 D01011 D01012 B22038 B22039 B22120 B22121 D06024 4 D06020 R02000 B22038 B22039 D07001 2 D01031 D02011 D07002 2 D01032 D02011 D07003 3 D07001 R01000 D02005 D07004 3 D07002 R01000 D02005 D07005 3 D07001 R01004 D02005 D07006 3 D07002 R01004 D02005 D07007 2 D01031 D02012 D07008 2 D01032 D02012 D07009 2 D01031 D02013 D07011 16 B01063 B02001 D01011 D01012 D01024 B07006 B11001 B11016 B11017 B11002 B11041 B07006 B12001 B12003 B10052 B20009 D07012 4 R03000 B08023 B05021 B20001 D07013 7 R06000 B01064 B08014 B20061 B08014 B20061 B20018 D07014 2 R01000 B20019 D07015 3 R01000 D02005 B20002 D07016 2 R01000 B20020 D07017 2 R01000 B11070 D07018 13 B08016 R02000 B08017 D01012 R04000 B07006 B11001 B11002 B11041 B20009 R01000 B20001 D07014 D07020 3 D07011 D07014 D07016 D07021 9 D07011 D07012 D07013 D07014 D07015 D07016 D07017 D07018 D07015 D07030 2 B15001 B15002 D07031 7 B08022 B08023 B15001 B08023 B15001 B08023 B15002 D07041 7 D01001 B01015 D01024 D01011 D01012 D01070 D07030 D07042 9 D01001 B01015 D01024 D01011 D01012 B08021 B04025 D01070 D07031 D07043 7 D01001 B01015 D01024 D01011 D01012 D01074 D07030 D07044 9 D01001 B01015 D01024 D01011 D01012 B08021 B04025 D01074 D07031 D07060 2 B07061 B12030 D07061 3 D01031 R01005 D07060 D07062 3 D01032 R01005 D07060 D07063 2 B07061 B12130 D08001 3 D01033 D02011 B22042 D08002 3 D01034 D02011 B22042 D08003 3 D01035 D02011 B22042 D08004 3 D01036 D02011 B22042 D08005 2 D08004 D02024 D08006 8 B10004 B10061 B10063 B11001 B11002 B12004 B13003 B22042 D08007 4 D01055 D02011 B07062 B22042 D09001 3 D01037 R01000 D03011 D09002 3 D01038 R01000 D03011 D09003 3 D01037 R01000 D03012 D09004 3 D01038 R01000 D03012 D09005 4 D01037 D02004 R01000 D03013 D09006 4 D01038 D02004 R01000 D03013 D09007 4 D01037 D02004 R01000 D03014 D09008 4 D01038 D02004 R01000 D03014 D09011 3 D01039 R01000 D03011 D09012 3 D01039 R01000 D03012 D09013 4 D01039 D02004 R01000 D03013 D09014 4 D01039 D02004 R01000 D03014 D09015 3 D01040 R01000 D03011 D09016 3 D01040 R01000 D03012 D09017 4 D01040 D02004 R01000 D03013 D09018 4 D01040 D02004 R01000 D03014 D09019 4 D01031 B02003 R01000 D03011 D09020 7 D01031 B02003 R04000 B07003 B11003 B11004 B11005 D09030 7 B15004 B15005 R04000 B04015 B08006 B07004 B15003 D09040 3 D01075 D01076 D09030 D09041 4 D07041 D01075 D01076 D09030 D09042 4 D07042 D01075 D01076 D09030 D09044 4 D07044 D01075 D01076 D09030 D10001 5 D01042 D03031 D03032 R01026 D03025 D10002 5 D01042 D03031 D03032 R01009 D03023 D10003 5 D01042 D03031 D03032 R01006 D03023 D10004 5 D01042 D03031 D03032 R01003 D03024 D10005 5 D01042 D03031 D03033 R01000 D03025 D10006 5 D01042 D03031 D03033 R01000 D03023 D10007 5 D01042 D03031 D03033 R01000 D03024 D10008 8 D10011 R01019 D10012 B02150 B25079 B25080 B33032 B14045 D10009 3 D10011 R01015 D10012 D10010 3 D10011 R01005 D10012 D10014 3 D01072 D03041 D04011 D10015 13 D01072 B07024 B10002 D03041 R01003 D04032 B02152 B02024 B07004 B07004 B13003 R01003 D04033 D10016 13 D01072 B07024 B10002 D03041 R01012 D04032 B02152 B02024 B07004 B07004 B13003 R01012 D04033 D10020 6 D10022 D01011 D01013 D01021 D04034 D10021 D10022 4 B01007 B02019 B01033 B02172 D10023 17 D01072 B30021 B30022 B08012 B07024 B07025 B10002 R01012 D04032 R05002 B02152 B02024 B07004 B07004 B13003 R01012 D04033 D10050 13 D10051 D10052 R01000 D10053 R01004 D10054 B20010 D10052 R01015 D10053 D10052 R01004 D10053 D10195 3 D01250 D03250 D04250 D11001 9 D01051 B07002 B12001 B11001 B11002 B11031 B11032 B11033 B20041 D11002 4 D01065 D01066 D11003 D11004 D11003 5 B10070 B11001 B11002 B12001 B13002 D11004 12 R01000 B11034 R01000 B11035 R01000 B11075 R01000 B11076 R01000 B33025 R01000 B33026 D11005 13 B01008 B01023 D01021 D01011 D01013 B07010 B08009 B11001 B11002 B11031 B11036 B12101 B33025 D11006 6 B07010 B11001 B11002 B02064 B12101 B12103 D11193 16 D01197 D01011 D01012 D01023 B08004 B07004 B08021 B11001 B11002 B11031 B11034 B11035 B12001 B12003 B13003 B20041 D12001 2 D01043 D04001 D12002 2 D01043 D04002 D12003 2 D01042 D04003 D12004 2 D01042 D04004 D12005 2 D01042 B20014 D12006 2 D01044 D04005 D12007 2 D01042 D04006 D12010 6 B01007 B05040 B02021 B05041 B04001 B04043 D12014 8 D12010 D12011 R05056 D01023 B05042 B05052 D12012 D12013 D12016 3 D12010 D12011 D12015 D12018 3 D12010 D12011 D12017 D12020 11 D01047 D01048 B15015 B29002 B21076 R04012 B06030 R02012 B05030 B21075 B21066 D12021 6 D01047 R01003 D01049 B11012 B11011 B21067 D12022 15 D01047 B08022 B11012 B11050 B22070 B22026 D12041 B10050 B21068 B21071 B21072 B21073 D12042 B21062 B15011 D12023 7 D01047 R03003 B08022 B12061 B22050 B21069 B21085 D12024 11 D12020 B08060 B08022 B08060 B08022 B25014 B22101 B22097 B22098 B22099 B22100 D12025 11 D12019 B08060 B08022 B08060 B08022 B25014 B22101 B22097 B22098 B22099 B22100 D12026 19 D01046 D01011 D01013 D01023 D12031 R01004 D12030 B21110 D01023 D21027 B21111 D01023 D21027 B21112 D01023 D21027 B21113 D01023 D21027 D12027 9 D01047 R05009 D01023 B07021 B12061 B07021 B12061 B21085 B21070 D12031 8 B05034 B06034 B21109 B11081 B11082 B21101 B21102 B21103 D12032 4 B21120 B21121 B13055 B21122 D12033 4 B02104 B08022 B12063 B12065 D12042 6 B21077 B21078 B21079 B21080 B21081 B21082 D12045 21 B01007 B02019 B01096 B25061 B05040 D01011 D01013 D01021 B07002 B12180 B12181 B12182 B12183 B12184 B12185 B02174 B21086 B12186 B21087 B12187 B33043 D13009 3 B21001 R01000 B21001 D13010 3 B21036 R01000 B21036 D13031 4 B06002 B06012 R01000 B30001 D13032 4 B05002 B05012 R01000 D13031 D13041 9 B06002 R10000 R04000 B06012 R01000 B30001 B06012 R01000 B30001 D13042 4 B05002 B05012 R01000 D13041 D13043 11 B06002 B05002 B05012 R12000 R10000 R04000 B06012 R01000 B30001 R01000 B30001 D15001 5 B01011 D01011 D01012 D01023 D06001 D15002 5 B01011 D01011 D01012 D01023 D06004 D16001 10 D01011 B04004 D01023 B01021 B02041 B19001 B10051 B19002 B19003 B19004 D16002 15 B08021 B04001 B04002 B04003 B04004 B04005 B01033 B08021 B04001 B04002 B04003 B04004 B04005 B07002 B07002 D16003 10 R09000 B08011 B08007 R04000 B05002 B06002 B10002 B11002 B08007 B08011 D16004 11 R10000 B08011 B08007 B07002 B07002 R02000 B05002 B06002 B11031 B08007 B08011 D16005 9 R08000 B08005 B08007 B05002 B06002 B01026 B19001 B08007 B08005 D16006 12 R11000 B08011 B08007 B07002 B07002 R02000 B05002 B06002 B20011 B20012 B08007 B08011 D16007 10 R09000 B08011 B08007 R04000 B05002 B06002 B19005 B19006 B08007 B08011 D16008 11 R10000 B08001 B08007 B08023 R03000 B05002 B06002 B10002 B08023 B08007 B08001 D16009 11 R10000 B08011 B08007 B07002 B07002 R02000 B05002 B06002 B20041 B08007 B08011 D16010 8 R07000 B08011 B08007 B01022 B05002 B06002 B08007 B08011 D16011 17 R16000 B08011 B01022 B08007 R02000 B05002 B06002 B08021 B04001 B04002 B04003 B04004 B04005 B20090 B08021 B08007 B08011 D16020 5 B01023 B01025 B01027 D01011 D01012 D16021 23 D01023 B02041 B19001 B19007 B19005 B19006 B19008 B08005 B10004 B08005 B10004 B19007 B08005 B08021 B04075 B11040 B19007 R05004 B05021 B05021 R02002 B19003 B19004 D16022 23 B01032 B02041 B19001 B19010 R18000 B08021 B04014 B08005 D01023 B19005 B19006 B10004 B11041 B08021 B04075 B11040 B19008 R05004 B05021 B05021 R02002 B19003 B19004 D16026 2 D16020 D16021 D18001 2 D01025 B24011 D18003 4 D01026 B24005 B24004 B24021 D18004 6 D01025 B04023 B13011 B24005 B24004 B24022 D21001 6 B02101 B02114 B02105 B02106 B02107 B02121 D21003 4 B21051 B21014 B21017 B21030 D21004 4 D01031 B02003 R01000 D21003 D21005 12 B25004 B02121 B02122 B02123 B02124 B02125 B02126 B02127 B02128 B02129 B02130 B02131 D21006 4 B25001 B25002 B25003 B25005 D21007 8 B25009 B25010 B25011 B25012 B25013 B25015 B25016 B25017 D21008 3 B25006 B25007 B25008 D21009 2 B25018 B25019 D21010 13 B02101 B07002 B02102 B02103 B02104 B02105 B02106 B02107 B02108 B02109 B02110 B02132 B02133 D21011 3 B30031 B30032 B29002 D21012 2 R01000 B02135 D35001 4 B08035 B35001 B08036 D01001 D35002 4 B08035 B35001 B08036 B01033 D35003 6 B08021 B04001 B04002 B04003 B04004 B04073 D35004 7 B08021 B04004 B08021 B04004 B35000 D01001 B35011 D35005 7 B08021 B04004 B08021 B04004 B35000 B01001 B35011 D35006 7 B08021 B04004 B08021 B04004 B35000 B01003 B35011 D35007 9 B08021 B04004 B08021 B04004 B35000 B01001 R02000 B01002 B35011 D35010 3 D35002 D35003 D35007 dballe-5.18/tables/Makefile.am0000644000175000017500000000144711636635710013137 00000000000000## Process this file with automake to produce Makefile.in crexbtables = B990203.txt B990204.txt B000299.txt crexdtables = D990203.txt D990204.txt D000299.txt bufrbtables = B000000002001200.txt \ B000000002001400.txt \ B0000000000200014001.txt bufrdtables = D000000002001200.txt \ D000000002001400.txt \ D0000000000200014001.txt table_DATA = repinfo.csv dballe.txt $(crexbtables) $(crexdtables) $(bufrbtables) $(bufrdtables) noinst_DATA = dballe.tex dballe.tex: dballe.txt mkbdoc $(srcdir)/mkbdoc tex < $< > $@ B000000002001400.txt: dballe.txt cut -b 1-119 < $< > $@ B0000000000200014001.txt: dballe.txt cut -b 1-119 < $< > $@ B990204.txt: dballe.txt cp $< $@ B000299.txt: dballe.txt cp $< $@ EXTRA_DIST = $(table_DATA) mkbdoc distclean-local: rm -f dballe.tex dballe-5.18/tables/dballe.txt0000644000175000017500000013005511754230675013067 00000000000000 001001 WMO BLOCK NUMBER NUMERIC 0 0 7 NUMERIC 0 2 001002 WMO STATION NUMBER NUMERIC 0 0 10 NUMERIC 0 3 001006 AIRCRAFT FLIGHT NUMBER CCITTIA5 0 0 64 CHARACTER 0 8 001007 SATELLITE IDENTIFIER CODE TABLE 1007 0 0 10 CODE TABLE 1007 0 3 001008 AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION CCITTIA5 0 0 64 CHARACTER 0 8 001011 SHIP OR MOBILE LAND STATION IDENTIFIER CCITTIA5 0 0 72 CHARACTER 0 9 001012 DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 001013 SPEED OF MOTION OF MOVING OBSERVING PLATFORM* M/S 0 0 10 M/S 0 3 001019 LONG STATION OR SITE NAME CCITTIA5 0 0 256 CHARACTER 0 32 001023 OBSERVATION SEQUENCE NUMBER NUMERIC 0 0 9 NUMERIC 0 3 001063 ICAO LOCATION INDICATOR CCITTIA5 0 0 64 CHARACTER 0 8 001192 [SIM] MeteoDB station ID NUMERIC 0 0 24 NUMERIC 0 8 001193 [SIM] Report code NUMERIC 0 0 16 NUMERIC 0 5 001194 [SIM] Report mnemonic CCITTIA5 0 0 128 CHARACTER 0 16 001212 AIR QUALITY OBSERVING STATION LOCAL CODE CCITTIA5 0 0 56 CHARACTER 0 7 001213 AIRBASE AIR QUALITY OBSERVING STATION CODE CCITTIA5 0 0 56 CHARACTER 0 7 001214 GEMS AIR QUALITY OBSERVING STATION CODE CCITTIA5 0 0 48 CHARACTER 0 6 001215 AIR QUALITY OBSERVING STATION DOMINANT EMISSION SOURCE CODE TABLE 001215 0 0 3 CODE TABLE 001215 0 1 001216 AIR QUALITY OBSERVING STATION AREA TYPE CODE TABLE 001216 0 0 3 CODE TABLE 001216 0 1 001217 AIR QUALITY OBSERVING STATION TERRAIN TYPE CODE TABLE 001217 0 0 4 CODE TABLE 001217 0 2 002001 TYPE OF STATION CODE TABLE 2001 0 0 2 CODE TABLE 2001 0 1 002002 TYPE OF INSTRUMENTATION FOR WIND MEASUREMENT FLAG TABLE 2002 0 0 4 FLAG TABLE 2002 0 2 002003 TYPE OF MEASURING EQUIPMENT USED CODE TABLE 2003 0 0 4 CODE TABLE 2003 0 2 002004 TYPE OF INSTRUMENTATION FOR EVAPORATION MEASUREMENT OR TYPE OF C CODE TABLE 2004 0 0 4 CODE TABLE 2004 0 2 002005 PRECISION OF TEMPERATURE OBSERVATION K 2 0 7 K 2 3 002011 RADIOSONDE TYPE CODE TABLE 2011 0 0 8 CODE TABLE 2011 0 3 002012 RADIOSONDE COMPUTATIONAL METHOD CODE TABLE 2012 0 0 4 CODE TABLE 2012 0 2 002013 SOLAR AND INFRARED RADIATION CORRECTION CODE TABLE 2013 0 0 4 CODE TABLE 2013 0 2 002014 TRACKING TECHNIQUE/STATUS OF SYSTEM USED CODE TABLE 2014 0 0 7 CODE TABLE 2014 0 3 002048 SATELLITE SENSOR INDICATOR CODE TABLE 2048 0 0 4 CODE TABLE 2048 0 2 002061 AIRCRAFT NAVIGATIONAL SYSTEM CODE TABLE 2061 0 0 3 CODE TABLE 2061 0 1 002062 TYPE OF AIRCRAFT DATA RELAY SYSTEM CODE TABLE 2062 0 0 4 CODE TABLE 2062 0 2 002063 AIRCRAFT ROLL ANGLE DEGREE 2 -18000 16 DEGREE 2 5 002064 AIRCRAFT ROLL ANGLE QUALITY CODE TABLE 2064 0 0 2 CODE TABLE 2064 0 1 002070 ORIGINAL SPECIFICATION OF LATITUDE/LONGITUDE CODE TABLE 2070 0 0 4 CODE TABLE 2070 0 2 004001 YEAR YEAR 0 0 12 YEAR 0 4 004002 MONTH MONTH 0 0 4 MONTH 0 2 004003 DAY DAY 0 0 6 DAY 0 2 004004 HOUR HOUR 0 0 5 HOUR 0 2 004005 MINUTE MINUTE 0 0 6 MINUTE 0 2 004006 SECOND SECOND 0 0 6 SECOND 0 2 004086 LONG TIME PERIOD OR DISPLACEMENT SECOND 0 -8192 15 SECOND 0 5 004192 [SIM] Time range type NUMERIC 0 0 10 NUMERIC 0 4 004193 [SIM] Time range P1 NUMERIC 0 -536870912 31 NUMERIC 0 10 004194 [SIM] Time range P2 NUMERIC 0 -536870912 31 NUMERIC 0 10 005001 LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7 005015 LATITUDE DISPLACEMENT (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7 005021 BEARING OR AZIMUTH DEGREE TRUE 2 0 16 DEGREE TRUE 2 5 005022 SOLAR AZIMUTH DEGREE TRUE 2 0 16 DEGREE TRUE 2 5 005040 ORBIT NUMBER NUMERIC 0 0 24 NUMERIC 0 8 005041 SCAN LINE NUMBER NUMERIC 0 0 8 NUMERIC 0 3 005043 FIELD OF VIEW NUMBER NUMERIC 0 0 8 NUMERIC 0 3 006001 LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8 006015 LONGITUDE DISPLACEMENT (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8 007002 HEIGHT OR ALTITUDE M -1 -40 16 M -1 5 007004 PRESSURE PA -1 0 14 PA -1 5 007007 HEIGHT M 0 -1000 17 M 0 6 007010 FLIGHT LEVEL M 0 -1024 16 FT -1 5 007024 SATELLITE ZENITH ANGLE DEGREE 2 -9000 15 DEGREE 2 5 007025 SOLAR ZENITH ANGLE DEGREE 2 -9000 15 DEGREE 2 5 007030 HEIGHT OF STATION GROUND ABOVE MEAN SEA LEVEL (SEE NOTE 3) M 1 -4000 17 M 1 5 007031 HEIGHT OF BAROMETER ABOVE MEAN SEA LEVEL (SEE NOTE 4) M 1 - 4000 17 M 1 5 007032 HEIGHT OF SENSOR ABOVE LOCAL GROUND (OR DECK OF MARINE PLATFORM) M 2 0 16 M 2 5 007192 [SIM] First level type NUMERIC 0 0 10 NUMERIC 0 4 007193 [SIM] Level L1 NUMERIC 0 -536870912 31 NUMERIC 0 10 007194 [SIM] Level L2 NUMERIC 0 -536870912 31 NUMERIC 0 10 007195 [SIM] Second level type NUMERIC 0 0 31 NUMERIC 0 4 008002 VERTICAL SIGNIFICANCE (SURFACE OBSERVATIONS) CODE TABLE 8002 0 0 6 CODE TABLE 8002 0 2 008004 PHASE OF AIRCRAFT FLIGHT CODE TABLE 8004 0 0 3 CODE TABLE 8004 0 1 008009 DETAILED PHASE OF FLIGHT CODE TABLE 8009 0 0 4 CODE TABLE 8009 0 2 008021 TIME SIGNIFICANCE CODE TABLE 8021 0 0 5 CODE TABLE 8021 0 2 008042 EXTENDED VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8042 0 0 18 FLAG TABLE 8042 0 6 008044 (VAL) CAS REGISTRY NUMBER CCITTIA5 0 0 88 CHARACTER 0 11 010004 PRESSURE PA -1 0 14 PA -1 5 010007 HEIGHT M 0 -1000 17 M 0 6 010008 GEOPOTENTIAL M**2/S**2 0 -10000 20 M**2/S**2 0 7 010051 PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14 PA -1 5 010052 ALTIMETER SETTING (QNH) PA -1 0 14 PA -1 5 010060 PRESSURE CHANGE PA -1 -1024 11 PA -1 4 010063 CHARACTERISTIC OF PRESSURE TENDENCY CODE TABLE 10063 0 0 4 CODE TABLE 10063 0 2 010197 ANEMOMETER HEIGHT M 0 0 9 M 0 3 011001 WIND DIRECTION DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 011002 WIND SPEED M/S 1 0 12 M/S 1 4 011003 U-COMPONENT M/S 1 -4096 13 M/S 1 4 011004 V-COMPONENT M/S 1 -4096 13 M/S 1 4 011005 W-COMPONENT PA/S 1 -512 10 PA/S 1 4 011006 W-COMPONENT M/S 2 -4096 13 M/S 2 4 011016 EXTREME COUNTERCLOCKWISE WIND DIRECTION OF A VARIABLE WIND DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 011017 EXTREME CLOCKWISE WIND DIRECTION OF A VARIABLE WIND DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 011031 DEGREE OF TURBULENCE CODE TABLE 11031 0 0 4 CODE TABLE 11031 0 2 011037 TURBULENCE INDEX CODE TABLE 11037 0 0 6 CODE TABLE 11037 0 2 011039 EXTENDED TIME OF OCCURRENCE OF PEAK EDDY DISSIPATION RATE CODE TABLE 11039 0 0 6 CODE TABLE 11039 0 2 011041 MAXIMUM WIND GUST SPEED M/S 1 0 12 M/S 1 4 011043 MAXIMUM WIND GUST DIRECTION DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 011061 ABSOLUTE WIND SHEAR IN 1 KM LAYER BELOW M/S 1 0 12 M/S 1 4 011062 ABSOLUTE WIND SHEAR IN 1 KM LAYER ABOVE M/S 1 0 12 M/S 1 4 011075 MEAN TURBULENCE INTENSITY (EDDY DISSIPATION RATE) M**(2/3)/S 2 0 8 M**(2/3)/S 2 3 011076 PEAK TURBULENCE INTENSITY (EDDY DISSIPATION RATE) M**(2/3)/S 2 0 8 M**(2/3)/S 2 3 011077 REPORTING INTERVAL OR AVERAGING TIME FOR EDDY DISSIPATION RATE S 0 0 12 S 0 4 011192 [SIM] W-component terrain following M/S 2 -4096 13 M/S 2 4 011193 [SIM] Stability class NUMERIC 0 0 4 NUMERIC 0 2 011194 [SIM] Friction velocity (calmet) M/S 3 0 14 M/S 3 4 011195 [SIM] Mixing height (calmet) M 0 0 12 M 0 4 011196 [SIM] Obukov lenght (calmet) M 1 -100000 15 M 1 5 011197 [SIM] Convective velocitiy scale (calmet) M/S 3 0 14 M/S 3 4 011198 [SIM] SQRT(2*TKE) M/S 4 0 20 M/S 4 6 011199 [SIM] Surface Roughness M 3 0 14 M 1 4 011200 [SIM] U-component of momentum flux N/M**2 4 -524288 20 N/M**2 4 6 011201 [SIM] V-component of momentum flux N/M**2 4 -524288 20 N/M**2 4 6 011202 [SIM] Friction velocity (diagmet) M/S 3 0 14 M/S 3 4 011203 [SIM] Mixing height (diagmet) M 0 0 12 M 0 4 011204 [SIM] Obukov lenght (diagmet) M 1 -100000 15 M 1 5 011205 [SIM] Convective velocitiy scale (diagmet) M/S 3 0 14 M/S 3 4 011206 [SIM] Friction velocity (COSMO) M/S 3 0 14 M/S 3 4 011207 [SIM] Obukov lenght (COSMO) M 1 -100000 15 M 1 5 012002 WET-BULB TEMPERATURE K 1 0 12 K 1 4 012030 SOIL TEMPERATURE K 1 0 12 K 1 4 012061 SKIN TEMPERATURE K 1 0 12 K 1 4 012063 BRIGHTNESS TEMPERATURE K 1 0 12 K 1 4 012101 TEMPERATURE/DRY-BULB TEMPERATURE K 2 0 16 K 2 5 012103 DEW-POINT TEMPERATURE K 2 0 16 K 2 5 012121 GROUND MINIMUM TEMPERATURE K 2 0 16 C 2 4 012192 POTENTIAL TEMPERATURE K 2 0 16 K 2 5 013001 SPECIFIC HUMIDITY KG/KG 5 0 14 KG/KG 5 5 013002 MIXING RATIO KG/KG 5 0 14 KG/KG 5 5 013003 RELATIVE HUMIDITY % 0 0 7 % 0 3 013011 TOTAL PRECIPITATION / TOTAL WATER EQUIVALENT KG/M**2 1 -1 14 KG/M**2 1 5 013013 TOTAL SNOW DEPTH M 3 -20 20 M 3 6 013031 EVAPOTRANSPIRATION KG/M**2 1 0 7 KG/M**2 0 3 013033 EVAPORATION/EVAPOTRANSPIRATION KG/M**2 1 0 10 KG/M**2 1 4 013192 [SIM] Cloud liquid water content KG/KG 8 0 27 KG/KG 8 8 013193 [SIM] Cloud ice content KG/KG 8 0 27 KG/KG 8 8 013195 [SIM] Precipitating liquid water KG/KG 8 0 27 KG/KG 8 8 013196 [SIM] Precipitating ice KG/KG 8 0 27 KG/KG 8 8 013197 [SIM] Total precipitating water+ice KG/KG 8 0 27 KG/KG 8 8 013198 [SIM] Total liquid water (cloud+precipitating) KG/KG 8 0 27 KG/KG 8 8 013199 [SIM] Total ice (cloud+precipitating) KG/KG 8 0 27 KG/KG 8 8 013200 [SIM] Grid-scale liquid precipitation KG/M**2 1 -1 14 KG/M**2 1 5 013201 [SIM] Grid-scale snowfall KG/M**2 1 -1 14 KG/M**2 1 5 013202 [SIM] Convective liquid precipitation KG/M**2 1 -1 14 KG/M**2 1 5 013203 [SIM] Convective snowfall KG/M**2 1 -1 14 KG/M**2 1 5 013204 [SIM] Total convective precipitation (liquid + snow) KG/M**2 1 -1 14 KG/M**2 1 5 013205 [SIM] Snowfall (grid-scale + convective) KG/M**2 1 -1 14 KG/M**2 1 5 013206 [SIM] Soil water content KG/M**2 1 0 14 KG/M**2 1 5 013212 [SIM] Leaf wetness duration S -1 0 24 S -1 7 014016 NET RADIATION J/M**2 -4 -16384 15 J/M**2 -4 5 014017 INSTANTANEOUS LONG-WAVE RADIATION (incoming) W/M**2 0 -2048 12 W/M**2 0 4 014018 INSTANTANEOUS SHORT-WAVE RADIATION (incoming) W/M**2 0 -2048 12 W/M**2 -3 4 014019 SURFACE ALBEDO % 0 0 7 % 0 3 014021 GLOBAL SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15 J/M**2 -4 5 014031 TOTAL SUNSHINE MINUTE 0 0 11 MINUTE 0 4 014192 [SIM] Instantenous sensible heat flux W/m**2 0 -1024 11 W/M**2 0 4 014193 [SIM] Instantenous latent heat flux W/m**2 0 -1024 11 W/M**2 0 4 014194 [SIM] Instantenous direct solar radiation W/M**2 0 -2048 12 W/M**2 -3 4 014195 [SIM] Instantenous diffuse solar radiation W/M**2 0 -2048 12 W/M**2 -3 4 014196 [SIM] INSTANTANEOUS NET LONG-WAVE RADIATION W/M**2 0 -2048 12 W/M**2 0 4 014197 [SIM] INSTANTANEOUS NET SHORT-WAVE RADIATION W/M**2 0 -2048 12 W/M**2 -3 4 015192 [SIM] NO Concentration KG/M**3 10 0 20 KG/M**3 10 6 015193 [SIM] NO2 Concentration KG/M**3 10 0 20 KG/M**3 10 6 015194 [SIM] O3 Concentration KG/M**3 10 0 20 KG/M**3 10 6 015195 [SIM] PM10 Concentration KG/M**3 10 0 20 KG/M**3 10 6 015196 [SIM] CO Concentration KG/M**3 10 0 20 KG/M**3 10 6 015197 [SIM] SO2 Concentration KG/M**3 10 0 20 KG/M**3 10 6 015198 [SIM] PM2.5 Concentration KG/M**3 10 0 20 KG/M**3 10 6 015199 [SIM] NOY Concentration KG/M**3 10 0 20 KG/M**3 10 6 015200 [SIM] HCNM Concentration KG/M**3 10 0 20 KG/M**3 10 6 015201 [SIM] ALDE Concentration KG/M**3 10 0 20 KG/M**3 10 6 015202 [SIM] PM5 Concentration (tot. aerosol < 5 ug) KG/M**3 10 0 20 KG/M**3 10 6 015203 [SIM] PM1 Concentration (tot. aerosol < 1.25 ug) KG/M**3 10 0 20 KG/M**3 10 6 015204 [SIM] PM06 Concentration (tot. aerosol < 0.6 ug) KG/M**3 10 0 20 KG/M**3 10 6 015205 [SIM] PM03 Concentration (tot. aerosol < 0.3 ug) KG/M**3 10 0 20 KG/M**3 10 6 015206 [SIM] PM015 Concentration (tot. aerosol < 0.15 ug) KG/M**3 10 0 20 KG/M**3 10 6 015207 [SIM] PM008 Concentration (tot. aerosol < 0.08 ug) KG/M**3 10 0 20 KG/M**3 10 6 015208 [SIM] Concentration of primary particulate matter in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015209 [SIM] Concentration of sulfate in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015210 [SIM] Concentration of nitrate in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015211 [SIM] Concentration of ammonium in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015212 [SIM] Concentration of black carbon in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015213 [SIM] Concentration of organic carbon in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015214 [SIM] Concentration of dust in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015215 [SIM] Concentration of anthrop. A1D in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015216 [SIM] Concentration of anthrop. BmP in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015217 [SIM] Concentration of biogenic A1D in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015218 [SIM] Concentration of biogenic BmP in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015219 [SIM] Concentration of water in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015220 [SIM] Concentration of sea salt in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015221 [SIM] Concentration of secondary organic aerosol in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015222 [SIM] Total concentration of primary aerosol in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015223 [SIM] Total concentration of secondary aerosol in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015224 [SIM] Uncertainity in O3 estimate (Pesco) KG/M**3 10 0 20 KG/M**3 10 6 015225 [SIM] Uncertainity in PM10 estimate (Pesco) KG/M**3 10 0 20 KG/M**3 10 6 015226 [SIM] Uncertainity in NO2 estimate (Pesco) KG/M**3 10 0 20 KG/M**3 10 6 015227 [SIM] Uncertainity in PM2.5 estimate (Pesco) KG/M**3 10 0 20 KG/M**3 10 6 015228 [SIM] NH3 Concentration KG/M**3 10 0 20 KG/M**3 10 6 015229 [SIM] Concentration of primary part. matter in aerosol KG/M**3 10 0 20 KG/M**3 10 6 015230 [SIM] Concentration of sulfate in aerosol KG/M**3 10 0 20 KG/M**3 10 6 015231 [SIM] Concentration of nitrate in aerosol KG/M**3 10 0 20 KG/M**3 10 6 015232 [SIM] Concentration of ammonium in aerosol KG/M**3 10 0 20 KG/M**3 10 6 015233 [SIM] Concentration of anthrop. sec. org. in aerosol KG/M**3 10 0 20 KG/M**3 10 6 015234 [SIM] Concentration of biogenic sec. org. in aerosol KG/M**3 10 0 20 KG/M**3 10 6 015235 [SIM] Concentration of ISOPA1 in PM10 KG/M**3 10 0 20 KG/M**3 10 6 020001 HORIZONTAL VISIBILITY M -1 0 13 M -1 4 020003 PRESENT WEATHER (SEE NOTE 1) CODE TABLE 20003 0 0 9 CODE TABLE 20003 0 3 020004 PAST WEATHER (1) (SEE NOTE 2) CODE TABLE 20004 0 0 5 CODE TABLE 20004 0 2 020005 PAST WEATHER (2) (SEE NOTE 2) CODE TABLE 20005 0 0 5 CODE TABLE 20005 0 2 020009 GENERAL WEATHER INDICATOR (TAF/METAR) CODE TABLE 20009 0 0 4 CODE TABLE 20009 0 2 020010 CLOUD COVER (TOTAL) % 0 0 7 % 0 3 020011 CLOUD AMOUNT CODE TABLE 20011 0 0 4 CODE TABLE 20011 0 2 020012 CLOUD TYPE CODE TABLE 20012 0 0 6 CODE TABLE 20012 0 2 020013 HEIGHT OF BASE OF CLOUD M 0 -400 17 M 0 5 020017 CLOUD TOP DESCRIPTION CODE TABLE 20017 0 0 4 CODE TABLE 20017 0 2 020019 SIGNIFICANT PRESENT OR FORECAST WEATHER CCITTIA5 0 0 72 CHARACTER 0 9 020021 TYPE OF PRECIPITATION FLAG TABLE 20021 0 0 30 FLAG TABLE 20021 0 10 020042 AIRFRAME ICING PRESENT CODE TABLE 20042 0 0 2 CODE TABLE 20042 0 1 020043 PEAK LIQUID WATER CONTENT KG/M**3 4 0 7 KG/M**3 4 2 020044 AVERAGE LIQUID WATER CONTENT KG/M**3 4 0 7 KG/M**3 4 2 020045 SUPERCOOLED LARGE DROPLET (SLD) CONDITIONS CODE TABLE 20045 0 0 2 CODE TABLE 20045 0 2 020062 STATE OF THE GROUND (WITH OR WITHOUT SNOW) CODE TABLE 20062 0 0 5 CODE TABLE 20062 0 2 020193 [SIM] Cloud type (METAR) CCITTIA5 0 0 16 CHARACTER 0 2 022001 DIRECTION OF WAVES DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 022011 PERIOD OF WAVES S 0 0 6 S 0 2 022012 PERIOD OF WIND WAVES S 0 0 6 S 0 2 022021 HEIGHT OF WAVES M 1 0 10 M 1 4 022022 HEIGHT OF WIND WAVES M 1 0 10 M 1 4 022037 Tidal elevation with respect to national land datum M 3 -10000 15 M 3 5 022043 SEA/WATER TEMPERATURE K 2 0 15 K 2 5 022070 SIGNIFICANT WAVE HEIGHT M 2 0 13 M 2 4 022071 SPECTRAL PEAK WAVE PERIOD S 1 0 9 S 1 3 022074 AVERAGE WAVE PERIOD S 1 0 9 S 1 3 023192 [SIM] Dry deposition of H2SO4 MOL/M**2 5 0 20 MOL/M**3 5 6 023193 [SIM] Wet deposition of H2SO4 MOL/M**2 5 0 20 MOL/M**3 5 6 023194 [SIM] Dry deposition of NH4 MOL/M**2 5 0 20 MOL/M**3 5 6 023195 [SIM] Wet deposition of NH4 MOL/M**2 5 0 20 MOL/M**3 5 6 023196 [SIM] Dry deposition of HNO3 MOL/M**2 5 0 20 MOL/M**3 5 6 023197 [SIM] Wet deposition of HNO3 MOL/M**2 5 0 20 MOL/M**3 5 6 025076 LOG-10 OF (TEMP-RAD CENTRAL WAVENUMBER) FOR ATOVS LOGM-1 8 0 30 LOGM-1 8 10 029192 [SIM] Land fraction % 1 0 10 % 1 4 031000 SHORT DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 1 NUMERIC 0 1 031001 DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 8 NUMERIC 0 3 031002 EXTENDED DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 16 NUMERIC 0 5 031011 DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 8 NUMERIC 0 3 031012 EXTENDED DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 16 NUMERIC 0 5 031021 ASSOCIATED FIELD SIGNIFICANCE CODE TABLE 31021 0 0 6 CODE TABLE 31021 0 2 031031 DATA PRESENT INDICATOR FLAG TABLE 31031 0 0 1 FLAG TABLE 31031 0 1 033002 QUALITY INFORMATION CODE TABLE 33002 0 0 2 CODE TABLE 33002 0 1 033003 QUALITY INFORMATION CODE TABLE 33003 0 0 3 CODE TABLE 33003 0 1 033005 QUALITY INFORMATION (AWS DATA) FLAG TABLE 33005 0 0 30 FLAG TABLE 33005 0 10 033006 INTERNAL MEASUREMENT STATUS INFORMATION (AWS) CODE TABLE 33006 0 0 3 CODE TABLE 33006 0 1 033007 PER CENT CONFIDENCE % 0 0 7 % 0 3 033015 DATA QUALITY CHECK INDICATOR CODE TABLE 33015 0 0 6 CODE TABLE 33015 0 2 033020 QUALITY CONTROL INDICATION OF FOLLOWING VALUE CODE TABLE 33020 0 0 3 CODE TABLE 33020 0 1 033021 QUALITY OF FOLLOWING VALUE CODE TABLE 33021 0 0 2 CODE TABLE 33021 0 1 033022 QUALITY OF BUOY SATELLITE TRANSMISSION CODE TABLE 33022 0 0 2 CODE TABLE 33022 0 1 033023 QUALITY OF BUOY LOCATION CODE TABLE 33023 0 0 2 CODE TABLE 33023 0 1 033024 STATION ELEVATION QUALITY MARK (FOR MOBILE STATIONS) CODE TABLE 33024 0 0 4 CODE TABLE 33024 0 2 033025 ACARS INTERPOLATED VALUES CODE TABLE 33025 0 0 3 CODE TABLE 33025 0 1 033026 MOISTURE QUALITY CODE TABLE 33026 0 0 6 CODE TABLE 33026 0 2 033027 LOCATION QUALITY CLASS (RANGE OF RADIUS OF 66 % CONFIDENCE) CODE TABLE 33027 0 0 3 CODE TABLE 33027 0 1 033030 SCAN LINE STATUS FLAGS FOR ATOVS FLAG TABLE 33030 0 0 24 FLAG TABLE 33030 0 8 033031 SCAN LINE QUALITY FLAGS FOR ATOVS FLAG TABLE 33031 0 0 24 FLAG TABLE 33031 0 8 033032 CHANNEL QUALITY FLAGS FOR ATOVS FLAG TABLE 33032 0 0 24 FLAG TABLE 33032 0 8 033033 FIELD OF VIEW QUALITY FLAGS FOR ATOVS FLAG TABLE 33033 0 0 24 FLAG TABLE 33033 0 8 033035 MANUAL/AUTOMATIC QUALITY CONTROL CODE TABLE 33035 0 0 4 CODE TABLE 33035 0 2 033036 NOMINAL CONFIDENCE THRESHOLD % 0 0 7 % 0 3 033037 WIND CORRELATION ERROR FLAG TABLE 33037 0 0 20 FLAG TABLE 33037 0 7 033038 QUALITY FLAGS FOR GROUND-BASED GNSS DATA FLAG TABLE 33038 0 0 10 FLAG TABLE 33038 0 4 033040 CONFIDENCE INTERVAL % 0 0 7 PERCENT 0 3 033041 ATTRIBUTE OF FOLLOWING VALUE CODE TABLE 33041 0 0 2 CODE TABLE 33041 0 1 033050 GLOBAL GTSPP QUALITY FLAG CODE TABLE 33050 0 0 4 CODE TABLE 33050 0 2 033192 [SIM] Climatological and consistency check % 0 0 7 PERCENT 0 3 033193 [SIM] Time consistency % 0 0 7 PERCENT 0 3 033194 [SIM] Space consistency % 0 0 7 PERCENT 0 3 033195 [SIM] MeteoDB variable ID NUMERIC 0 0 24 NUMERIC 0 8 033196 [SIM] Data has been invalidated CODE TABLE 33196 0 0 2 CODE TABLE 33196 0 1 033197 [SIM] Manual replacement in substitution CODE TABLE 33197 0 0 2 CODE TABLE 33197 0 1 033198 [SIM] Observation increment NUMERIC 4 -1073741823 31 NUMERIC 4 10 033201 [SIM] Kalman coefficient, state vector (s.v.) x1 NUMERIC 4 -1073741823 31 NUMERIC 4 10 033202 [SIM] Kalman coefficient, state vector (s.v.) x2 NUMERIC 4 -1073741823 31 NUMERIC 4 10 033203 [SIM] Kalman coefficient, s.v. error covariance matrix(1,1) NUMERIC 4 -1073741823 31 NUMERIC 4 10 033204 [SIM] Kalman coefficient, s.v. error covariance matrix(1,2) NUMERIC 4 -1073741823 31 NUMERIC 4 10 033205 [SIM] Kalman coefficient, s.v. error covariance matrix(2,1) NUMERIC 4 -1073741823 31 NUMERIC 4 10 033206 [SIM] Kalman coefficient, s.v. error covariance matrix(2,2) NUMERIC 4 -1073741823 31 NUMERIC 4 10 033207 [SIM] Kalman observation sequential counter NUMERIC 0 -127 8 NUMERIC 0 3 033208 [SIM] Kalman osservation missing counter NUMERIC 0 -127 8 NUMERIC 0 3 033209 [SIM] Normalized Density Index % 0 0 7 PERCENT 0 3 dballe-5.18/tables/B000000002001400.txt0000644000175000017500000010263011754230765013352 00000000000000 001001 WMO BLOCK NUMBER NUMERIC 0 0 7 001002 WMO STATION NUMBER NUMERIC 0 0 10 001006 AIRCRAFT FLIGHT NUMBER CCITTIA5 0 0 64 001007 SATELLITE IDENTIFIER CODE TABLE 1007 0 0 10 001008 AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION CCITTIA5 0 0 64 001011 SHIP OR MOBILE LAND STATION IDENTIFIER CCITTIA5 0 0 72 001012 DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** DEGREE TRUE 0 0 9 001013 SPEED OF MOTION OF MOVING OBSERVING PLATFORM* M/S 0 0 10 001019 LONG STATION OR SITE NAME CCITTIA5 0 0 256 001023 OBSERVATION SEQUENCE NUMBER NUMERIC 0 0 9 001063 ICAO LOCATION INDICATOR CCITTIA5 0 0 64 001192 [SIM] MeteoDB station ID NUMERIC 0 0 24 001193 [SIM] Report code NUMERIC 0 0 16 001194 [SIM] Report mnemonic CCITTIA5 0 0 128 001212 AIR QUALITY OBSERVING STATION LOCAL CODE CCITTIA5 0 0 56 001213 AIRBASE AIR QUALITY OBSERVING STATION CODE CCITTIA5 0 0 56 001214 GEMS AIR QUALITY OBSERVING STATION CODE CCITTIA5 0 0 48 001215 AIR QUALITY OBSERVING STATION DOMINANT EMISSION SOURCE CODE TABLE 001215 0 0 3 001216 AIR QUALITY OBSERVING STATION AREA TYPE CODE TABLE 001216 0 0 3 001217 AIR QUALITY OBSERVING STATION TERRAIN TYPE CODE TABLE 001217 0 0 4 002001 TYPE OF STATION CODE TABLE 2001 0 0 2 002002 TYPE OF INSTRUMENTATION FOR WIND MEASUREMENT FLAG TABLE 2002 0 0 4 002003 TYPE OF MEASURING EQUIPMENT USED CODE TABLE 2003 0 0 4 002004 TYPE OF INSTRUMENTATION FOR EVAPORATION MEASUREMENT OR TYPE OF C CODE TABLE 2004 0 0 4 002005 PRECISION OF TEMPERATURE OBSERVATION K 2 0 7 002011 RADIOSONDE TYPE CODE TABLE 2011 0 0 8 002012 RADIOSONDE COMPUTATIONAL METHOD CODE TABLE 2012 0 0 4 002013 SOLAR AND INFRARED RADIATION CORRECTION CODE TABLE 2013 0 0 4 002014 TRACKING TECHNIQUE/STATUS OF SYSTEM USED CODE TABLE 2014 0 0 7 002048 SATELLITE SENSOR INDICATOR CODE TABLE 2048 0 0 4 002061 AIRCRAFT NAVIGATIONAL SYSTEM CODE TABLE 2061 0 0 3 002062 TYPE OF AIRCRAFT DATA RELAY SYSTEM CODE TABLE 2062 0 0 4 002063 AIRCRAFT ROLL ANGLE DEGREE 2 -18000 16 002064 AIRCRAFT ROLL ANGLE QUALITY CODE TABLE 2064 0 0 2 002070 ORIGINAL SPECIFICATION OF LATITUDE/LONGITUDE CODE TABLE 2070 0 0 4 004001 YEAR YEAR 0 0 12 004002 MONTH MONTH 0 0 4 004003 DAY DAY 0 0 6 004004 HOUR HOUR 0 0 5 004005 MINUTE MINUTE 0 0 6 004006 SECOND SECOND 0 0 6 004086 LONG TIME PERIOD OR DISPLACEMENT SECOND 0 -8192 15 004192 [SIM] Time range type NUMERIC 0 0 10 004193 [SIM] Time range P1 NUMERIC 0 -536870912 31 004194 [SIM] Time range P2 NUMERIC 0 -536870912 31 005001 LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25 005015 LATITUDE DISPLACEMENT (HIGH ACCURACY) DEGREE 5 -9000000 25 005021 BEARING OR AZIMUTH DEGREE TRUE 2 0 16 005022 SOLAR AZIMUTH DEGREE TRUE 2 0 16 005040 ORBIT NUMBER NUMERIC 0 0 24 005041 SCAN LINE NUMBER NUMERIC 0 0 8 005043 FIELD OF VIEW NUMBER NUMERIC 0 0 8 006001 LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26 006015 LONGITUDE DISPLACEMENT (HIGH ACCURACY) DEGREE 5 -18000000 26 007002 HEIGHT OR ALTITUDE M -1 -40 16 007004 PRESSURE PA -1 0 14 007007 HEIGHT M 0 -1000 17 007010 FLIGHT LEVEL M 0 -1024 16 007024 SATELLITE ZENITH ANGLE DEGREE 2 -9000 15 007025 SOLAR ZENITH ANGLE DEGREE 2 -9000 15 007030 HEIGHT OF STATION GROUND ABOVE MEAN SEA LEVEL (SEE NOTE 3) M 1 -4000 17 007031 HEIGHT OF BAROMETER ABOVE MEAN SEA LEVEL (SEE NOTE 4) M 1 - 4000 17 007032 HEIGHT OF SENSOR ABOVE LOCAL GROUND (OR DECK OF MARINE PLATFORM) M 2 0 16 007192 [SIM] First level type NUMERIC 0 0 10 007193 [SIM] Level L1 NUMERIC 0 -536870912 31 007194 [SIM] Level L2 NUMERIC 0 -536870912 31 007195 [SIM] Second level type NUMERIC 0 0 31 008002 VERTICAL SIGNIFICANCE (SURFACE OBSERVATIONS) CODE TABLE 8002 0 0 6 008004 PHASE OF AIRCRAFT FLIGHT CODE TABLE 8004 0 0 3 008009 DETAILED PHASE OF FLIGHT CODE TABLE 8009 0 0 4 008021 TIME SIGNIFICANCE CODE TABLE 8021 0 0 5 008042 EXTENDED VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8042 0 0 18 008044 (VAL) CAS REGISTRY NUMBER CCITTIA5 0 0 88 010004 PRESSURE PA -1 0 14 010007 HEIGHT M 0 -1000 17 010008 GEOPOTENTIAL M**2/S**2 0 -10000 20 010051 PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14 010052 ALTIMETER SETTING (QNH) PA -1 0 14 010060 PRESSURE CHANGE PA -1 -1024 11 010063 CHARACTERISTIC OF PRESSURE TENDENCY CODE TABLE 10063 0 0 4 010197 ANEMOMETER HEIGHT M 0 0 9 011001 WIND DIRECTION DEGREE TRUE 0 0 9 011002 WIND SPEED M/S 1 0 12 011003 U-COMPONENT M/S 1 -4096 13 011004 V-COMPONENT M/S 1 -4096 13 011005 W-COMPONENT PA/S 1 -512 10 011006 W-COMPONENT M/S 2 -4096 13 011016 EXTREME COUNTERCLOCKWISE WIND DIRECTION OF A VARIABLE WIND DEGREE TRUE 0 0 9 011017 EXTREME CLOCKWISE WIND DIRECTION OF A VARIABLE WIND DEGREE TRUE 0 0 9 011031 DEGREE OF TURBULENCE CODE TABLE 11031 0 0 4 011037 TURBULENCE INDEX CODE TABLE 11037 0 0 6 011039 EXTENDED TIME OF OCCURRENCE OF PEAK EDDY DISSIPATION RATE CODE TABLE 11039 0 0 6 011041 MAXIMUM WIND GUST SPEED M/S 1 0 12 011043 MAXIMUM WIND GUST DIRECTION DEGREE TRUE 0 0 9 011061 ABSOLUTE WIND SHEAR IN 1 KM LAYER BELOW M/S 1 0 12 011062 ABSOLUTE WIND SHEAR IN 1 KM LAYER ABOVE M/S 1 0 12 011075 MEAN TURBULENCE INTENSITY (EDDY DISSIPATION RATE) M**(2/3)/S 2 0 8 011076 PEAK TURBULENCE INTENSITY (EDDY DISSIPATION RATE) M**(2/3)/S 2 0 8 011077 REPORTING INTERVAL OR AVERAGING TIME FOR EDDY DISSIPATION RATE S 0 0 12 011192 [SIM] W-component terrain following M/S 2 -4096 13 011193 [SIM] Stability class NUMERIC 0 0 4 011194 [SIM] Friction velocity (calmet) M/S 3 0 14 011195 [SIM] Mixing height (calmet) M 0 0 12 011196 [SIM] Obukov lenght (calmet) M 1 -100000 15 011197 [SIM] Convective velocitiy scale (calmet) M/S 3 0 14 011198 [SIM] SQRT(2*TKE) M/S 4 0 20 011199 [SIM] Surface Roughness M 3 0 14 011200 [SIM] U-component of momentum flux N/M**2 4 -524288 20 011201 [SIM] V-component of momentum flux N/M**2 4 -524288 20 011202 [SIM] Friction velocity (diagmet) M/S 3 0 14 011203 [SIM] Mixing height (diagmet) M 0 0 12 011204 [SIM] Obukov lenght (diagmet) M 1 -100000 15 011205 [SIM] Convective velocitiy scale (diagmet) M/S 3 0 14 011206 [SIM] Friction velocity (COSMO) M/S 3 0 14 011207 [SIM] Obukov lenght (COSMO) M 1 -100000 15 012002 WET-BULB TEMPERATURE K 1 0 12 012030 SOIL TEMPERATURE K 1 0 12 012061 SKIN TEMPERATURE K 1 0 12 012063 BRIGHTNESS TEMPERATURE K 1 0 12 012101 TEMPERATURE/DRY-BULB TEMPERATURE K 2 0 16 012103 DEW-POINT TEMPERATURE K 2 0 16 012121 GROUND MINIMUM TEMPERATURE K 2 0 16 012192 POTENTIAL TEMPERATURE K 2 0 16 013001 SPECIFIC HUMIDITY KG/KG 5 0 14 013002 MIXING RATIO KG/KG 5 0 14 013003 RELATIVE HUMIDITY % 0 0 7 013011 TOTAL PRECIPITATION / TOTAL WATER EQUIVALENT KG/M**2 1 -1 14 013013 TOTAL SNOW DEPTH M 3 -20 20 013031 EVAPOTRANSPIRATION KG/M**2 1 0 7 013033 EVAPORATION/EVAPOTRANSPIRATION KG/M**2 1 0 10 013192 [SIM] Cloud liquid water content KG/KG 8 0 27 013193 [SIM] Cloud ice content KG/KG 8 0 27 013195 [SIM] Precipitating liquid water KG/KG 8 0 27 013196 [SIM] Precipitating ice KG/KG 8 0 27 013197 [SIM] Total precipitating water+ice KG/KG 8 0 27 013198 [SIM] Total liquid water (cloud+precipitating) KG/KG 8 0 27 013199 [SIM] Total ice (cloud+precipitating) KG/KG 8 0 27 013200 [SIM] Grid-scale liquid precipitation KG/M**2 1 -1 14 013201 [SIM] Grid-scale snowfall KG/M**2 1 -1 14 013202 [SIM] Convective liquid precipitation KG/M**2 1 -1 14 013203 [SIM] Convective snowfall KG/M**2 1 -1 14 013204 [SIM] Total convective precipitation (liquid + snow) KG/M**2 1 -1 14 013205 [SIM] Snowfall (grid-scale + convective) KG/M**2 1 -1 14 013206 [SIM] Soil water content KG/M**2 1 0 14 013212 [SIM] Leaf wetness duration S -1 0 24 014016 NET RADIATION J/M**2 -4 -16384 15 014017 INSTANTANEOUS LONG-WAVE RADIATION (incoming) W/M**2 0 -2048 12 014018 INSTANTANEOUS SHORT-WAVE RADIATION (incoming) W/M**2 0 -2048 12 014019 SURFACE ALBEDO % 0 0 7 014021 GLOBAL SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15 014031 TOTAL SUNSHINE MINUTE 0 0 11 014192 [SIM] Instantenous sensible heat flux W/m**2 0 -1024 11 014193 [SIM] Instantenous latent heat flux W/m**2 0 -1024 11 014194 [SIM] Instantenous direct solar radiation W/M**2 0 -2048 12 014195 [SIM] Instantenous diffuse solar radiation W/M**2 0 -2048 12 014196 [SIM] INSTANTANEOUS NET LONG-WAVE RADIATION W/M**2 0 -2048 12 014197 [SIM] INSTANTANEOUS NET SHORT-WAVE RADIATION W/M**2 0 -2048 12 015192 [SIM] NO Concentration KG/M**3 10 0 20 015193 [SIM] NO2 Concentration KG/M**3 10 0 20 015194 [SIM] O3 Concentration KG/M**3 10 0 20 015195 [SIM] PM10 Concentration KG/M**3 10 0 20 015196 [SIM] CO Concentration KG/M**3 10 0 20 015197 [SIM] SO2 Concentration KG/M**3 10 0 20 015198 [SIM] PM2.5 Concentration KG/M**3 10 0 20 015199 [SIM] NOY Concentration KG/M**3 10 0 20 015200 [SIM] HCNM Concentration KG/M**3 10 0 20 015201 [SIM] ALDE Concentration KG/M**3 10 0 20 015202 [SIM] PM5 Concentration (tot. aerosol < 5 ug) KG/M**3 10 0 20 015203 [SIM] PM1 Concentration (tot. aerosol < 1.25 ug) KG/M**3 10 0 20 015204 [SIM] PM06 Concentration (tot. aerosol < 0.6 ug) KG/M**3 10 0 20 015205 [SIM] PM03 Concentration (tot. aerosol < 0.3 ug) KG/M**3 10 0 20 015206 [SIM] PM015 Concentration (tot. aerosol < 0.15 ug) KG/M**3 10 0 20 015207 [SIM] PM008 Concentration (tot. aerosol < 0.08 ug) KG/M**3 10 0 20 015208 [SIM] Concentration of primary particulate matter in PM10 KG/M**3 10 0 20 015209 [SIM] Concentration of sulfate in PM10 KG/M**3 10 0 20 015210 [SIM] Concentration of nitrate in PM10 KG/M**3 10 0 20 015211 [SIM] Concentration of ammonium in PM10 KG/M**3 10 0 20 015212 [SIM] Concentration of black carbon in PM10 KG/M**3 10 0 20 015213 [SIM] Concentration of organic carbon in PM10 KG/M**3 10 0 20 015214 [SIM] Concentration of dust in PM10 KG/M**3 10 0 20 015215 [SIM] Concentration of anthrop. A1D in PM10 KG/M**3 10 0 20 015216 [SIM] Concentration of anthrop. BmP in PM10 KG/M**3 10 0 20 015217 [SIM] Concentration of biogenic A1D in PM10 KG/M**3 10 0 20 015218 [SIM] Concentration of biogenic BmP in PM10 KG/M**3 10 0 20 015219 [SIM] Concentration of water in PM10 KG/M**3 10 0 20 015220 [SIM] Concentration of sea salt in PM10 KG/M**3 10 0 20 015221 [SIM] Concentration of secondary organic aerosol in PM10 KG/M**3 10 0 20 015222 [SIM] Total concentration of primary aerosol in PM10 KG/M**3 10 0 20 015223 [SIM] Total concentration of secondary aerosol in PM10 KG/M**3 10 0 20 015224 [SIM] Uncertainity in O3 estimate (Pesco) KG/M**3 10 0 20 015225 [SIM] Uncertainity in PM10 estimate (Pesco) KG/M**3 10 0 20 015226 [SIM] Uncertainity in NO2 estimate (Pesco) KG/M**3 10 0 20 015227 [SIM] Uncertainity in PM2.5 estimate (Pesco) KG/M**3 10 0 20 015228 [SIM] NH3 Concentration KG/M**3 10 0 20 015229 [SIM] Concentration of primary part. matter in aerosol KG/M**3 10 0 20 015230 [SIM] Concentration of sulfate in aerosol KG/M**3 10 0 20 015231 [SIM] Concentration of nitrate in aerosol KG/M**3 10 0 20 015232 [SIM] Concentration of ammonium in aerosol KG/M**3 10 0 20 015233 [SIM] Concentration of anthrop. sec. org. in aerosol KG/M**3 10 0 20 015234 [SIM] Concentration of biogenic sec. org. in aerosol KG/M**3 10 0 20 015235 [SIM] Concentration of ISOPA1 in PM10 KG/M**3 10 0 20 020001 HORIZONTAL VISIBILITY M -1 0 13 020003 PRESENT WEATHER (SEE NOTE 1) CODE TABLE 20003 0 0 9 020004 PAST WEATHER (1) (SEE NOTE 2) CODE TABLE 20004 0 0 5 020005 PAST WEATHER (2) (SEE NOTE 2) CODE TABLE 20005 0 0 5 020009 GENERAL WEATHER INDICATOR (TAF/METAR) CODE TABLE 20009 0 0 4 020010 CLOUD COVER (TOTAL) % 0 0 7 020011 CLOUD AMOUNT CODE TABLE 20011 0 0 4 020012 CLOUD TYPE CODE TABLE 20012 0 0 6 020013 HEIGHT OF BASE OF CLOUD M 0 -400 17 020017 CLOUD TOP DESCRIPTION CODE TABLE 20017 0 0 4 020019 SIGNIFICANT PRESENT OR FORECAST WEATHER CCITTIA5 0 0 72 020021 TYPE OF PRECIPITATION FLAG TABLE 20021 0 0 30 020042 AIRFRAME ICING PRESENT CODE TABLE 20042 0 0 2 020043 PEAK LIQUID WATER CONTENT KG/M**3 4 0 7 020044 AVERAGE LIQUID WATER CONTENT KG/M**3 4 0 7 020045 SUPERCOOLED LARGE DROPLET (SLD) CONDITIONS CODE TABLE 20045 0 0 2 020062 STATE OF THE GROUND (WITH OR WITHOUT SNOW) CODE TABLE 20062 0 0 5 020193 [SIM] Cloud type (METAR) CCITTIA5 0 0 16 022001 DIRECTION OF WAVES DEGREE TRUE 0 0 9 022011 PERIOD OF WAVES S 0 0 6 022012 PERIOD OF WIND WAVES S 0 0 6 022021 HEIGHT OF WAVES M 1 0 10 022022 HEIGHT OF WIND WAVES M 1 0 10 022037 Tidal elevation with respect to national land datum M 3 -10000 15 022043 SEA/WATER TEMPERATURE K 2 0 15 022070 SIGNIFICANT WAVE HEIGHT M 2 0 13 022071 SPECTRAL PEAK WAVE PERIOD S 1 0 9 022074 AVERAGE WAVE PERIOD S 1 0 9 023192 [SIM] Dry deposition of H2SO4 MOL/M**2 5 0 20 023193 [SIM] Wet deposition of H2SO4 MOL/M**2 5 0 20 023194 [SIM] Dry deposition of NH4 MOL/M**2 5 0 20 023195 [SIM] Wet deposition of NH4 MOL/M**2 5 0 20 023196 [SIM] Dry deposition of HNO3 MOL/M**2 5 0 20 023197 [SIM] Wet deposition of HNO3 MOL/M**2 5 0 20 025076 LOG-10 OF (TEMP-RAD CENTRAL WAVENUMBER) FOR ATOVS LOGM-1 8 0 30 029192 [SIM] Land fraction % 1 0 10 031000 SHORT DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 1 031001 DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 8 031002 EXTENDED DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 16 031011 DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 8 031012 EXTENDED DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 16 031021 ASSOCIATED FIELD SIGNIFICANCE CODE TABLE 31021 0 0 6 031031 DATA PRESENT INDICATOR FLAG TABLE 31031 0 0 1 033002 QUALITY INFORMATION CODE TABLE 33002 0 0 2 033003 QUALITY INFORMATION CODE TABLE 33003 0 0 3 033005 QUALITY INFORMATION (AWS DATA) FLAG TABLE 33005 0 0 30 033006 INTERNAL MEASUREMENT STATUS INFORMATION (AWS) CODE TABLE 33006 0 0 3 033007 PER CENT CONFIDENCE % 0 0 7 033015 DATA QUALITY CHECK INDICATOR CODE TABLE 33015 0 0 6 033020 QUALITY CONTROL INDICATION OF FOLLOWING VALUE CODE TABLE 33020 0 0 3 033021 QUALITY OF FOLLOWING VALUE CODE TABLE 33021 0 0 2 033022 QUALITY OF BUOY SATELLITE TRANSMISSION CODE TABLE 33022 0 0 2 033023 QUALITY OF BUOY LOCATION CODE TABLE 33023 0 0 2 033024 STATION ELEVATION QUALITY MARK (FOR MOBILE STATIONS) CODE TABLE 33024 0 0 4 033025 ACARS INTERPOLATED VALUES CODE TABLE 33025 0 0 3 033026 MOISTURE QUALITY CODE TABLE 33026 0 0 6 033027 LOCATION QUALITY CLASS (RANGE OF RADIUS OF 66 % CONFIDENCE) CODE TABLE 33027 0 0 3 033030 SCAN LINE STATUS FLAGS FOR ATOVS FLAG TABLE 33030 0 0 24 033031 SCAN LINE QUALITY FLAGS FOR ATOVS FLAG TABLE 33031 0 0 24 033032 CHANNEL QUALITY FLAGS FOR ATOVS FLAG TABLE 33032 0 0 24 033033 FIELD OF VIEW QUALITY FLAGS FOR ATOVS FLAG TABLE 33033 0 0 24 033035 MANUAL/AUTOMATIC QUALITY CONTROL CODE TABLE 33035 0 0 4 033036 NOMINAL CONFIDENCE THRESHOLD % 0 0 7 033037 WIND CORRELATION ERROR FLAG TABLE 33037 0 0 20 033038 QUALITY FLAGS FOR GROUND-BASED GNSS DATA FLAG TABLE 33038 0 0 10 033040 CONFIDENCE INTERVAL % 0 0 7 033041 ATTRIBUTE OF FOLLOWING VALUE CODE TABLE 33041 0 0 2 033050 GLOBAL GTSPP QUALITY FLAG CODE TABLE 33050 0 0 4 033192 [SIM] Climatological and consistency check % 0 0 7 033193 [SIM] Time consistency % 0 0 7 033194 [SIM] Space consistency % 0 0 7 033195 [SIM] MeteoDB variable ID NUMERIC 0 0 24 033196 [SIM] Data has been invalidated CODE TABLE 33196 0 0 2 033197 [SIM] Manual replacement in substitution CODE TABLE 33197 0 0 2 033198 [SIM] Observation increment NUMERIC 4 -1073741823 31 033201 [SIM] Kalman coefficient, state vector (s.v.) x1 NUMERIC 4 -1073741823 31 033202 [SIM] Kalman coefficient, state vector (s.v.) x2 NUMERIC 4 -1073741823 31 033203 [SIM] Kalman coefficient, s.v. error covariance matrix(1,1) NUMERIC 4 -1073741823 31 033204 [SIM] Kalman coefficient, s.v. error covariance matrix(1,2) NUMERIC 4 -1073741823 31 033205 [SIM] Kalman coefficient, s.v. error covariance matrix(2,1) NUMERIC 4 -1073741823 31 033206 [SIM] Kalman coefficient, s.v. error covariance matrix(2,2) NUMERIC 4 -1073741823 31 033207 [SIM] Kalman observation sequential counter NUMERIC 0 -127 8 033208 [SIM] Kalman osservation missing counter NUMERIC 0 -127 8 033209 [SIM] Normalized Density Index % 0 0 7 dballe-5.18/tables/B000299.txt0000644000175000017500000013005511754230765012511 00000000000000 001001 WMO BLOCK NUMBER NUMERIC 0 0 7 NUMERIC 0 2 001002 WMO STATION NUMBER NUMERIC 0 0 10 NUMERIC 0 3 001006 AIRCRAFT FLIGHT NUMBER CCITTIA5 0 0 64 CHARACTER 0 8 001007 SATELLITE IDENTIFIER CODE TABLE 1007 0 0 10 CODE TABLE 1007 0 3 001008 AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION CCITTIA5 0 0 64 CHARACTER 0 8 001011 SHIP OR MOBILE LAND STATION IDENTIFIER CCITTIA5 0 0 72 CHARACTER 0 9 001012 DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 001013 SPEED OF MOTION OF MOVING OBSERVING PLATFORM* M/S 0 0 10 M/S 0 3 001019 LONG STATION OR SITE NAME CCITTIA5 0 0 256 CHARACTER 0 32 001023 OBSERVATION SEQUENCE NUMBER NUMERIC 0 0 9 NUMERIC 0 3 001063 ICAO LOCATION INDICATOR CCITTIA5 0 0 64 CHARACTER 0 8 001192 [SIM] MeteoDB station ID NUMERIC 0 0 24 NUMERIC 0 8 001193 [SIM] Report code NUMERIC 0 0 16 NUMERIC 0 5 001194 [SIM] Report mnemonic CCITTIA5 0 0 128 CHARACTER 0 16 001212 AIR QUALITY OBSERVING STATION LOCAL CODE CCITTIA5 0 0 56 CHARACTER 0 7 001213 AIRBASE AIR QUALITY OBSERVING STATION CODE CCITTIA5 0 0 56 CHARACTER 0 7 001214 GEMS AIR QUALITY OBSERVING STATION CODE CCITTIA5 0 0 48 CHARACTER 0 6 001215 AIR QUALITY OBSERVING STATION DOMINANT EMISSION SOURCE CODE TABLE 001215 0 0 3 CODE TABLE 001215 0 1 001216 AIR QUALITY OBSERVING STATION AREA TYPE CODE TABLE 001216 0 0 3 CODE TABLE 001216 0 1 001217 AIR QUALITY OBSERVING STATION TERRAIN TYPE CODE TABLE 001217 0 0 4 CODE TABLE 001217 0 2 002001 TYPE OF STATION CODE TABLE 2001 0 0 2 CODE TABLE 2001 0 1 002002 TYPE OF INSTRUMENTATION FOR WIND MEASUREMENT FLAG TABLE 2002 0 0 4 FLAG TABLE 2002 0 2 002003 TYPE OF MEASURING EQUIPMENT USED CODE TABLE 2003 0 0 4 CODE TABLE 2003 0 2 002004 TYPE OF INSTRUMENTATION FOR EVAPORATION MEASUREMENT OR TYPE OF C CODE TABLE 2004 0 0 4 CODE TABLE 2004 0 2 002005 PRECISION OF TEMPERATURE OBSERVATION K 2 0 7 K 2 3 002011 RADIOSONDE TYPE CODE TABLE 2011 0 0 8 CODE TABLE 2011 0 3 002012 RADIOSONDE COMPUTATIONAL METHOD CODE TABLE 2012 0 0 4 CODE TABLE 2012 0 2 002013 SOLAR AND INFRARED RADIATION CORRECTION CODE TABLE 2013 0 0 4 CODE TABLE 2013 0 2 002014 TRACKING TECHNIQUE/STATUS OF SYSTEM USED CODE TABLE 2014 0 0 7 CODE TABLE 2014 0 3 002048 SATELLITE SENSOR INDICATOR CODE TABLE 2048 0 0 4 CODE TABLE 2048 0 2 002061 AIRCRAFT NAVIGATIONAL SYSTEM CODE TABLE 2061 0 0 3 CODE TABLE 2061 0 1 002062 TYPE OF AIRCRAFT DATA RELAY SYSTEM CODE TABLE 2062 0 0 4 CODE TABLE 2062 0 2 002063 AIRCRAFT ROLL ANGLE DEGREE 2 -18000 16 DEGREE 2 5 002064 AIRCRAFT ROLL ANGLE QUALITY CODE TABLE 2064 0 0 2 CODE TABLE 2064 0 1 002070 ORIGINAL SPECIFICATION OF LATITUDE/LONGITUDE CODE TABLE 2070 0 0 4 CODE TABLE 2070 0 2 004001 YEAR YEAR 0 0 12 YEAR 0 4 004002 MONTH MONTH 0 0 4 MONTH 0 2 004003 DAY DAY 0 0 6 DAY 0 2 004004 HOUR HOUR 0 0 5 HOUR 0 2 004005 MINUTE MINUTE 0 0 6 MINUTE 0 2 004006 SECOND SECOND 0 0 6 SECOND 0 2 004086 LONG TIME PERIOD OR DISPLACEMENT SECOND 0 -8192 15 SECOND 0 5 004192 [SIM] Time range type NUMERIC 0 0 10 NUMERIC 0 4 004193 [SIM] Time range P1 NUMERIC 0 -536870912 31 NUMERIC 0 10 004194 [SIM] Time range P2 NUMERIC 0 -536870912 31 NUMERIC 0 10 005001 LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7 005015 LATITUDE DISPLACEMENT (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7 005021 BEARING OR AZIMUTH DEGREE TRUE 2 0 16 DEGREE TRUE 2 5 005022 SOLAR AZIMUTH DEGREE TRUE 2 0 16 DEGREE TRUE 2 5 005040 ORBIT NUMBER NUMERIC 0 0 24 NUMERIC 0 8 005041 SCAN LINE NUMBER NUMERIC 0 0 8 NUMERIC 0 3 005043 FIELD OF VIEW NUMBER NUMERIC 0 0 8 NUMERIC 0 3 006001 LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8 006015 LONGITUDE DISPLACEMENT (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8 007002 HEIGHT OR ALTITUDE M -1 -40 16 M -1 5 007004 PRESSURE PA -1 0 14 PA -1 5 007007 HEIGHT M 0 -1000 17 M 0 6 007010 FLIGHT LEVEL M 0 -1024 16 FT -1 5 007024 SATELLITE ZENITH ANGLE DEGREE 2 -9000 15 DEGREE 2 5 007025 SOLAR ZENITH ANGLE DEGREE 2 -9000 15 DEGREE 2 5 007030 HEIGHT OF STATION GROUND ABOVE MEAN SEA LEVEL (SEE NOTE 3) M 1 -4000 17 M 1 5 007031 HEIGHT OF BAROMETER ABOVE MEAN SEA LEVEL (SEE NOTE 4) M 1 - 4000 17 M 1 5 007032 HEIGHT OF SENSOR ABOVE LOCAL GROUND (OR DECK OF MARINE PLATFORM) M 2 0 16 M 2 5 007192 [SIM] First level type NUMERIC 0 0 10 NUMERIC 0 4 007193 [SIM] Level L1 NUMERIC 0 -536870912 31 NUMERIC 0 10 007194 [SIM] Level L2 NUMERIC 0 -536870912 31 NUMERIC 0 10 007195 [SIM] Second level type NUMERIC 0 0 31 NUMERIC 0 4 008002 VERTICAL SIGNIFICANCE (SURFACE OBSERVATIONS) CODE TABLE 8002 0 0 6 CODE TABLE 8002 0 2 008004 PHASE OF AIRCRAFT FLIGHT CODE TABLE 8004 0 0 3 CODE TABLE 8004 0 1 008009 DETAILED PHASE OF FLIGHT CODE TABLE 8009 0 0 4 CODE TABLE 8009 0 2 008021 TIME SIGNIFICANCE CODE TABLE 8021 0 0 5 CODE TABLE 8021 0 2 008042 EXTENDED VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8042 0 0 18 FLAG TABLE 8042 0 6 008044 (VAL) CAS REGISTRY NUMBER CCITTIA5 0 0 88 CHARACTER 0 11 010004 PRESSURE PA -1 0 14 PA -1 5 010007 HEIGHT M 0 -1000 17 M 0 6 010008 GEOPOTENTIAL M**2/S**2 0 -10000 20 M**2/S**2 0 7 010051 PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14 PA -1 5 010052 ALTIMETER SETTING (QNH) PA -1 0 14 PA -1 5 010060 PRESSURE CHANGE PA -1 -1024 11 PA -1 4 010063 CHARACTERISTIC OF PRESSURE TENDENCY CODE TABLE 10063 0 0 4 CODE TABLE 10063 0 2 010197 ANEMOMETER HEIGHT M 0 0 9 M 0 3 011001 WIND DIRECTION DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 011002 WIND SPEED M/S 1 0 12 M/S 1 4 011003 U-COMPONENT M/S 1 -4096 13 M/S 1 4 011004 V-COMPONENT M/S 1 -4096 13 M/S 1 4 011005 W-COMPONENT PA/S 1 -512 10 PA/S 1 4 011006 W-COMPONENT M/S 2 -4096 13 M/S 2 4 011016 EXTREME COUNTERCLOCKWISE WIND DIRECTION OF A VARIABLE WIND DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 011017 EXTREME CLOCKWISE WIND DIRECTION OF A VARIABLE WIND DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 011031 DEGREE OF TURBULENCE CODE TABLE 11031 0 0 4 CODE TABLE 11031 0 2 011037 TURBULENCE INDEX CODE TABLE 11037 0 0 6 CODE TABLE 11037 0 2 011039 EXTENDED TIME OF OCCURRENCE OF PEAK EDDY DISSIPATION RATE CODE TABLE 11039 0 0 6 CODE TABLE 11039 0 2 011041 MAXIMUM WIND GUST SPEED M/S 1 0 12 M/S 1 4 011043 MAXIMUM WIND GUST DIRECTION DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 011061 ABSOLUTE WIND SHEAR IN 1 KM LAYER BELOW M/S 1 0 12 M/S 1 4 011062 ABSOLUTE WIND SHEAR IN 1 KM LAYER ABOVE M/S 1 0 12 M/S 1 4 011075 MEAN TURBULENCE INTENSITY (EDDY DISSIPATION RATE) M**(2/3)/S 2 0 8 M**(2/3)/S 2 3 011076 PEAK TURBULENCE INTENSITY (EDDY DISSIPATION RATE) M**(2/3)/S 2 0 8 M**(2/3)/S 2 3 011077 REPORTING INTERVAL OR AVERAGING TIME FOR EDDY DISSIPATION RATE S 0 0 12 S 0 4 011192 [SIM] W-component terrain following M/S 2 -4096 13 M/S 2 4 011193 [SIM] Stability class NUMERIC 0 0 4 NUMERIC 0 2 011194 [SIM] Friction velocity (calmet) M/S 3 0 14 M/S 3 4 011195 [SIM] Mixing height (calmet) M 0 0 12 M 0 4 011196 [SIM] Obukov lenght (calmet) M 1 -100000 15 M 1 5 011197 [SIM] Convective velocitiy scale (calmet) M/S 3 0 14 M/S 3 4 011198 [SIM] SQRT(2*TKE) M/S 4 0 20 M/S 4 6 011199 [SIM] Surface Roughness M 3 0 14 M 1 4 011200 [SIM] U-component of momentum flux N/M**2 4 -524288 20 N/M**2 4 6 011201 [SIM] V-component of momentum flux N/M**2 4 -524288 20 N/M**2 4 6 011202 [SIM] Friction velocity (diagmet) M/S 3 0 14 M/S 3 4 011203 [SIM] Mixing height (diagmet) M 0 0 12 M 0 4 011204 [SIM] Obukov lenght (diagmet) M 1 -100000 15 M 1 5 011205 [SIM] Convective velocitiy scale (diagmet) M/S 3 0 14 M/S 3 4 011206 [SIM] Friction velocity (COSMO) M/S 3 0 14 M/S 3 4 011207 [SIM] Obukov lenght (COSMO) M 1 -100000 15 M 1 5 012002 WET-BULB TEMPERATURE K 1 0 12 K 1 4 012030 SOIL TEMPERATURE K 1 0 12 K 1 4 012061 SKIN TEMPERATURE K 1 0 12 K 1 4 012063 BRIGHTNESS TEMPERATURE K 1 0 12 K 1 4 012101 TEMPERATURE/DRY-BULB TEMPERATURE K 2 0 16 K 2 5 012103 DEW-POINT TEMPERATURE K 2 0 16 K 2 5 012121 GROUND MINIMUM TEMPERATURE K 2 0 16 C 2 4 012192 POTENTIAL TEMPERATURE K 2 0 16 K 2 5 013001 SPECIFIC HUMIDITY KG/KG 5 0 14 KG/KG 5 5 013002 MIXING RATIO KG/KG 5 0 14 KG/KG 5 5 013003 RELATIVE HUMIDITY % 0 0 7 % 0 3 013011 TOTAL PRECIPITATION / TOTAL WATER EQUIVALENT KG/M**2 1 -1 14 KG/M**2 1 5 013013 TOTAL SNOW DEPTH M 3 -20 20 M 3 6 013031 EVAPOTRANSPIRATION KG/M**2 1 0 7 KG/M**2 0 3 013033 EVAPORATION/EVAPOTRANSPIRATION KG/M**2 1 0 10 KG/M**2 1 4 013192 [SIM] Cloud liquid water content KG/KG 8 0 27 KG/KG 8 8 013193 [SIM] Cloud ice content KG/KG 8 0 27 KG/KG 8 8 013195 [SIM] Precipitating liquid water KG/KG 8 0 27 KG/KG 8 8 013196 [SIM] Precipitating ice KG/KG 8 0 27 KG/KG 8 8 013197 [SIM] Total precipitating water+ice KG/KG 8 0 27 KG/KG 8 8 013198 [SIM] Total liquid water (cloud+precipitating) KG/KG 8 0 27 KG/KG 8 8 013199 [SIM] Total ice (cloud+precipitating) KG/KG 8 0 27 KG/KG 8 8 013200 [SIM] Grid-scale liquid precipitation KG/M**2 1 -1 14 KG/M**2 1 5 013201 [SIM] Grid-scale snowfall KG/M**2 1 -1 14 KG/M**2 1 5 013202 [SIM] Convective liquid precipitation KG/M**2 1 -1 14 KG/M**2 1 5 013203 [SIM] Convective snowfall KG/M**2 1 -1 14 KG/M**2 1 5 013204 [SIM] Total convective precipitation (liquid + snow) KG/M**2 1 -1 14 KG/M**2 1 5 013205 [SIM] Snowfall (grid-scale + convective) KG/M**2 1 -1 14 KG/M**2 1 5 013206 [SIM] Soil water content KG/M**2 1 0 14 KG/M**2 1 5 013212 [SIM] Leaf wetness duration S -1 0 24 S -1 7 014016 NET RADIATION J/M**2 -4 -16384 15 J/M**2 -4 5 014017 INSTANTANEOUS LONG-WAVE RADIATION (incoming) W/M**2 0 -2048 12 W/M**2 0 4 014018 INSTANTANEOUS SHORT-WAVE RADIATION (incoming) W/M**2 0 -2048 12 W/M**2 -3 4 014019 SURFACE ALBEDO % 0 0 7 % 0 3 014021 GLOBAL SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15 J/M**2 -4 5 014031 TOTAL SUNSHINE MINUTE 0 0 11 MINUTE 0 4 014192 [SIM] Instantenous sensible heat flux W/m**2 0 -1024 11 W/M**2 0 4 014193 [SIM] Instantenous latent heat flux W/m**2 0 -1024 11 W/M**2 0 4 014194 [SIM] Instantenous direct solar radiation W/M**2 0 -2048 12 W/M**2 -3 4 014195 [SIM] Instantenous diffuse solar radiation W/M**2 0 -2048 12 W/M**2 -3 4 014196 [SIM] INSTANTANEOUS NET LONG-WAVE RADIATION W/M**2 0 -2048 12 W/M**2 0 4 014197 [SIM] INSTANTANEOUS NET SHORT-WAVE RADIATION W/M**2 0 -2048 12 W/M**2 -3 4 015192 [SIM] NO Concentration KG/M**3 10 0 20 KG/M**3 10 6 015193 [SIM] NO2 Concentration KG/M**3 10 0 20 KG/M**3 10 6 015194 [SIM] O3 Concentration KG/M**3 10 0 20 KG/M**3 10 6 015195 [SIM] PM10 Concentration KG/M**3 10 0 20 KG/M**3 10 6 015196 [SIM] CO Concentration KG/M**3 10 0 20 KG/M**3 10 6 015197 [SIM] SO2 Concentration KG/M**3 10 0 20 KG/M**3 10 6 015198 [SIM] PM2.5 Concentration KG/M**3 10 0 20 KG/M**3 10 6 015199 [SIM] NOY Concentration KG/M**3 10 0 20 KG/M**3 10 6 015200 [SIM] HCNM Concentration KG/M**3 10 0 20 KG/M**3 10 6 015201 [SIM] ALDE Concentration KG/M**3 10 0 20 KG/M**3 10 6 015202 [SIM] PM5 Concentration (tot. aerosol < 5 ug) KG/M**3 10 0 20 KG/M**3 10 6 015203 [SIM] PM1 Concentration (tot. aerosol < 1.25 ug) KG/M**3 10 0 20 KG/M**3 10 6 015204 [SIM] PM06 Concentration (tot. aerosol < 0.6 ug) KG/M**3 10 0 20 KG/M**3 10 6 015205 [SIM] PM03 Concentration (tot. aerosol < 0.3 ug) KG/M**3 10 0 20 KG/M**3 10 6 015206 [SIM] PM015 Concentration (tot. aerosol < 0.15 ug) KG/M**3 10 0 20 KG/M**3 10 6 015207 [SIM] PM008 Concentration (tot. aerosol < 0.08 ug) KG/M**3 10 0 20 KG/M**3 10 6 015208 [SIM] Concentration of primary particulate matter in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015209 [SIM] Concentration of sulfate in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015210 [SIM] Concentration of nitrate in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015211 [SIM] Concentration of ammonium in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015212 [SIM] Concentration of black carbon in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015213 [SIM] Concentration of organic carbon in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015214 [SIM] Concentration of dust in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015215 [SIM] Concentration of anthrop. A1D in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015216 [SIM] Concentration of anthrop. BmP in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015217 [SIM] Concentration of biogenic A1D in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015218 [SIM] Concentration of biogenic BmP in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015219 [SIM] Concentration of water in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015220 [SIM] Concentration of sea salt in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015221 [SIM] Concentration of secondary organic aerosol in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015222 [SIM] Total concentration of primary aerosol in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015223 [SIM] Total concentration of secondary aerosol in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015224 [SIM] Uncertainity in O3 estimate (Pesco) KG/M**3 10 0 20 KG/M**3 10 6 015225 [SIM] Uncertainity in PM10 estimate (Pesco) KG/M**3 10 0 20 KG/M**3 10 6 015226 [SIM] Uncertainity in NO2 estimate (Pesco) KG/M**3 10 0 20 KG/M**3 10 6 015227 [SIM] Uncertainity in PM2.5 estimate (Pesco) KG/M**3 10 0 20 KG/M**3 10 6 015228 [SIM] NH3 Concentration KG/M**3 10 0 20 KG/M**3 10 6 015229 [SIM] Concentration of primary part. matter in aerosol KG/M**3 10 0 20 KG/M**3 10 6 015230 [SIM] Concentration of sulfate in aerosol KG/M**3 10 0 20 KG/M**3 10 6 015231 [SIM] Concentration of nitrate in aerosol KG/M**3 10 0 20 KG/M**3 10 6 015232 [SIM] Concentration of ammonium in aerosol KG/M**3 10 0 20 KG/M**3 10 6 015233 [SIM] Concentration of anthrop. sec. org. in aerosol KG/M**3 10 0 20 KG/M**3 10 6 015234 [SIM] Concentration of biogenic sec. org. in aerosol KG/M**3 10 0 20 KG/M**3 10 6 015235 [SIM] Concentration of ISOPA1 in PM10 KG/M**3 10 0 20 KG/M**3 10 6 020001 HORIZONTAL VISIBILITY M -1 0 13 M -1 4 020003 PRESENT WEATHER (SEE NOTE 1) CODE TABLE 20003 0 0 9 CODE TABLE 20003 0 3 020004 PAST WEATHER (1) (SEE NOTE 2) CODE TABLE 20004 0 0 5 CODE TABLE 20004 0 2 020005 PAST WEATHER (2) (SEE NOTE 2) CODE TABLE 20005 0 0 5 CODE TABLE 20005 0 2 020009 GENERAL WEATHER INDICATOR (TAF/METAR) CODE TABLE 20009 0 0 4 CODE TABLE 20009 0 2 020010 CLOUD COVER (TOTAL) % 0 0 7 % 0 3 020011 CLOUD AMOUNT CODE TABLE 20011 0 0 4 CODE TABLE 20011 0 2 020012 CLOUD TYPE CODE TABLE 20012 0 0 6 CODE TABLE 20012 0 2 020013 HEIGHT OF BASE OF CLOUD M 0 -400 17 M 0 5 020017 CLOUD TOP DESCRIPTION CODE TABLE 20017 0 0 4 CODE TABLE 20017 0 2 020019 SIGNIFICANT PRESENT OR FORECAST WEATHER CCITTIA5 0 0 72 CHARACTER 0 9 020021 TYPE OF PRECIPITATION FLAG TABLE 20021 0 0 30 FLAG TABLE 20021 0 10 020042 AIRFRAME ICING PRESENT CODE TABLE 20042 0 0 2 CODE TABLE 20042 0 1 020043 PEAK LIQUID WATER CONTENT KG/M**3 4 0 7 KG/M**3 4 2 020044 AVERAGE LIQUID WATER CONTENT KG/M**3 4 0 7 KG/M**3 4 2 020045 SUPERCOOLED LARGE DROPLET (SLD) CONDITIONS CODE TABLE 20045 0 0 2 CODE TABLE 20045 0 2 020062 STATE OF THE GROUND (WITH OR WITHOUT SNOW) CODE TABLE 20062 0 0 5 CODE TABLE 20062 0 2 020193 [SIM] Cloud type (METAR) CCITTIA5 0 0 16 CHARACTER 0 2 022001 DIRECTION OF WAVES DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 022011 PERIOD OF WAVES S 0 0 6 S 0 2 022012 PERIOD OF WIND WAVES S 0 0 6 S 0 2 022021 HEIGHT OF WAVES M 1 0 10 M 1 4 022022 HEIGHT OF WIND WAVES M 1 0 10 M 1 4 022037 Tidal elevation with respect to national land datum M 3 -10000 15 M 3 5 022043 SEA/WATER TEMPERATURE K 2 0 15 K 2 5 022070 SIGNIFICANT WAVE HEIGHT M 2 0 13 M 2 4 022071 SPECTRAL PEAK WAVE PERIOD S 1 0 9 S 1 3 022074 AVERAGE WAVE PERIOD S 1 0 9 S 1 3 023192 [SIM] Dry deposition of H2SO4 MOL/M**2 5 0 20 MOL/M**3 5 6 023193 [SIM] Wet deposition of H2SO4 MOL/M**2 5 0 20 MOL/M**3 5 6 023194 [SIM] Dry deposition of NH4 MOL/M**2 5 0 20 MOL/M**3 5 6 023195 [SIM] Wet deposition of NH4 MOL/M**2 5 0 20 MOL/M**3 5 6 023196 [SIM] Dry deposition of HNO3 MOL/M**2 5 0 20 MOL/M**3 5 6 023197 [SIM] Wet deposition of HNO3 MOL/M**2 5 0 20 MOL/M**3 5 6 025076 LOG-10 OF (TEMP-RAD CENTRAL WAVENUMBER) FOR ATOVS LOGM-1 8 0 30 LOGM-1 8 10 029192 [SIM] Land fraction % 1 0 10 % 1 4 031000 SHORT DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 1 NUMERIC 0 1 031001 DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 8 NUMERIC 0 3 031002 EXTENDED DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 16 NUMERIC 0 5 031011 DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 8 NUMERIC 0 3 031012 EXTENDED DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 16 NUMERIC 0 5 031021 ASSOCIATED FIELD SIGNIFICANCE CODE TABLE 31021 0 0 6 CODE TABLE 31021 0 2 031031 DATA PRESENT INDICATOR FLAG TABLE 31031 0 0 1 FLAG TABLE 31031 0 1 033002 QUALITY INFORMATION CODE TABLE 33002 0 0 2 CODE TABLE 33002 0 1 033003 QUALITY INFORMATION CODE TABLE 33003 0 0 3 CODE TABLE 33003 0 1 033005 QUALITY INFORMATION (AWS DATA) FLAG TABLE 33005 0 0 30 FLAG TABLE 33005 0 10 033006 INTERNAL MEASUREMENT STATUS INFORMATION (AWS) CODE TABLE 33006 0 0 3 CODE TABLE 33006 0 1 033007 PER CENT CONFIDENCE % 0 0 7 % 0 3 033015 DATA QUALITY CHECK INDICATOR CODE TABLE 33015 0 0 6 CODE TABLE 33015 0 2 033020 QUALITY CONTROL INDICATION OF FOLLOWING VALUE CODE TABLE 33020 0 0 3 CODE TABLE 33020 0 1 033021 QUALITY OF FOLLOWING VALUE CODE TABLE 33021 0 0 2 CODE TABLE 33021 0 1 033022 QUALITY OF BUOY SATELLITE TRANSMISSION CODE TABLE 33022 0 0 2 CODE TABLE 33022 0 1 033023 QUALITY OF BUOY LOCATION CODE TABLE 33023 0 0 2 CODE TABLE 33023 0 1 033024 STATION ELEVATION QUALITY MARK (FOR MOBILE STATIONS) CODE TABLE 33024 0 0 4 CODE TABLE 33024 0 2 033025 ACARS INTERPOLATED VALUES CODE TABLE 33025 0 0 3 CODE TABLE 33025 0 1 033026 MOISTURE QUALITY CODE TABLE 33026 0 0 6 CODE TABLE 33026 0 2 033027 LOCATION QUALITY CLASS (RANGE OF RADIUS OF 66 % CONFIDENCE) CODE TABLE 33027 0 0 3 CODE TABLE 33027 0 1 033030 SCAN LINE STATUS FLAGS FOR ATOVS FLAG TABLE 33030 0 0 24 FLAG TABLE 33030 0 8 033031 SCAN LINE QUALITY FLAGS FOR ATOVS FLAG TABLE 33031 0 0 24 FLAG TABLE 33031 0 8 033032 CHANNEL QUALITY FLAGS FOR ATOVS FLAG TABLE 33032 0 0 24 FLAG TABLE 33032 0 8 033033 FIELD OF VIEW QUALITY FLAGS FOR ATOVS FLAG TABLE 33033 0 0 24 FLAG TABLE 33033 0 8 033035 MANUAL/AUTOMATIC QUALITY CONTROL CODE TABLE 33035 0 0 4 CODE TABLE 33035 0 2 033036 NOMINAL CONFIDENCE THRESHOLD % 0 0 7 % 0 3 033037 WIND CORRELATION ERROR FLAG TABLE 33037 0 0 20 FLAG TABLE 33037 0 7 033038 QUALITY FLAGS FOR GROUND-BASED GNSS DATA FLAG TABLE 33038 0 0 10 FLAG TABLE 33038 0 4 033040 CONFIDENCE INTERVAL % 0 0 7 PERCENT 0 3 033041 ATTRIBUTE OF FOLLOWING VALUE CODE TABLE 33041 0 0 2 CODE TABLE 33041 0 1 033050 GLOBAL GTSPP QUALITY FLAG CODE TABLE 33050 0 0 4 CODE TABLE 33050 0 2 033192 [SIM] Climatological and consistency check % 0 0 7 PERCENT 0 3 033193 [SIM] Time consistency % 0 0 7 PERCENT 0 3 033194 [SIM] Space consistency % 0 0 7 PERCENT 0 3 033195 [SIM] MeteoDB variable ID NUMERIC 0 0 24 NUMERIC 0 8 033196 [SIM] Data has been invalidated CODE TABLE 33196 0 0 2 CODE TABLE 33196 0 1 033197 [SIM] Manual replacement in substitution CODE TABLE 33197 0 0 2 CODE TABLE 33197 0 1 033198 [SIM] Observation increment NUMERIC 4 -1073741823 31 NUMERIC 4 10 033201 [SIM] Kalman coefficient, state vector (s.v.) x1 NUMERIC 4 -1073741823 31 NUMERIC 4 10 033202 [SIM] Kalman coefficient, state vector (s.v.) x2 NUMERIC 4 -1073741823 31 NUMERIC 4 10 033203 [SIM] Kalman coefficient, s.v. error covariance matrix(1,1) NUMERIC 4 -1073741823 31 NUMERIC 4 10 033204 [SIM] Kalman coefficient, s.v. error covariance matrix(1,2) NUMERIC 4 -1073741823 31 NUMERIC 4 10 033205 [SIM] Kalman coefficient, s.v. error covariance matrix(2,1) NUMERIC 4 -1073741823 31 NUMERIC 4 10 033206 [SIM] Kalman coefficient, s.v. error covariance matrix(2,2) NUMERIC 4 -1073741823 31 NUMERIC 4 10 033207 [SIM] Kalman observation sequential counter NUMERIC 0 -127 8 NUMERIC 0 3 033208 [SIM] Kalman osservation missing counter NUMERIC 0 -127 8 NUMERIC 0 3 033209 [SIM] Normalized Density Index % 0 0 7 PERCENT 0 3 dballe-5.18/tables/B990204.txt0000644000175000017500000013005511754230765012515 00000000000000 001001 WMO BLOCK NUMBER NUMERIC 0 0 7 NUMERIC 0 2 001002 WMO STATION NUMBER NUMERIC 0 0 10 NUMERIC 0 3 001006 AIRCRAFT FLIGHT NUMBER CCITTIA5 0 0 64 CHARACTER 0 8 001007 SATELLITE IDENTIFIER CODE TABLE 1007 0 0 10 CODE TABLE 1007 0 3 001008 AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION CCITTIA5 0 0 64 CHARACTER 0 8 001011 SHIP OR MOBILE LAND STATION IDENTIFIER CCITTIA5 0 0 72 CHARACTER 0 9 001012 DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 001013 SPEED OF MOTION OF MOVING OBSERVING PLATFORM* M/S 0 0 10 M/S 0 3 001019 LONG STATION OR SITE NAME CCITTIA5 0 0 256 CHARACTER 0 32 001023 OBSERVATION SEQUENCE NUMBER NUMERIC 0 0 9 NUMERIC 0 3 001063 ICAO LOCATION INDICATOR CCITTIA5 0 0 64 CHARACTER 0 8 001192 [SIM] MeteoDB station ID NUMERIC 0 0 24 NUMERIC 0 8 001193 [SIM] Report code NUMERIC 0 0 16 NUMERIC 0 5 001194 [SIM] Report mnemonic CCITTIA5 0 0 128 CHARACTER 0 16 001212 AIR QUALITY OBSERVING STATION LOCAL CODE CCITTIA5 0 0 56 CHARACTER 0 7 001213 AIRBASE AIR QUALITY OBSERVING STATION CODE CCITTIA5 0 0 56 CHARACTER 0 7 001214 GEMS AIR QUALITY OBSERVING STATION CODE CCITTIA5 0 0 48 CHARACTER 0 6 001215 AIR QUALITY OBSERVING STATION DOMINANT EMISSION SOURCE CODE TABLE 001215 0 0 3 CODE TABLE 001215 0 1 001216 AIR QUALITY OBSERVING STATION AREA TYPE CODE TABLE 001216 0 0 3 CODE TABLE 001216 0 1 001217 AIR QUALITY OBSERVING STATION TERRAIN TYPE CODE TABLE 001217 0 0 4 CODE TABLE 001217 0 2 002001 TYPE OF STATION CODE TABLE 2001 0 0 2 CODE TABLE 2001 0 1 002002 TYPE OF INSTRUMENTATION FOR WIND MEASUREMENT FLAG TABLE 2002 0 0 4 FLAG TABLE 2002 0 2 002003 TYPE OF MEASURING EQUIPMENT USED CODE TABLE 2003 0 0 4 CODE TABLE 2003 0 2 002004 TYPE OF INSTRUMENTATION FOR EVAPORATION MEASUREMENT OR TYPE OF C CODE TABLE 2004 0 0 4 CODE TABLE 2004 0 2 002005 PRECISION OF TEMPERATURE OBSERVATION K 2 0 7 K 2 3 002011 RADIOSONDE TYPE CODE TABLE 2011 0 0 8 CODE TABLE 2011 0 3 002012 RADIOSONDE COMPUTATIONAL METHOD CODE TABLE 2012 0 0 4 CODE TABLE 2012 0 2 002013 SOLAR AND INFRARED RADIATION CORRECTION CODE TABLE 2013 0 0 4 CODE TABLE 2013 0 2 002014 TRACKING TECHNIQUE/STATUS OF SYSTEM USED CODE TABLE 2014 0 0 7 CODE TABLE 2014 0 3 002048 SATELLITE SENSOR INDICATOR CODE TABLE 2048 0 0 4 CODE TABLE 2048 0 2 002061 AIRCRAFT NAVIGATIONAL SYSTEM CODE TABLE 2061 0 0 3 CODE TABLE 2061 0 1 002062 TYPE OF AIRCRAFT DATA RELAY SYSTEM CODE TABLE 2062 0 0 4 CODE TABLE 2062 0 2 002063 AIRCRAFT ROLL ANGLE DEGREE 2 -18000 16 DEGREE 2 5 002064 AIRCRAFT ROLL ANGLE QUALITY CODE TABLE 2064 0 0 2 CODE TABLE 2064 0 1 002070 ORIGINAL SPECIFICATION OF LATITUDE/LONGITUDE CODE TABLE 2070 0 0 4 CODE TABLE 2070 0 2 004001 YEAR YEAR 0 0 12 YEAR 0 4 004002 MONTH MONTH 0 0 4 MONTH 0 2 004003 DAY DAY 0 0 6 DAY 0 2 004004 HOUR HOUR 0 0 5 HOUR 0 2 004005 MINUTE MINUTE 0 0 6 MINUTE 0 2 004006 SECOND SECOND 0 0 6 SECOND 0 2 004086 LONG TIME PERIOD OR DISPLACEMENT SECOND 0 -8192 15 SECOND 0 5 004192 [SIM] Time range type NUMERIC 0 0 10 NUMERIC 0 4 004193 [SIM] Time range P1 NUMERIC 0 -536870912 31 NUMERIC 0 10 004194 [SIM] Time range P2 NUMERIC 0 -536870912 31 NUMERIC 0 10 005001 LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7 005015 LATITUDE DISPLACEMENT (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7 005021 BEARING OR AZIMUTH DEGREE TRUE 2 0 16 DEGREE TRUE 2 5 005022 SOLAR AZIMUTH DEGREE TRUE 2 0 16 DEGREE TRUE 2 5 005040 ORBIT NUMBER NUMERIC 0 0 24 NUMERIC 0 8 005041 SCAN LINE NUMBER NUMERIC 0 0 8 NUMERIC 0 3 005043 FIELD OF VIEW NUMBER NUMERIC 0 0 8 NUMERIC 0 3 006001 LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8 006015 LONGITUDE DISPLACEMENT (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8 007002 HEIGHT OR ALTITUDE M -1 -40 16 M -1 5 007004 PRESSURE PA -1 0 14 PA -1 5 007007 HEIGHT M 0 -1000 17 M 0 6 007010 FLIGHT LEVEL M 0 -1024 16 FT -1 5 007024 SATELLITE ZENITH ANGLE DEGREE 2 -9000 15 DEGREE 2 5 007025 SOLAR ZENITH ANGLE DEGREE 2 -9000 15 DEGREE 2 5 007030 HEIGHT OF STATION GROUND ABOVE MEAN SEA LEVEL (SEE NOTE 3) M 1 -4000 17 M 1 5 007031 HEIGHT OF BAROMETER ABOVE MEAN SEA LEVEL (SEE NOTE 4) M 1 - 4000 17 M 1 5 007032 HEIGHT OF SENSOR ABOVE LOCAL GROUND (OR DECK OF MARINE PLATFORM) M 2 0 16 M 2 5 007192 [SIM] First level type NUMERIC 0 0 10 NUMERIC 0 4 007193 [SIM] Level L1 NUMERIC 0 -536870912 31 NUMERIC 0 10 007194 [SIM] Level L2 NUMERIC 0 -536870912 31 NUMERIC 0 10 007195 [SIM] Second level type NUMERIC 0 0 31 NUMERIC 0 4 008002 VERTICAL SIGNIFICANCE (SURFACE OBSERVATIONS) CODE TABLE 8002 0 0 6 CODE TABLE 8002 0 2 008004 PHASE OF AIRCRAFT FLIGHT CODE TABLE 8004 0 0 3 CODE TABLE 8004 0 1 008009 DETAILED PHASE OF FLIGHT CODE TABLE 8009 0 0 4 CODE TABLE 8009 0 2 008021 TIME SIGNIFICANCE CODE TABLE 8021 0 0 5 CODE TABLE 8021 0 2 008042 EXTENDED VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8042 0 0 18 FLAG TABLE 8042 0 6 008044 (VAL) CAS REGISTRY NUMBER CCITTIA5 0 0 88 CHARACTER 0 11 010004 PRESSURE PA -1 0 14 PA -1 5 010007 HEIGHT M 0 -1000 17 M 0 6 010008 GEOPOTENTIAL M**2/S**2 0 -10000 20 M**2/S**2 0 7 010051 PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14 PA -1 5 010052 ALTIMETER SETTING (QNH) PA -1 0 14 PA -1 5 010060 PRESSURE CHANGE PA -1 -1024 11 PA -1 4 010063 CHARACTERISTIC OF PRESSURE TENDENCY CODE TABLE 10063 0 0 4 CODE TABLE 10063 0 2 010197 ANEMOMETER HEIGHT M 0 0 9 M 0 3 011001 WIND DIRECTION DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 011002 WIND SPEED M/S 1 0 12 M/S 1 4 011003 U-COMPONENT M/S 1 -4096 13 M/S 1 4 011004 V-COMPONENT M/S 1 -4096 13 M/S 1 4 011005 W-COMPONENT PA/S 1 -512 10 PA/S 1 4 011006 W-COMPONENT M/S 2 -4096 13 M/S 2 4 011016 EXTREME COUNTERCLOCKWISE WIND DIRECTION OF A VARIABLE WIND DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 011017 EXTREME CLOCKWISE WIND DIRECTION OF A VARIABLE WIND DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 011031 DEGREE OF TURBULENCE CODE TABLE 11031 0 0 4 CODE TABLE 11031 0 2 011037 TURBULENCE INDEX CODE TABLE 11037 0 0 6 CODE TABLE 11037 0 2 011039 EXTENDED TIME OF OCCURRENCE OF PEAK EDDY DISSIPATION RATE CODE TABLE 11039 0 0 6 CODE TABLE 11039 0 2 011041 MAXIMUM WIND GUST SPEED M/S 1 0 12 M/S 1 4 011043 MAXIMUM WIND GUST DIRECTION DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 011061 ABSOLUTE WIND SHEAR IN 1 KM LAYER BELOW M/S 1 0 12 M/S 1 4 011062 ABSOLUTE WIND SHEAR IN 1 KM LAYER ABOVE M/S 1 0 12 M/S 1 4 011075 MEAN TURBULENCE INTENSITY (EDDY DISSIPATION RATE) M**(2/3)/S 2 0 8 M**(2/3)/S 2 3 011076 PEAK TURBULENCE INTENSITY (EDDY DISSIPATION RATE) M**(2/3)/S 2 0 8 M**(2/3)/S 2 3 011077 REPORTING INTERVAL OR AVERAGING TIME FOR EDDY DISSIPATION RATE S 0 0 12 S 0 4 011192 [SIM] W-component terrain following M/S 2 -4096 13 M/S 2 4 011193 [SIM] Stability class NUMERIC 0 0 4 NUMERIC 0 2 011194 [SIM] Friction velocity (calmet) M/S 3 0 14 M/S 3 4 011195 [SIM] Mixing height (calmet) M 0 0 12 M 0 4 011196 [SIM] Obukov lenght (calmet) M 1 -100000 15 M 1 5 011197 [SIM] Convective velocitiy scale (calmet) M/S 3 0 14 M/S 3 4 011198 [SIM] SQRT(2*TKE) M/S 4 0 20 M/S 4 6 011199 [SIM] Surface Roughness M 3 0 14 M 1 4 011200 [SIM] U-component of momentum flux N/M**2 4 -524288 20 N/M**2 4 6 011201 [SIM] V-component of momentum flux N/M**2 4 -524288 20 N/M**2 4 6 011202 [SIM] Friction velocity (diagmet) M/S 3 0 14 M/S 3 4 011203 [SIM] Mixing height (diagmet) M 0 0 12 M 0 4 011204 [SIM] Obukov lenght (diagmet) M 1 -100000 15 M 1 5 011205 [SIM] Convective velocitiy scale (diagmet) M/S 3 0 14 M/S 3 4 011206 [SIM] Friction velocity (COSMO) M/S 3 0 14 M/S 3 4 011207 [SIM] Obukov lenght (COSMO) M 1 -100000 15 M 1 5 012002 WET-BULB TEMPERATURE K 1 0 12 K 1 4 012030 SOIL TEMPERATURE K 1 0 12 K 1 4 012061 SKIN TEMPERATURE K 1 0 12 K 1 4 012063 BRIGHTNESS TEMPERATURE K 1 0 12 K 1 4 012101 TEMPERATURE/DRY-BULB TEMPERATURE K 2 0 16 K 2 5 012103 DEW-POINT TEMPERATURE K 2 0 16 K 2 5 012121 GROUND MINIMUM TEMPERATURE K 2 0 16 C 2 4 012192 POTENTIAL TEMPERATURE K 2 0 16 K 2 5 013001 SPECIFIC HUMIDITY KG/KG 5 0 14 KG/KG 5 5 013002 MIXING RATIO KG/KG 5 0 14 KG/KG 5 5 013003 RELATIVE HUMIDITY % 0 0 7 % 0 3 013011 TOTAL PRECIPITATION / TOTAL WATER EQUIVALENT KG/M**2 1 -1 14 KG/M**2 1 5 013013 TOTAL SNOW DEPTH M 3 -20 20 M 3 6 013031 EVAPOTRANSPIRATION KG/M**2 1 0 7 KG/M**2 0 3 013033 EVAPORATION/EVAPOTRANSPIRATION KG/M**2 1 0 10 KG/M**2 1 4 013192 [SIM] Cloud liquid water content KG/KG 8 0 27 KG/KG 8 8 013193 [SIM] Cloud ice content KG/KG 8 0 27 KG/KG 8 8 013195 [SIM] Precipitating liquid water KG/KG 8 0 27 KG/KG 8 8 013196 [SIM] Precipitating ice KG/KG 8 0 27 KG/KG 8 8 013197 [SIM] Total precipitating water+ice KG/KG 8 0 27 KG/KG 8 8 013198 [SIM] Total liquid water (cloud+precipitating) KG/KG 8 0 27 KG/KG 8 8 013199 [SIM] Total ice (cloud+precipitating) KG/KG 8 0 27 KG/KG 8 8 013200 [SIM] Grid-scale liquid precipitation KG/M**2 1 -1 14 KG/M**2 1 5 013201 [SIM] Grid-scale snowfall KG/M**2 1 -1 14 KG/M**2 1 5 013202 [SIM] Convective liquid precipitation KG/M**2 1 -1 14 KG/M**2 1 5 013203 [SIM] Convective snowfall KG/M**2 1 -1 14 KG/M**2 1 5 013204 [SIM] Total convective precipitation (liquid + snow) KG/M**2 1 -1 14 KG/M**2 1 5 013205 [SIM] Snowfall (grid-scale + convective) KG/M**2 1 -1 14 KG/M**2 1 5 013206 [SIM] Soil water content KG/M**2 1 0 14 KG/M**2 1 5 013212 [SIM] Leaf wetness duration S -1 0 24 S -1 7 014016 NET RADIATION J/M**2 -4 -16384 15 J/M**2 -4 5 014017 INSTANTANEOUS LONG-WAVE RADIATION (incoming) W/M**2 0 -2048 12 W/M**2 0 4 014018 INSTANTANEOUS SHORT-WAVE RADIATION (incoming) W/M**2 0 -2048 12 W/M**2 -3 4 014019 SURFACE ALBEDO % 0 0 7 % 0 3 014021 GLOBAL SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15 J/M**2 -4 5 014031 TOTAL SUNSHINE MINUTE 0 0 11 MINUTE 0 4 014192 [SIM] Instantenous sensible heat flux W/m**2 0 -1024 11 W/M**2 0 4 014193 [SIM] Instantenous latent heat flux W/m**2 0 -1024 11 W/M**2 0 4 014194 [SIM] Instantenous direct solar radiation W/M**2 0 -2048 12 W/M**2 -3 4 014195 [SIM] Instantenous diffuse solar radiation W/M**2 0 -2048 12 W/M**2 -3 4 014196 [SIM] INSTANTANEOUS NET LONG-WAVE RADIATION W/M**2 0 -2048 12 W/M**2 0 4 014197 [SIM] INSTANTANEOUS NET SHORT-WAVE RADIATION W/M**2 0 -2048 12 W/M**2 -3 4 015192 [SIM] NO Concentration KG/M**3 10 0 20 KG/M**3 10 6 015193 [SIM] NO2 Concentration KG/M**3 10 0 20 KG/M**3 10 6 015194 [SIM] O3 Concentration KG/M**3 10 0 20 KG/M**3 10 6 015195 [SIM] PM10 Concentration KG/M**3 10 0 20 KG/M**3 10 6 015196 [SIM] CO Concentration KG/M**3 10 0 20 KG/M**3 10 6 015197 [SIM] SO2 Concentration KG/M**3 10 0 20 KG/M**3 10 6 015198 [SIM] PM2.5 Concentration KG/M**3 10 0 20 KG/M**3 10 6 015199 [SIM] NOY Concentration KG/M**3 10 0 20 KG/M**3 10 6 015200 [SIM] HCNM Concentration KG/M**3 10 0 20 KG/M**3 10 6 015201 [SIM] ALDE Concentration KG/M**3 10 0 20 KG/M**3 10 6 015202 [SIM] PM5 Concentration (tot. aerosol < 5 ug) KG/M**3 10 0 20 KG/M**3 10 6 015203 [SIM] PM1 Concentration (tot. aerosol < 1.25 ug) KG/M**3 10 0 20 KG/M**3 10 6 015204 [SIM] PM06 Concentration (tot. aerosol < 0.6 ug) KG/M**3 10 0 20 KG/M**3 10 6 015205 [SIM] PM03 Concentration (tot. aerosol < 0.3 ug) KG/M**3 10 0 20 KG/M**3 10 6 015206 [SIM] PM015 Concentration (tot. aerosol < 0.15 ug) KG/M**3 10 0 20 KG/M**3 10 6 015207 [SIM] PM008 Concentration (tot. aerosol < 0.08 ug) KG/M**3 10 0 20 KG/M**3 10 6 015208 [SIM] Concentration of primary particulate matter in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015209 [SIM] Concentration of sulfate in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015210 [SIM] Concentration of nitrate in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015211 [SIM] Concentration of ammonium in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015212 [SIM] Concentration of black carbon in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015213 [SIM] Concentration of organic carbon in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015214 [SIM] Concentration of dust in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015215 [SIM] Concentration of anthrop. A1D in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015216 [SIM] Concentration of anthrop. BmP in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015217 [SIM] Concentration of biogenic A1D in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015218 [SIM] Concentration of biogenic BmP in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015219 [SIM] Concentration of water in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015220 [SIM] Concentration of sea salt in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015221 [SIM] Concentration of secondary organic aerosol in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015222 [SIM] Total concentration of primary aerosol in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015223 [SIM] Total concentration of secondary aerosol in PM10 KG/M**3 10 0 20 KG/M**3 10 6 015224 [SIM] Uncertainity in O3 estimate (Pesco) KG/M**3 10 0 20 KG/M**3 10 6 015225 [SIM] Uncertainity in PM10 estimate (Pesco) KG/M**3 10 0 20 KG/M**3 10 6 015226 [SIM] Uncertainity in NO2 estimate (Pesco) KG/M**3 10 0 20 KG/M**3 10 6 015227 [SIM] Uncertainity in PM2.5 estimate (Pesco) KG/M**3 10 0 20 KG/M**3 10 6 015228 [SIM] NH3 Concentration KG/M**3 10 0 20 KG/M**3 10 6 015229 [SIM] Concentration of primary part. matter in aerosol KG/M**3 10 0 20 KG/M**3 10 6 015230 [SIM] Concentration of sulfate in aerosol KG/M**3 10 0 20 KG/M**3 10 6 015231 [SIM] Concentration of nitrate in aerosol KG/M**3 10 0 20 KG/M**3 10 6 015232 [SIM] Concentration of ammonium in aerosol KG/M**3 10 0 20 KG/M**3 10 6 015233 [SIM] Concentration of anthrop. sec. org. in aerosol KG/M**3 10 0 20 KG/M**3 10 6 015234 [SIM] Concentration of biogenic sec. org. in aerosol KG/M**3 10 0 20 KG/M**3 10 6 015235 [SIM] Concentration of ISOPA1 in PM10 KG/M**3 10 0 20 KG/M**3 10 6 020001 HORIZONTAL VISIBILITY M -1 0 13 M -1 4 020003 PRESENT WEATHER (SEE NOTE 1) CODE TABLE 20003 0 0 9 CODE TABLE 20003 0 3 020004 PAST WEATHER (1) (SEE NOTE 2) CODE TABLE 20004 0 0 5 CODE TABLE 20004 0 2 020005 PAST WEATHER (2) (SEE NOTE 2) CODE TABLE 20005 0 0 5 CODE TABLE 20005 0 2 020009 GENERAL WEATHER INDICATOR (TAF/METAR) CODE TABLE 20009 0 0 4 CODE TABLE 20009 0 2 020010 CLOUD COVER (TOTAL) % 0 0 7 % 0 3 020011 CLOUD AMOUNT CODE TABLE 20011 0 0 4 CODE TABLE 20011 0 2 020012 CLOUD TYPE CODE TABLE 20012 0 0 6 CODE TABLE 20012 0 2 020013 HEIGHT OF BASE OF CLOUD M 0 -400 17 M 0 5 020017 CLOUD TOP DESCRIPTION CODE TABLE 20017 0 0 4 CODE TABLE 20017 0 2 020019 SIGNIFICANT PRESENT OR FORECAST WEATHER CCITTIA5 0 0 72 CHARACTER 0 9 020021 TYPE OF PRECIPITATION FLAG TABLE 20021 0 0 30 FLAG TABLE 20021 0 10 020042 AIRFRAME ICING PRESENT CODE TABLE 20042 0 0 2 CODE TABLE 20042 0 1 020043 PEAK LIQUID WATER CONTENT KG/M**3 4 0 7 KG/M**3 4 2 020044 AVERAGE LIQUID WATER CONTENT KG/M**3 4 0 7 KG/M**3 4 2 020045 SUPERCOOLED LARGE DROPLET (SLD) CONDITIONS CODE TABLE 20045 0 0 2 CODE TABLE 20045 0 2 020062 STATE OF THE GROUND (WITH OR WITHOUT SNOW) CODE TABLE 20062 0 0 5 CODE TABLE 20062 0 2 020193 [SIM] Cloud type (METAR) CCITTIA5 0 0 16 CHARACTER 0 2 022001 DIRECTION OF WAVES DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 022011 PERIOD OF WAVES S 0 0 6 S 0 2 022012 PERIOD OF WIND WAVES S 0 0 6 S 0 2 022021 HEIGHT OF WAVES M 1 0 10 M 1 4 022022 HEIGHT OF WIND WAVES M 1 0 10 M 1 4 022037 Tidal elevation with respect to national land datum M 3 -10000 15 M 3 5 022043 SEA/WATER TEMPERATURE K 2 0 15 K 2 5 022070 SIGNIFICANT WAVE HEIGHT M 2 0 13 M 2 4 022071 SPECTRAL PEAK WAVE PERIOD S 1 0 9 S 1 3 022074 AVERAGE WAVE PERIOD S 1 0 9 S 1 3 023192 [SIM] Dry deposition of H2SO4 MOL/M**2 5 0 20 MOL/M**3 5 6 023193 [SIM] Wet deposition of H2SO4 MOL/M**2 5 0 20 MOL/M**3 5 6 023194 [SIM] Dry deposition of NH4 MOL/M**2 5 0 20 MOL/M**3 5 6 023195 [SIM] Wet deposition of NH4 MOL/M**2 5 0 20 MOL/M**3 5 6 023196 [SIM] Dry deposition of HNO3 MOL/M**2 5 0 20 MOL/M**3 5 6 023197 [SIM] Wet deposition of HNO3 MOL/M**2 5 0 20 MOL/M**3 5 6 025076 LOG-10 OF (TEMP-RAD CENTRAL WAVENUMBER) FOR ATOVS LOGM-1 8 0 30 LOGM-1 8 10 029192 [SIM] Land fraction % 1 0 10 % 1 4 031000 SHORT DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 1 NUMERIC 0 1 031001 DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 8 NUMERIC 0 3 031002 EXTENDED DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 16 NUMERIC 0 5 031011 DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 8 NUMERIC 0 3 031012 EXTENDED DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 16 NUMERIC 0 5 031021 ASSOCIATED FIELD SIGNIFICANCE CODE TABLE 31021 0 0 6 CODE TABLE 31021 0 2 031031 DATA PRESENT INDICATOR FLAG TABLE 31031 0 0 1 FLAG TABLE 31031 0 1 033002 QUALITY INFORMATION CODE TABLE 33002 0 0 2 CODE TABLE 33002 0 1 033003 QUALITY INFORMATION CODE TABLE 33003 0 0 3 CODE TABLE 33003 0 1 033005 QUALITY INFORMATION (AWS DATA) FLAG TABLE 33005 0 0 30 FLAG TABLE 33005 0 10 033006 INTERNAL MEASUREMENT STATUS INFORMATION (AWS) CODE TABLE 33006 0 0 3 CODE TABLE 33006 0 1 033007 PER CENT CONFIDENCE % 0 0 7 % 0 3 033015 DATA QUALITY CHECK INDICATOR CODE TABLE 33015 0 0 6 CODE TABLE 33015 0 2 033020 QUALITY CONTROL INDICATION OF FOLLOWING VALUE CODE TABLE 33020 0 0 3 CODE TABLE 33020 0 1 033021 QUALITY OF FOLLOWING VALUE CODE TABLE 33021 0 0 2 CODE TABLE 33021 0 1 033022 QUALITY OF BUOY SATELLITE TRANSMISSION CODE TABLE 33022 0 0 2 CODE TABLE 33022 0 1 033023 QUALITY OF BUOY LOCATION CODE TABLE 33023 0 0 2 CODE TABLE 33023 0 1 033024 STATION ELEVATION QUALITY MARK (FOR MOBILE STATIONS) CODE TABLE 33024 0 0 4 CODE TABLE 33024 0 2 033025 ACARS INTERPOLATED VALUES CODE TABLE 33025 0 0 3 CODE TABLE 33025 0 1 033026 MOISTURE QUALITY CODE TABLE 33026 0 0 6 CODE TABLE 33026 0 2 033027 LOCATION QUALITY CLASS (RANGE OF RADIUS OF 66 % CONFIDENCE) CODE TABLE 33027 0 0 3 CODE TABLE 33027 0 1 033030 SCAN LINE STATUS FLAGS FOR ATOVS FLAG TABLE 33030 0 0 24 FLAG TABLE 33030 0 8 033031 SCAN LINE QUALITY FLAGS FOR ATOVS FLAG TABLE 33031 0 0 24 FLAG TABLE 33031 0 8 033032 CHANNEL QUALITY FLAGS FOR ATOVS FLAG TABLE 33032 0 0 24 FLAG TABLE 33032 0 8 033033 FIELD OF VIEW QUALITY FLAGS FOR ATOVS FLAG TABLE 33033 0 0 24 FLAG TABLE 33033 0 8 033035 MANUAL/AUTOMATIC QUALITY CONTROL CODE TABLE 33035 0 0 4 CODE TABLE 33035 0 2 033036 NOMINAL CONFIDENCE THRESHOLD % 0 0 7 % 0 3 033037 WIND CORRELATION ERROR FLAG TABLE 33037 0 0 20 FLAG TABLE 33037 0 7 033038 QUALITY FLAGS FOR GROUND-BASED GNSS DATA FLAG TABLE 33038 0 0 10 FLAG TABLE 33038 0 4 033040 CONFIDENCE INTERVAL % 0 0 7 PERCENT 0 3 033041 ATTRIBUTE OF FOLLOWING VALUE CODE TABLE 33041 0 0 2 CODE TABLE 33041 0 1 033050 GLOBAL GTSPP QUALITY FLAG CODE TABLE 33050 0 0 4 CODE TABLE 33050 0 2 033192 [SIM] Climatological and consistency check % 0 0 7 PERCENT 0 3 033193 [SIM] Time consistency % 0 0 7 PERCENT 0 3 033194 [SIM] Space consistency % 0 0 7 PERCENT 0 3 033195 [SIM] MeteoDB variable ID NUMERIC 0 0 24 NUMERIC 0 8 033196 [SIM] Data has been invalidated CODE TABLE 33196 0 0 2 CODE TABLE 33196 0 1 033197 [SIM] Manual replacement in substitution CODE TABLE 33197 0 0 2 CODE TABLE 33197 0 1 033198 [SIM] Observation increment NUMERIC 4 -1073741823 31 NUMERIC 4 10 033201 [SIM] Kalman coefficient, state vector (s.v.) x1 NUMERIC 4 -1073741823 31 NUMERIC 4 10 033202 [SIM] Kalman coefficient, state vector (s.v.) x2 NUMERIC 4 -1073741823 31 NUMERIC 4 10 033203 [SIM] Kalman coefficient, s.v. error covariance matrix(1,1) NUMERIC 4 -1073741823 31 NUMERIC 4 10 033204 [SIM] Kalman coefficient, s.v. error covariance matrix(1,2) NUMERIC 4 -1073741823 31 NUMERIC 4 10 033205 [SIM] Kalman coefficient, s.v. error covariance matrix(2,1) NUMERIC 4 -1073741823 31 NUMERIC 4 10 033206 [SIM] Kalman coefficient, s.v. error covariance matrix(2,2) NUMERIC 4 -1073741823 31 NUMERIC 4 10 033207 [SIM] Kalman observation sequential counter NUMERIC 0 -127 8 NUMERIC 0 3 033208 [SIM] Kalman osservation missing counter NUMERIC 0 -127 8 NUMERIC 0 3 033209 [SIM] Normalized Density Index % 0 0 7 PERCENT 0 3 dballe-5.18/tables/D000299.txt0000644000175000017500000052523111634653606012517 00000000000000 D00002 2 B00002 B00003 D00003 3 B00010 B00011 B00012 D00004 9 D00003 B00013 B00014 B00015 B00016 B00017 B00018 B00019 B00020 D00010 3 D00003 R01000 B00030 D01001 2 B01001 B01002 D01002 3 B01003 B01004 B01005 D01003 3 B01011 B01012 B01013 D01004 4 B01001 B01002 B01015 B02001 D01011 3 B04001 B04002 B04003 D01012 2 B04004 B04005 D01013 3 B04004 B04005 B04006 D01021 2 B05001 B06001 D01022 3 B05001 B06001 B07001 D01023 2 B05002 B06002 D01024 3 B05002 B06002 B07001 D01025 3 D01023 B04003 D01012 D01026 7 D01021 B04003 B04003 B04004 B04004 B04005 B04005 D01029 3 B01018 B02001 D01011 D01030 4 B01018 B02001 D01011 D01024 D01031 5 D01001 B02001 D01011 D01012 D01022 D01032 5 D01001 B02001 D01011 D01012 D01024 D01033 5 B01005 B02001 D01011 D01012 D01021 D01034 5 B01005 B02001 D01011 D01012 D01023 D01035 7 B01005 B01012 B01013 B02001 D01011 D01012 D01023 D01036 5 D01003 B02001 D01011 D01012 D01023 D01037 6 D01001 B02011 B02012 D01011 D01012 D01022 D01038 6 D01001 B02011 B02012 D01011 D01012 D01024 D01039 6 D01003 B02011 B02012 D01011 D01012 D01023 D01040 6 D01003 B02011 B02012 D01011 D01012 D01024 D01041 5 B01007 B02021 B02022 D01011 D01012 D01042 2 D01041 D01021 D01043 5 B01007 B02023 D01011 D01013 D01021 D01044 5 B01007 B02024 D01011 D01013 D01021 D01049 5 B02111 B02112 B21062 B21063 B21065 D01051 6 B01006 B02061 D01011 D01012 D01021 B08004 D01055 7 B01005 B02001 D01011 D01012 D01021 B01012 B01014 D01062 2 R01000 D01001 D01065 8 B01006 B01008 B02001 B02002 B02005 B02062 B02070 B02065 D01066 6 D01011 D01013 D01023 B07004 B02064 B08004 D01070 3 B02143 B02142 B02144 D01071 5 B01007 B01031 B02020 B02028 B02029 D01072 4 D01071 D01011 D01013 D01021 D01074 4 B02143 B02142 B02145 B02146 D01075 6 D01001 B01015 D01024 B08021 D01011 D01012 D01076 3 B02011 B02143 B02142 D01090 6 D01004 D01011 D01012 D01021 B07030 B07031 D01091 10 B02180 B02181 B02182 B02183 B02184 B02179 B02186 B02187 B02188 B02189 D01193 5 001007 001031 002196 002221 002222 D01250 4 D01193 D01011 D01013 D01021 D02001 4 B10004 B10051 B10061 B10063 D02002 5 B10004 B07004 B10003 B10061 B10063 D02003 9 B11011 B11012 B12004 B12006 B13003 B20001 B20003 B20004 B20005 D02004 7 B20010 B08002 B20011 B20013 B20012 B20012 B20012 D02005 4 B08002 B20011 B20012 B20013 D02006 4 B10004 B10051 B10062 B10063 D02011 3 D02001 D02003 D02004 D02012 3 D02002 D02003 D02004 D02013 4 D02006 D02003 R01000 D02005 D02021 3 B22001 B22011 B22021 D02022 3 B22002 B22012 B22022 D02023 3 B22003 B22013 B22023 D02024 3 D02022 R01002 D02023 D02051 12 B10004 B10051 B07004 B10003 B12004 B12051 B12016 B12017 B13004 R02004 B08051 B08020 D02069 4 B07032 B07033 B33041 B20001 D02070 8 B07032 B07033 B11001 B11002 B11043 B11041 B11016 B11017 D02071 14 B07032 B07033 B08021 B04025 B11001 B11002 B08021 R03002 B04025 B11043 B11041 B04025 B11016 B11017 D02072 5 B07032 B07033 B12101 B12103 B13003 D02073 7 B20010 R05004 B08002 B20011 B20012 B33041 B20013 D02074 4 B20003 B04025 B20004 B20005 D02075 5 B08021 B04025 B13055 B13058 B08021 D02076 7 B02021 B20022 B26020 B20023 B20024 B20025 B20026 D02077 12 B07032 B07033 B04025 B12111 B12112 B07032 B04025 B12112 B02176 B20062 B02177 B13013 D02078 4 B02176 B20062 B02177 B13013 D02079 5 B07032 B02175 B02178 B04025 B13011 D02080 3 B02185 B04025 B13033 D02081 2 B04025 B14031 D02082 7 B04025 B14002 B14004 B14016 B14028 B14029 B14030 D02083 8 B04025 B08023 B10004 B11001 B11002 B12101 B13003 B08023 D03001 3 B07003 B11001 B11002 D03002 3 B07004 B11001 B11002 D03003 4 B07004 B10003 B12001 B12003 D03004 6 B07004 B10003 B12001 B12003 B11001 B11002 D03011 4 B07003 B08001 B11001 B11002 D03012 4 B07004 B08001 B11001 B11002 D03013 7 B07004 B08001 B10003 B12001 B13003 B11001 B11002 D03014 7 B07004 B08001 B10003 B12001 B12003 B11001 B11002 D03031 6 B07004 B08003 B07021 B07022 B08012 B12061 D03032 2 B20011 B20016 D03033 2 B20010 B20016 D03041 8 B02152 B02023 B07004 B11001 B11002 B02153 B02154 B12071 D03250 8 B02252 B02023 B07004 B11001 B11002 B02197 B02198 B12193 D04001 5 B08003 B10004 B12001 B11001 B11002 D04002 4 B08003 B10004 B11001 B11002 D04003 2 B08003 B12001 D04004 4 B08003 B10004 B20010 B12001 D04005 4 B02024 B07004 B07004 B13003 D04006 3 B14001 B14001 B14003 D04011 27 B02163 B02164 B08012 B07024 B02057 B08021 B04001 B04002 B04003 B04004 B08021 B04024 R10004 B08021 B04004 B04005 B04006 B08021 B04004 B04005 B04006 B11001 B11002 R03010 B02163 B07004 B12001 D04030 3 B27031 B28031 B10031 D04031 3 B01041 B01042 B01043 D04032 5 B02153 B02154 B20081 B20082 B20012 D04033 8 B02152 B02166 B02167 B02153 B02154 B12075 B12076 B12063 D04034 9 R02004 B27001 B28001 B07022 B05043 B20010 B20016 B33003 B10040 D04250 27 B02231 B02232 B08012 B07024 B02057 B08021 B04001 B04002 B04003 B04004 B08021 B04024 R10004 B08021 B04004 B04005 B04006 B08021 B04004 B04005 B04006 B11001 B11002 R03010 B02231 B07004 B12001 D05001 4 B11001 B11002 B13060 B13071 D05002 11 D01012 B12001 B13003 B14051 B13060 B13072 B13080 B13081 B13082 B13083 B13084 D05003 4 D01012 B04065 R01000 D05001 D05004 3 D01030 D05002 D05003 D05006 8 B13072 B13082 B13019 C07005 C01004 B12001 B13073 B13060 D05007 5 D01029 D01012 B04065 R01000 D05006 D05008 4 D05006 C07005 C01004 B12030 D05009 5 D01029 D01012 B04065 R01000 D05008 D05010 3 D05008 B02091 B02091 D05011 5 D01029 D01012 B04065 R01000 D05010 D05016 7 B14021 B07004 B13003 B11002 B11001 B11041 B11043 D05017 5 B13080 B13081 B13083 B13085 B13084 D05018 7 D01029 D01012 B04065 R03000 D05008 D05016 D05017 D06001 4 B02032 R02000 B07062 B22042 D06002 3 B02031 B22004 B22031 D06003 4 B02002 B11011 B11012 B12004 D06004 6 B02032 B02033 R03000 B07062 B22043 B22062 D06005 5 B02031 R03000 B07062 B22004 B22031 D06006 3 D06003 D06002 B22063 D06007 6 B01012 B01014 D06008 B04024 B27003 B28003 D06008 3 B02034 B02035 B02036 D06020 8 B01075 D01011 D01012 B22042 B22120 B22121 B04075 B04065 D06021 7 B01075 D01011 D01012 B22122 B22123 B12001 D03002 D06022 5 B01075 D01011 D01012 B22038 B22039 D06023 8 B01015 D01023 D01011 D01012 B22038 B22039 B22120 B22121 D06024 4 D06020 R02000 B22038 B22039 D07001 2 D01031 D02011 D07002 2 D01032 D02011 D07003 3 D07001 R01000 D02005 D07004 3 D07002 R01000 D02005 D07005 3 D07001 R01004 D02005 D07006 3 D07002 R01004 D02005 D07007 2 D01031 D02012 D07008 2 D01032 D02012 D07009 2 D01031 D02013 D07011 16 B01063 B02001 D01011 D01012 D01024 B07006 B11001 B11016 B11017 B11002 B11041 B07006 B12001 B12003 B10052 B20009 D07012 4 R03000 B08023 B05021 B20001 D07013 7 R06000 B01064 B08014 B20061 B08014 B20061 B20018 D07014 2 R01000 B20019 D07015 3 R01000 D02005 B20002 D07016 2 R01000 B20020 D07017 2 R01000 B11070 D07018 13 B08016 R02000 B08017 D01012 R04000 B07006 B11001 B11002 B11041 B20009 R01000 B20001 D07014 D07020 3 D07011 D07014 D07016 D07021 9 D07011 D07012 D07013 D07014 D07015 D07016 D07017 D07018 D07015 D07030 2 B15001 B15002 D07031 7 B08022 B08023 B15001 B08023 B15001 B08023 B15002 D07041 7 D01001 B01015 D01024 D01011 D01012 D01070 D07030 D07042 9 D01001 B01015 D01024 D01011 D01012 B08021 B04025 D01070 D07031 D07043 7 D01001 B01015 D01024 D01011 D01012 D01074 D07030 D07044 9 D01001 B01015 D01024 D01011 D01012 B08021 B04025 D01074 D07031 D07060 2 B07061 B12030 D07061 3 D01031 R01005 D07060 D07062 3 D01032 R01005 D07060 D07063 2 B07061 B12130 D08001 3 D01033 D02011 B22042 D08002 3 D01034 D02011 B22042 D08003 3 D01035 D02011 B22042 D08004 3 D01036 D02011 B22042 D08005 2 D08004 D02024 D08006 8 B10004 B10061 B10063 B11001 B11002 B12004 B13003 B22042 D08007 4 D01055 D02011 B07062 B22042 D09001 3 D01037 R01000 D03011 D09002 3 D01038 R01000 D03011 D09003 3 D01037 R01000 D03012 D09004 3 D01038 R01000 D03012 D09005 4 D01037 D02004 R01000 D03013 D09006 4 D01038 D02004 R01000 D03013 D09007 4 D01037 D02004 R01000 D03014 D09008 4 D01038 D02004 R01000 D03014 D09011 3 D01039 R01000 D03011 D09012 3 D01039 R01000 D03012 D09013 4 D01039 D02004 R01000 D03013 D09014 4 D01039 D02004 R01000 D03014 D09015 3 D01040 R01000 D03011 D09016 3 D01040 R01000 D03012 D09017 4 D01040 D02004 R01000 D03013 D09018 4 D01040 D02004 R01000 D03014 D09019 4 D01031 B02003 R01000 D03011 D09020 7 D01031 B02003 R04000 B07003 B11003 B11004 B11005 D09030 7 B15004 B15005 R04000 B04015 B08006 B07004 B15003 D09040 3 D01075 D01076 D09030 D09041 4 D07041 D01075 D01076 D09030 D09042 4 D07042 D01075 D01076 D09030 D09044 4 D07044 D01075 D01076 D09030 D10001 5 D01042 D03031 D03032 R01026 D03025 D10002 5 D01042 D03031 D03032 R01009 D03023 D10003 5 D01042 D03031 D03032 R01006 D03023 D10004 5 D01042 D03031 D03032 R01003 D03024 D10005 5 D01042 D03031 D03033 R01000 D03025 D10006 5 D01042 D03031 D03033 R01000 D03023 D10007 5 D01042 D03031 D03033 R01000 D03024 D10008 8 D10011 R01019 D10012 B02150 B25079 B25080 B33032 B14045 D10009 3 D10011 R01015 D10012 D10010 3 D10011 R01005 D10012 D10014 3 D01072 D03041 D04011 D10015 13 D01072 B07024 B10002 D03041 R01003 D04032 B02152 B02024 B07004 B07004 B13003 R01003 D04033 D10016 13 D01072 B07024 B10002 D03041 R01012 D04032 B02152 B02024 B07004 B07004 B13003 R01012 D04033 D10020 6 D10022 D01011 D01013 D01021 D04034 D10021 D10022 4 B01007 B02019 B01033 B02172 D10023 17 D01072 B30021 B30022 B08012 B07024 B07025 B10002 R01012 D04032 R05002 B02152 B02024 B07004 B07004 B13003 R01012 D04033 D10050 13 D10051 D10052 R01000 D10053 R01004 D10054 B20010 D10052 R01015 D10053 D10052 R01004 D10053 D10195 3 D01250 D03250 D04250 D11001 9 D01051 B07002 B12001 B11001 B11002 B11031 B11032 B11033 B20041 D11002 4 D01065 D01066 D11003 D11004 D11003 5 B10070 B11001 B11002 B12001 B13002 D11004 12 R01000 B11034 R01000 B11035 R01000 B11075 R01000 B11076 R01000 B33025 R01000 B33026 D11005 13 B01008 B01023 D01021 D01011 D01013 B07010 B08009 B11001 B11002 B11031 B11036 B12101 B33025 D11006 6 B07010 B11001 B11002 B02064 B12101 B12103 D11193 16 D01197 D01011 D01012 D01023 B08004 B07004 B08021 B11001 B11002 B11031 B11034 B11035 B12001 B12003 B13003 B20041 D12001 2 D01043 D04001 D12002 2 D01043 D04002 D12003 2 D01042 D04003 D12004 2 D01042 D04004 D12005 2 D01042 B20014 D12006 2 D01044 D04005 D12007 2 D01042 D04006 D12010 6 B01007 B05040 B02021 B05041 B04001 B04043 D12014 8 D12010 D12011 R05056 D01023 B05042 B05052 D12012 D12013 D12016 3 D12010 D12011 D12015 D12018 3 D12010 D12011 D12017 D12020 11 D01047 D01048 B15015 B29002 B21076 R04012 B06030 R02012 B05030 B21075 B21066 D12021 6 D01047 R01003 D01049 B11012 B11011 B21067 D12022 15 D01047 B08022 B11012 B11050 B22070 B22026 D12041 B10050 B21068 B21071 B21072 B21073 D12042 B21062 B15011 D12023 7 D01047 R03003 B08022 B12061 B22050 B21069 B21085 D12024 11 D12020 B08060 B08022 B08060 B08022 B25014 B22101 B22097 B22098 B22099 B22100 D12025 11 D12019 B08060 B08022 B08060 B08022 B25014 B22101 B22097 B22098 B22099 B22100 D12026 19 D01046 D01011 D01013 D01023 D12031 R01004 D12030 B21110 D01023 D21027 B21111 D01023 D21027 B21112 D01023 D21027 B21113 D01023 D21027 D12027 9 D01047 R05009 D01023 B07021 B12061 B07021 B12061 B21085 B21070 D12031 8 B05034 B06034 B21109 B11081 B11082 B21101 B21102 B21103 D12032 4 B21120 B21121 B13055 B21122 D12033 4 B02104 B08022 B12063 B12065 D12042 6 B21077 B21078 B21079 B21080 B21081 B21082 D12045 21 B01007 B02019 B01096 B25061 B05040 D01011 D01013 D01021 B07002 B12180 B12181 B12182 B12183 B12184 B12185 B02174 B21086 B12186 B21087 B12187 B33043 D13009 3 B21001 R01000 B21001 D13010 3 B21036 R01000 B21036 D13031 4 B06002 B06012 R01000 B30001 D13032 4 B05002 B05012 R01000 D13031 D13041 9 B06002 R10000 R04000 B06012 R01000 B30001 B06012 R01000 B30001 D13042 4 B05002 B05012 R01000 D13041 D13043 11 B06002 B05002 B05012 R12000 R10000 R04000 B06012 R01000 B30001 R01000 B30001 D15001 5 B01011 D01011 D01012 D01023 D06001 D15002 5 B01011 D01011 D01012 D01023 D06004 D16001 10 D01011 B04004 D01023 B01021 B02041 B19001 B10051 B19002 B19003 B19004 D16002 15 B08021 B04001 B04002 B04003 B04004 B04005 B01033 B08021 B04001 B04002 B04003 B04004 B04005 B07002 B07002 D16003 10 R09000 B08011 B08007 R04000 B05002 B06002 B10002 B11002 B08007 B08011 D16004 11 R10000 B08011 B08007 B07002 B07002 R02000 B05002 B06002 B11031 B08007 B08011 D16005 9 R08000 B08005 B08007 B05002 B06002 B01026 B19001 B08007 B08005 D16006 12 R11000 B08011 B08007 B07002 B07002 R02000 B05002 B06002 B20011 B20012 B08007 B08011 D16007 10 R09000 B08011 B08007 R04000 B05002 B06002 B19005 B19006 B08007 B08011 D16008 11 R10000 B08001 B08007 B08023 R03000 B05002 B06002 B10002 B08023 B08007 B08001 D16009 11 R10000 B08011 B08007 B07002 B07002 R02000 B05002 B06002 B20041 B08007 B08011 D16010 8 R07000 B08011 B08007 B01022 B05002 B06002 B08007 B08011 D16011 17 R16000 B08011 B01022 B08007 R02000 B05002 B06002 B08021 B04001 B04002 B04003 B04004 B04005 B20090 B08021 B08007 B08011 D16020 5 B01023 B01025 B01027 D01011 D01012 D16021 23 D01023 B02041 B19001 B19007 B19005 B19006 B19008 B08005 B10004 B08005 B10004 B19007 B08005 B08021 B04075 B11040 B19007 R05004 B05021 B05021 R02002 B19003 B19004 D16022 23 B01032 B02041 B19001 B19010 R18000 B08021 B04014 B08005 D01023 B19005 B19006 B10004 B11041 B08021 B04075 B11040 B19008 R05004 B05021 B05021 R02002 B19003 B19004 D16026 2 D16020 D16021 D18001 2 D01025 B24011 D18003 4 D01026 B24005 B24004 B24021 D18004 6 D01025 B04023 B13011 B24005 B24004 B24022 D21001 6 B02101 B02114 B02105 B02106 B02107 B02121 D21003 4 B21051 B21014 B21017 B21030 D21004 4 D01031 B02003 R01000 D21003 D21005 12 B25004 B02121 B02122 B02123 B02124 B02125 B02126 B02127 B02128 B02129 B02130 B02131 D21006 4 B25001 B25002 B25003 B25005 D21007 8 B25009 B25010 B25011 B25012 B25013 B25015 B25016 B25017 D21008 3 B25006 B25007 B25008 D21009 2 B25018 B25019 D21010 13 B02101 B07002 B02102 B02103 B02104 B02105 B02106 B02107 B02108 B02109 B02110 B02132 B02133 D21011 3 B30031 B30032 B29002 D21012 2 R01000 B02135 D35001 4 B08035 B35001 B08036 D01001 D35002 4 B08035 B35001 B08036 B01033 D35003 6 B08021 B04001 B04002 B04003 B04004 B04073 D35004 7 B08021 B04004 B08021 B04004 B35000 D01001 B35011 D35005 7 B08021 B04004 B08021 B04004 B35000 B01001 B35011 D35006 7 B08021 B04004 B08021 B04004 B35000 B01003 B35011 D35007 9 B08021 B04004 B08021 B04004 B35000 B01001 R02000 B01002 B35011 D35010 3 D35002 D35003 D35007 dballe-5.18/tables/D000000002001200.txt0000644000175000017500000107105611173330007013343 00000000000000 300002 2 000002 000003 300003 3 000010 000011 000012 300004 9 300003 000013 000014 000015 000016 000017 000018 000019 000020 300010 4 300003 101000 031001 000030 301001 2 001001 001002 301002 3 001003 001004 001005 301003 3 001011 001012 001013 301004 4 001001 001002 001015 002001 301011 3 004001 004002 004003 301012 2 004004 004005 301013 3 004004 004005 004006 301021 2 005001 006001 301022 3 005001 006001 007001 301023 2 005002 006002 301024 3 005002 006002 007001 301025 3 301023 004003 301012 301026 7 301021 004003 004003 004004 004004 004005 004005 301031 5 301001 002001 301011 301012 301022 301032 5 301001 002001 301011 301012 301024 301033 5 001005 002001 301011 301012 301021 301034 5 001005 002001 301011 301012 301023 301035 7 001005 001012 001013 002001 301011 301012 301023 301036 5 301003 002001 301011 301012 301023 301037 6 301001 002011 002012 301011 301012 301022 301038 6 301001 002011 002012 301011 301012 301024 301039 6 301003 002011 002012 301011 301012 301023 301040 6 301003 002011 002012 301011 301012 301024 301041 5 001007 002021 002022 301011 301012 301042 2 301041 301021 301043 5 001007 002023 301011 301013 301021 301044 5 001007 002024 301011 301013 301021 301045 9 301011 301012 201138 202131 004006 201000 202000 304030 304031 301046 10 001007 001012 002048 021119 025060 202124 002026 002027 202000 005040 301047 15 001007 025060 001033 001034 001012 301045 002021 301011 301012 201138 202131 004006 201000 202000 301023 301048 14 002104 002121 002113 002026 002027 002111 002140 202127 001013 202126 007001 202000 025010 021064 301049 5 002111 002112 021062 021063 021065 301051 6 001006 002061 301011 301012 301021 008004 301055 7 001005 002001 301011 301012 301021 001012 001014 301062 3 101000 031001 301001 301065 8 001006 001008 002001 002002 002005 002062 002070 002065 301066 6 301011 301013 301023 007004 002064 008004 301071 5 001007 001031 002020 002028 002029 301072 4 301071 301011 301013 301021 301090 6 301004 301011 301012 301021 007030 007031 301091 10 002180 002181 002182 002183 002184 002179 002186 002187 002188 002189 301193 5 001007 001031 002196 002221 002222 301194 9 001194 001012 001013 002011 002012 301011 301012 301023 007001 301195 9 001195 001012 001013 002011 002012 301011 301012 301023 007001 301196 7 301003 002011 002012 301011 301012 301023 007001 301197 9 001006 001008 002061 002062 002002 002005 002070 002063 002001 301200 2 001032 033194 301201 2 101003 033193 301202 2 001031 001032 301237 12 001007 001012 002021 301011 004004 004005 201138 202131 004006 201000 202000 301023 301238 14 002104 002121 002113 002026 002027 002111 002192 202127 001013 202126 007001 202000 025010 021194 301239 5 002111 002112 021192 021193 021195 301240 5 201131 202129 022021 201000 202000 301241 5 201141 202130 007001 201000 202000 301242 6 021207 021208 021209 021210 021211 021212 301250 4 301193 301011 301013 301021 302001 4 010004 010051 010061 010063 302002 5 010004 007004 010003 010061 010063 302003 9 011011 011012 012004 012006 013003 020001 020003 020004 020005 302004 7 020010 008002 020011 020013 020012 020012 020012 302005 4 008002 020011 020012 020013 302006 4 010004 010051 010062 010063 302011 3 302001 302003 302004 302012 3 302002 302003 302004 302013 5 302006 302003 101000 031001 302005 302021 3 022001 022011 022021 302022 3 022002 022012 022022 302023 3 022003 022013 022023 302024 3 302022 101002 302023 302051 12 010004 010051 007004 010003 012004 012051 012016 012017 013004 102004 008051 008020 302069 4 007032 007033 033041 020001 302070 8 007032 007033 011001 011002 011043 011041 011016 011017 302071 14 007032 007033 008021 004025 011001 011002 008021 103002 004025 011043 011041 004025 011016 011017 302072 5 007032 007033 012101 012103 013003 302073 7 020010 105004 008002 020011 020012 033041 020013 302074 4 020003 004025 020004 020005 302075 5 008021 004025 013055 013058 008021 302076 7 002021 020022 026020 020023 020024 020025 020026 302077 12 007032 007033 004025 012111 012112 007032 004025 012112 002176 020062 002177 013013 302078 4 002176 020062 002177 013013 302079 5 007032 002175 002178 004025 013011 302080 3 002185 004025 013033 302081 2 004025 014031 302082 7 004025 014002 014004 014016 014028 014029 014030 302083 8 004025 008023 010004 011001 011002 012101 013003 008023 302205 5 201131 202129 022021 201000 202000 302206 9 302205 201130 202129 022011 201000 202000 022001 011001 011002 302207 5 022193 022194 022195 022196 022197 302250 5 102000 031001 020193 020194 020012 303001 3 007003 011001 011002 303002 3 007004 011001 011002 303003 4 007004 010003 012001 012003 303004 6 007004 010003 012001 012003 011001 011002 303011 4 007003 008001 011001 011002 303012 4 007004 008001 011001 011002 303013 7 007004 008001 010003 012001 013003 011001 011002 303014 7 007004 008001 010003 012001 012003 011001 011002 303021 4 007004 007004 204007 031021 303022 3 303021 010003 204000 303023 3 303021 012001 204000 303024 3 303021 013016 204000 303025 5 002025 204007 031021 012063 204000 303026 6 007004 008003 204007 031021 012001 204000 303027 5 007004 204007 031021 010003 204000 303031 6 007004 008003 007021 007022 008012 012061 303032 2 020011 020016 303033 2 020010 020016 303041 8 002152 002023 007004 011001 011002 002153 002154 012071 303249 7 002252 104000 031001 002199 007004 007004 013003 303250 8 002252 002023 007004 011001 011002 002197 002198 012193 303251 8 002252 105000 031001 002254 002251 002197 002198 012063 303252 8 002252 105000 031001 002254 002251 002197 002198 012194 304001 5 008003 010004 012001 011001 011002 304002 4 008003 010004 011001 011002 304003 2 008003 012001 304004 4 008003 010004 020010 012001 304005 4 002024 007004 007004 013003 304006 3 014001 014001 014003 304011 27 002163 002164 008012 007024 002057 008021 004001 004002 004003 004004 008021 004024 110004 008021 004004 004005 004006 008021 004004 004005 004006 011001 011002 103010 002163 007004 012001 304030 3 027031 028031 010031 304031 3 001041 001042 001043 304032 5 002153 002154 020081 020082 020012 304033 8 002152 002166 002167 002153 002154 012075 012076 012063 304034 9 102004 027001 028001 007022 005043 020010 020016 033003 010040 304228 3 005217 006217 007217 304229 3 001208 001209 001210 304250 27 002231 002232 008012 007024 002057 008021 004001 004002 004003 004004 008021 004024 110004 008021 004004 004005 004006 008021 004004 004005 004006 011001 011002 103010 002231 007004 012001 305003 5 301012 004065 101000 031001 305001 305006 6 013072 013082 013019 012001 013073 013060 305007 6 301029 301012 004065 101000 031001 305006 305008 2 305006 012030 305009 6 301029 301012 004065 101000 031001 305008 305011 6 301029 301012 004065 101000 031001 305010 305018 8 301029 301012 004065 103000 031001 305008 305016 305017 306001 5 002032 102000 031001 007062 022042 306002 3 002031 022004 022031 306003 4 002002 011011 011012 012004 306004 7 002032 002033 103000 031001 007062 022043 022062 306005 6 002031 103000 031001 007062 022004 022031 306006 3 306003 306002 022063 306007 6 001012 001014 306008 004024 027003 028003 306008 3 002034 002035 002036 306020 4 306024 102006 022038 022039 306021 7 001075 301011 301012 022122 022123 012001 303002 306022 5 001075 301011 301012 022038 022039 306023 8 001015 301023 301011 301012 022038 022039 022120 022121 306024 8 001075 301011 301012 022042 022120 022121 004025 004015 307001 2 301031 302011 307002 2 301032 302011 307003 4 307001 101000 031001 302005 307004 4 307002 101000 031001 302005 307005 3 307001 101004 302005 307006 3 307002 101004 302005 307007 2 301031 302012 307008 2 301032 302012 307009 2 301031 302013 307011 16 001063 002001 301011 301012 301024 007006 011001 011016 011017 011002 011041 007006 012001 012003 010052 020009 307012 5 103000 031001 008023 005021 020001 307013 8 106000 031001 001064 008014 020061 008014 020061 020018 307014 3 101000 031001 020019 307015 8 101000 031001 302005 008002 020011 020012 020013 020002 307016 3 101000 031001 020020 307017 3 101000 031001 011070 307018 16 008016 102000 031001 008017 301012 104000 031001 007006 011001 011002 011041 020009 101000 031001 020001 307014 307020 3 307011 307014 307016 307021 9 307011 307012 307013 307014 307015 307016 307017 307018 307015 307022 31 001015 301011 301012 301022 008021 004025 010004 012001 013003 033038 008022 106025 002020 001050 005021 007021 015031 015032 008060 015033 015034 008060 015033 015034 015035 201131 202129 013016 202000 201000 015011 307030 2 015001 015002 307031 7 008022 008023 015001 008023 015001 008023 015002 307041 7 301001 001015 301022 301011 301012 301070 307030 307042 9 301001 001015 301022 301011 301012 008021 004025 301070 307031 307043 7 301001 001015 301024 301011 301012 301074 307030 308001 3 301033 302011 022042 308002 3 301034 302011 022042 308003 3 301035 302011 022042 308004 3 301036 302011 022042 308005 2 308004 302024 308006 8 010004 010061 010063 011001 011002 012004 013003 022042 308007 4 301055 302011 007062 022042 309001 4 301037 101000 031001 303011 309002 4 301038 101000 031001 303011 309003 4 301037 101000 031001 303012 309004 4 301038 101000 031001 303012 309005 5 301037 302004 101000 031001 303013 309006 5 301038 302004 101000 031001 303013 309007 5 301037 302004 101000 031001 303014 309008 5 301038 302004 101000 031001 303014 309011 4 301039 101000 031001 303011 309012 4 301039 101000 031001 303012 309013 5 301039 302004 101000 031001 303013 309014 5 301039 302004 101000 031001 303014 309015 4 301040 101000 031001 303011 309016 4 301040 101000 031001 303012 309017 5 301040 302004 101000 031001 303013 309018 5 301040 302004 101000 031001 303014 309019 5 301031 002003 101000 031001 303011 309020 8 301031 002003 104000 031001 007003 011003 011004 011005 309030 8 015004 015005 104000 031001 004015 008006 007004 015003 309040 3 301075 301076 309030 309042 4 307042 301075 301076 309030 309194 5 301194 302004 101000 031001 303014 309195 5 301195 302004 101000 031001 303014 309196 5 301196 302004 101000 031001 303014 310001 5 301042 303031 303032 101026 303025 310002 5 301042 303031 303032 101009 303023 310003 5 301042 303031 303032 101006 303023 310004 5 301042 303031 303032 101003 303024 310005 6 301042 303031 303033 101000 031001 303025 310006 6 301042 303031 303033 101000 031001 303023 310007 6 301042 303031 303033 101000 031001 303024 310008 8 310011 101019 310012 002150 025079 025080 033032 014045 310009 3 310011 101015 310012 310010 3 310011 101005 310012 310011 45 008070 001033 001034 008070 001033 001034 001007 002048 005040 025075 201133 005041 201000 005043 025070 033030 033031 004001 004002 004003 004004 004005 202131 201138 004006 201000 202000 005001 006001 202126 007001 202000 007024 005021 007025 005022 033033 002151 012064 002151 012064 002151 012064 002151 012064 310012 10 002150 025076 025077 025078 033032 201132 202129 012063 202000 201000 310013 62 001007 005040 004001 004002 004003 004004 004005 004006 005001 006001 007025 005043 025085 201131 202129 002150 008023 008072 014027 008072 014027 002150 008023 008072 014027 008072 014027 002150 008023 008072 014027 008072 014027 202000 201000 201132 202129 002150 008023 008072 012063 008072 012063 002150 008023 008072 012063 008072 012063 008023 008072 012063 008072 012063 002150 008023 008072 012063 008072 012063 202000 201000 310014 3 301072 303041 304011 310015 13 301072 007024 010002 303041 101003 304032 002152 002024 007004 007004 013003 101003 304033 310016 13 301072 007024 010002 303041 101012 304032 002152 002024 007004 007004 013003 101012 304033 310020 6 310022 301011 301013 301021 304034 310021 310021 10 108000 031001 201131 202129 007004 007004 202000 201000 015020 010002 310022 4 001007 002019 001033 002172 310023 17 301072 030021 030022 008012 007024 007025 010002 101012 304032 105002 002152 002024 007004 007004 013003 101012 304033 310024 17 301072 030021 030022 008012 007024 007025 010002 101003 304032 105002 002152 002024 007004 007004 013003 101003 304033 310025 61 001007 008021 004001 004002 004003 004004 004005 201138 202131 004006 202000 201000 201132 005041 201000 201129 005043 201000 005002 006002 013040 020029 104024 005042 012163 021083 021084 115003 004001 004002 004003 201142 202131 004026 202000 201000 005001 006001 201138 202129 007001 202000 201000 008021 004001 004002 004003 004004 004005 005040 101003 012070 025054 101004 025055 008007 104028 005002 006002 002111 005021 310029 12 110000 031001 201138 202130 007004 007004 202000 201000 015020 010002 012101 013098 310030 6 310022 301011 301013 301021 304034 310029 310050 14 310051 310052 101000 031002 310053 101004 310054 020010 310052 101015 310053 310052 101004 310053 310051 16 001007 005040 201133 005041 201000 201132 025070 201000 202126 007001 202000 007025 005022 102009 002151 012064 310052 12 002019 301011 301012 202131 201138 004006 201000 202000 301021 007024 005021 005043 310053 6 201134 005042 201000 025076 033032 012163 310054 13 201134 005042 201000 025076 033032 201131 202129 102002 008023 014027 008023 202000 201000 310055 8 310051 310052 102020 025076 025051 101000 031002 025050 310193 5 301250 303250 302250 303249 303251 310194 5 301250 303250 302250 303249 303252 310195 3 301250 303250 304250 310196 3 301250 303249 303251 311001 9 301051 007002 012001 011001 011002 011031 011032 011033 020041 311002 4 301065 301066 311003 311004 311003 5 010070 011001 011002 012001 013002 311004 18 101000 031000 011034 101000 031000 011035 101000 031000 011075 101000 031000 011076 101000 031000 033025 101000 031000 033026 311005 13 001008 001023 301021 301011 301013 007010 008009 011001 011002 011031 011036 012101 033025 311006 6 007010 011001 011002 002064 012101 012103 311193 16 301197 301011 301012 301023 008004 007004 008021 011001 011002 011031 011034 011035 012001 012003 013003 020041 312001 2 301043 304001 312002 2 301043 304002 312003 2 301042 304003 312004 2 301042 304004 312005 2 301042 020014 312006 2 301044 304005 312007 2 301042 304006 312010 6 001007 005040 002021 005041 004001 004043 312011 9 202131 201149 004006 201000 202126 010002 202000 005043 005053 312012 6 202129 201132 101019 012063 201000 202000 312013 6 005042 202129 201135 012063 201000 202000 312014 8 312010 312011 105056 301023 005042 005052 312012 312013 312015 10 109011 301023 005042 005052 202129 201132 101004 012063 202000 201000 312016 3 312010 312011 312015 312017 10 109008 301023 005042 005052 202129 201132 101003 012063 202000 201000 312018 3 312010 312011 312017 312019 13 301047 301048 015015 029002 021076 106012 201129 006030 201000 102012 005030 021075 021066 312020 11 301047 301048 015015 029002 021076 104012 006030 102012 005030 021075 021066 312021 6 301047 101003 301049 011012 011011 021067 312022 15 301047 008022 011012 011050 022070 022026 312041 010050 021068 021071 021072 021073 312042 021062 015011 312023 7 301047 103003 008022 012061 022050 021069 021085 312024 11 312020 008060 008022 008060 008022 025014 022101 022097 022098 022099 022100 312025 11 312019 008060 008022 008060 008022 025014 022101 022097 022098 022099 022100 312026 19 301046 301011 301013 301023 312031 101004 312030 021110 301023 321027 021111 301023 321027 021112 301023 321027 021113 301023 321027 312027 9 301047 105009 301023 007021 012061 007021 012061 021085 021070 312028 26 301046 301011 301013 301023 008025 201136 004006 201000 312031 312032 101004 312030 101002 312033 021110 301023 321028 021111 301023 321028 021112 301023 321028 021113 301023 321028 312030 13 201130 202129 011012 202000 201000 011052 201135 202130 011011 202000 201000 011053 021104 312031 8 005034 006034 021109 011081 011082 021101 021102 021103 312032 4 021120 021121 013055 021122 312033 4 002104 008022 012063 012065 312041 5 201141 202130 007001 201000 202000 312042 6 021077 021078 021079 021080 021081 021082 312045 21 001007 002019 001096 025061 005040 301011 301013 301021 007002 012180 012181 012182 012183 012184 012185 002174 021086 012186 021087 012187 033043 312050 23 001007 002019 001096 025061 005040 301011 301013 301021 007025 005022 010080 027080 008003 007004 013093 008003 201131 202129 007004 007004 202000 201000 013095 312051 48 001007 002019 001096 025061 005040 008075 301011 301013 301021 001012 201131 001013 201000 010032 010033 010034 007002 008012 025110 025111 025102 002104 025103 025104 025105 025106 025107 025108 002111 002121 002026 002027 021130 021131 021132 021133 021064 025014 021134 107018 005030 105024 201130 006030 201000 021135 021136 033044 312052 77 001007 002019 001096 025061 005040 025120 025121 025124 025125 025122 025123 301011 301013 301021 007002 002119 033047 010081 010082 010083 010084 002116 002117 002118 002156 002157 014055 022150 022151 022152 022153 022154 022155 022156 022157 022158 022159 021137 021138 021139 021140 021141 021142 010085 010086 010087 010088 010089 010090 010091 010092 010093 011002 025126 025127 025128 025129 025130 025131 025132 025133 025134 025135 025136 025137 013096 013097 011095 011096 012188 012189 002158 002159 033052 033053 021143 021144 312053 54 001007 002019 001096 025061 005040 008075 301011 301013 301021 001012 201131 001013 201000 010032 010033 010034 007002 008012 025110 025111 025102 002104 025103 025104 025105 025106 025107 025108 011001 011002 022160 025138 201130 202129 022021 202000 201000 033048 033049 002026 002027 021130 021131 021132 021133 025014 106036 005030 104024 201130 006030 201000 022161 033044 312200 10 301237 301238 029002 021206 104012 006232 102012 005232 021205 021196 312201 6 301237 101003 301239 011012 011011 021197 312202 13 301237 008022 011012 011050 301240 022243 301241 010050 021198 021201 021202 021203 301242 312203 8 301237 008022 012061 022050 021204 021199 021214 021215 312204 12 312201 001031 011012 011011 021200 021213 004004 008021 004024 055003 011012 011011 312207 3 312202 301202 033191 312208 17 301202 008022 008021 301011 301013 301023 302205 011002 001007 002021 301011 301013 301023 001032 001192 302205 011002 312209 11 301202 001192 301011 301013 301023 302206 104000 022192 102000 005232 022191 312210 13 312202 021192 015202 301011 004004 004005 201138 202131 004006 201000 202000 304228 304229 312211 19 301046 301011 301013 301023 312031 101004 312030 021110 101004 312212 021111 101004 312212 021112 101004 312212 021113 101004 312212 312212 2 301023 321027 313009 4 021001 101000 031001 021001 313010 4 021036 101000 031001 021036 313031 5 006002 006012 101000 031002 030001 313032 5 005002 005012 101000 031002 313031 313041 13 006002 110000 031001 104000 031001 006012 101000 031012 030001 006012 101000 031001 030001 313042 5 005002 005012 101000 031002 313041 313043 16 006002 005002 005012 112000 031001 110000 031001 104000 031001 006012 101000 031011 030001 101000 031001 030001 315001 5 001011 301011 301012 301023 306001 315002 5 001011 301011 301012 301023 306004 316001 10 301011 004004 301023 001021 002041 019001 010051 019002 019003 019004 316002 15 008021 004001 004002 004003 004004 004005 001033 008021 004001 004002 004003 004004 004005 007002 007002 316003 12 110000 031001 008011 008007 104000 031001 005002 006002 010002 011002 008007 008011 316004 13 111000 031001 008011 008007 007002 007002 102000 031001 005002 006002 011031 008007 008011 316005 10 108000 031001 008005 008007 005002 006002 001026 019001 008007 008005 316006 14 112000 031001 008011 008007 007002 007002 102000 031001 005002 006002 020011 020012 008007 008011 316007 12 110000 031001 008011 008007 104000 031001 005002 006002 019005 019006 008007 008011 316008 13 111000 031001 008001 008007 008023 103000 031001 005002 006002 010002 008023 008007 008001 316009 13 111000 031001 008011 008007 007002 007002 102000 031001 005002 006002 020041 008007 008011 316010 9 107000 031001 008011 008007 001022 005002 006002 008007 008011 316011 19 116000 031001 008011 001022 008007 102000 031001 005002 006002 008021 004001 004002 004003 004004 004005 020090 008021 008007 008011 316022 24 001032 002041 019001 019010 118000 031001 008021 004014 008005 301023 019005 019006 010004 011041 008021 004075 011040 019008 105004 005021 005021 102002 019003 019004 318001 2 301025 024011 318003 4 301026 024005 024004 024021 318004 6 301025 004023 013011 024005 024004 024022 321001 6 002101 002114 002105 002106 002107 002121 321003 4 021051 021014 021017 021030 321004 5 301031 002003 101000 031001 321003 321005 12 025004 002121 002122 002123 002124 002125 002126 002127 002128 002129 002130 002131 321006 4 025001 025002 025003 025005 321007 8 025009 025010 025011 025012 025013 025015 025016 025017 321008 3 025006 025007 025008 321009 2 025018 025019 321010 13 002101 007002 002102 002103 002104 002105 002106 002107 002108 002109 002110 002132 002133 321011 3 030031 030032 029002 321012 3 101000 031001 002135 321021 15 002003 002101 201130 002106 201000 201132 202130 002121 202000 201000 201133 202129 025001 202000 201000 321022 11 010007 204001 031021 011001 204000 011002 204001 031021 011006 204000 021030 321023 9 007007 021091 021030 202129 021014 201129 021017 202000 201000 321024 7 007007 204002 031021 012007 011006 204000 021030 321025 17 007007 021091 021030 202129 021014 201129 021017 202000 201000 021092 021030 025092 201129 202129 021017 202000 201000 321026 10 010007 204001 031021 012007 025091 011071 011072 011073 011074 204000 321027 18 021118 202129 201132 002112 201000 201131 002111 201000 202000 002104 021105 021106 021107 021114 021115 021116 008018 021117 321028 18 021118 202129 201132 002112 201000 201131 002111 201000 202000 002104 021123 021106 021107 021114 021115 021116 008018 021117 dballe-5.18/tables/D990203.txt0000644000175000017500000052523111173330007012503 00000000000000 D00002 2 B00002 B00003 D00003 3 B00010 B00011 B00012 D00004 9 D00003 B00013 B00014 B00015 B00016 B00017 B00018 B00019 B00020 D00010 3 D00003 R01000 B00030 D01001 2 B01001 B01002 D01002 3 B01003 B01004 B01005 D01003 3 B01011 B01012 B01013 D01004 4 B01001 B01002 B01015 B02001 D01011 3 B04001 B04002 B04003 D01012 2 B04004 B04005 D01013 3 B04004 B04005 B04006 D01021 2 B05001 B06001 D01022 3 B05001 B06001 B07001 D01023 2 B05002 B06002 D01024 3 B05002 B06002 B07001 D01025 3 D01023 B04003 D01012 D01026 7 D01021 B04003 B04003 B04004 B04004 B04005 B04005 D01029 3 B01018 B02001 D01011 D01030 4 B01018 B02001 D01011 D01024 D01031 5 D01001 B02001 D01011 D01012 D01022 D01032 5 D01001 B02001 D01011 D01012 D01024 D01033 5 B01005 B02001 D01011 D01012 D01021 D01034 5 B01005 B02001 D01011 D01012 D01023 D01035 7 B01005 B01012 B01013 B02001 D01011 D01012 D01023 D01036 5 D01003 B02001 D01011 D01012 D01023 D01037 6 D01001 B02011 B02012 D01011 D01012 D01022 D01038 6 D01001 B02011 B02012 D01011 D01012 D01024 D01039 6 D01003 B02011 B02012 D01011 D01012 D01023 D01040 6 D01003 B02011 B02012 D01011 D01012 D01024 D01041 5 B01007 B02021 B02022 D01011 D01012 D01042 2 D01041 D01021 D01043 5 B01007 B02023 D01011 D01013 D01021 D01044 5 B01007 B02024 D01011 D01013 D01021 D01049 5 B02111 B02112 B21062 B21063 B21065 D01051 6 B01006 B02061 D01011 D01012 D01021 B08004 D01055 7 B01005 B02001 D01011 D01012 D01021 B01012 B01014 D01062 2 R01000 D01001 D01065 8 B01006 B01008 B02001 B02002 B02005 B02062 B02070 B02065 D01066 6 D01011 D01013 D01023 B07004 B02064 B08004 D01070 3 B02143 B02142 B02144 D01071 5 B01007 B01031 B02020 B02028 B02029 D01072 4 D01071 D01011 D01013 D01021 D01074 4 B02143 B02142 B02145 B02146 D01075 6 D01001 B01015 D01024 B08021 D01011 D01012 D01076 3 B02011 B02143 B02142 D01090 6 D01004 D01011 D01012 D01021 B07030 B07031 D01091 10 B02180 B02181 B02182 B02183 B02184 B02179 B02186 B02187 B02188 B02189 D01193 5 001007 001031 002196 002221 002222 D01250 4 D01193 D01011 D01013 D01021 D02001 4 B10004 B10051 B10061 B10063 D02002 5 B10004 B07004 B10003 B10061 B10063 D02003 9 B11011 B11012 B12004 B12006 B13003 B20001 B20003 B20004 B20005 D02004 7 B20010 B08002 B20011 B20013 B20012 B20012 B20012 D02005 4 B08002 B20011 B20012 B20013 D02006 4 B10004 B10051 B10062 B10063 D02011 3 D02001 D02003 D02004 D02012 3 D02002 D02003 D02004 D02013 4 D02006 D02003 R01000 D02005 D02021 3 B22001 B22011 B22021 D02022 3 B22002 B22012 B22022 D02023 3 B22003 B22013 B22023 D02024 3 D02022 R01002 D02023 D02051 12 B10004 B10051 B07004 B10003 B12004 B12051 B12016 B12017 B13004 R02004 B08051 B08020 D02069 4 B07032 B07033 B33041 B20001 D02070 8 B07032 B07033 B11001 B11002 B11043 B11041 B11016 B11017 D02071 14 B07032 B07033 B08021 B04025 B11001 B11002 B08021 R03002 B04025 B11043 B11041 B04025 B11016 B11017 D02072 5 B07032 B07033 B12101 B12103 B13003 D02073 7 B20010 R05004 B08002 B20011 B20012 B33041 B20013 D02074 4 B20003 B04025 B20004 B20005 D02075 5 B08021 B04025 B13055 B13058 B08021 D02076 7 B02021 B20022 B26020 B20023 B20024 B20025 B20026 D02077 12 B07032 B07033 B04025 B12111 B12112 B07032 B04025 B12112 B02176 B20062 B02177 B13013 D02078 4 B02176 B20062 B02177 B13013 D02079 5 B07032 B02175 B02178 B04025 B13011 D02080 3 B02185 B04025 B13033 D02081 2 B04025 B14031 D02082 7 B04025 B14002 B14004 B14016 B14028 B14029 B14030 D02083 8 B04025 B08023 B10004 B11001 B11002 B12101 B13003 B08023 D03001 3 B07003 B11001 B11002 D03002 3 B07004 B11001 B11002 D03003 4 B07004 B10003 B12001 B12003 D03004 6 B07004 B10003 B12001 B12003 B11001 B11002 D03011 4 B07003 B08001 B11001 B11002 D03012 4 B07004 B08001 B11001 B11002 D03013 7 B07004 B08001 B10003 B12001 B13003 B11001 B11002 D03014 7 B07004 B08001 B10003 B12001 B12003 B11001 B11002 D03031 6 B07004 B08003 B07021 B07022 B08012 B12061 D03032 2 B20011 B20016 D03033 2 B20010 B20016 D03041 8 B02152 B02023 B07004 B11001 B11002 B02153 B02154 B12071 D03250 8 B02252 B02023 B07004 B11001 B11002 B02197 B02198 B12193 D04001 5 B08003 B10004 B12001 B11001 B11002 D04002 4 B08003 B10004 B11001 B11002 D04003 2 B08003 B12001 D04004 4 B08003 B10004 B20010 B12001 D04005 4 B02024 B07004 B07004 B13003 D04006 3 B14001 B14001 B14003 D04011 27 B02163 B02164 B08012 B07024 B02057 B08021 B04001 B04002 B04003 B04004 B08021 B04024 R10004 B08021 B04004 B04005 B04006 B08021 B04004 B04005 B04006 B11001 B11002 R03010 B02163 B07004 B12001 D04030 3 B27031 B28031 B10031 D04031 3 B01041 B01042 B01043 D04032 5 B02153 B02154 B20081 B20082 B20012 D04033 8 B02152 B02166 B02167 B02153 B02154 B12075 B12076 B12063 D04034 9 R02004 B27001 B28001 B07022 B05043 B20010 B20016 B33003 B10040 D04250 27 B02231 B02232 B08012 B07024 B02057 B08021 B04001 B04002 B04003 B04004 B08021 B04024 R10004 B08021 B04004 B04005 B04006 B08021 B04004 B04005 B04006 B11001 B11002 R03010 B02231 B07004 B12001 D05001 4 B11001 B11002 B13060 B13071 D05002 11 D01012 B12001 B13003 B14051 B13060 B13072 B13080 B13081 B13082 B13083 B13084 D05003 4 D01012 B04065 R01000 D05001 D05004 3 D01030 D05002 D05003 D05006 8 B13072 B13082 B13019 C07005 C01004 B12001 B13073 B13060 D05007 5 D01029 D01012 B04065 R01000 D05006 D05008 4 D05006 C07005 C01004 B12030 D05009 5 D01029 D01012 B04065 R01000 D05008 D05010 3 D05008 B02091 B02091 D05011 5 D01029 D01012 B04065 R01000 D05010 D05016 7 B14021 B07004 B13003 B11002 B11001 B11041 B11043 D05017 5 B13080 B13081 B13083 B13085 B13084 D05018 7 D01029 D01012 B04065 R03000 D05008 D05016 D05017 D06001 4 B02032 R02000 B07062 B22042 D06002 3 B02031 B22004 B22031 D06003 4 B02002 B11011 B11012 B12004 D06004 6 B02032 B02033 R03000 B07062 B22043 B22062 D06005 5 B02031 R03000 B07062 B22004 B22031 D06006 3 D06003 D06002 B22063 D06007 6 B01012 B01014 D06008 B04024 B27003 B28003 D06008 3 B02034 B02035 B02036 D06020 8 B01075 D01011 D01012 B22042 B22120 B22121 B04075 B04065 D06021 7 B01075 D01011 D01012 B22122 B22123 B12001 D03002 D06022 5 B01075 D01011 D01012 B22038 B22039 D06023 8 B01015 D01023 D01011 D01012 B22038 B22039 B22120 B22121 D06024 4 D06020 R02000 B22038 B22039 D07001 2 D01031 D02011 D07002 2 D01032 D02011 D07003 3 D07001 R01000 D02005 D07004 3 D07002 R01000 D02005 D07005 3 D07001 R01004 D02005 D07006 3 D07002 R01004 D02005 D07007 2 D01031 D02012 D07008 2 D01032 D02012 D07009 2 D01031 D02013 D07011 16 B01063 B02001 D01011 D01012 D01024 B07006 B11001 B11016 B11017 B11002 B11041 B07006 B12001 B12003 B10052 B20009 D07012 4 R03000 B08023 B05021 B20001 D07013 7 R06000 B01064 B08014 B20061 B08014 B20061 B20018 D07014 2 R01000 B20019 D07015 3 R01000 D02005 B20002 D07016 2 R01000 B20020 D07017 2 R01000 B11070 D07018 13 B08016 R02000 B08017 D01012 R04000 B07006 B11001 B11002 B11041 B20009 R01000 B20001 D07014 D07020 3 D07011 D07014 D07016 D07021 9 D07011 D07012 D07013 D07014 D07015 D07016 D07017 D07018 D07015 D07030 2 B15001 B15002 D07031 7 B08022 B08023 B15001 B08023 B15001 B08023 B15002 D07041 7 D01001 B01015 D01024 D01011 D01012 D01070 D07030 D07042 9 D01001 B01015 D01024 D01011 D01012 B08021 B04025 D01070 D07031 D07043 7 D01001 B01015 D01024 D01011 D01012 D01074 D07030 D07044 9 D01001 B01015 D01024 D01011 D01012 B08021 B04025 D01074 D07031 D07060 2 B07061 B12030 D07061 3 D01031 R01005 D07060 D07062 3 D01032 R01005 D07060 D07063 2 B07061 B12130 D08001 3 D01033 D02011 B22042 D08002 3 D01034 D02011 B22042 D08003 3 D01035 D02011 B22042 D08004 3 D01036 D02011 B22042 D08005 2 D08004 D02024 D08006 8 B10004 B10061 B10063 B11001 B11002 B12004 B13003 B22042 D08007 4 D01055 D02011 B07062 B22042 D09001 3 D01037 R01000 D03011 D09002 3 D01038 R01000 D03011 D09003 3 D01037 R01000 D03012 D09004 3 D01038 R01000 D03012 D09005 4 D01037 D02004 R01000 D03013 D09006 4 D01038 D02004 R01000 D03013 D09007 4 D01037 D02004 R01000 D03014 D09008 4 D01038 D02004 R01000 D03014 D09011 3 D01039 R01000 D03011 D09012 3 D01039 R01000 D03012 D09013 4 D01039 D02004 R01000 D03013 D09014 4 D01039 D02004 R01000 D03014 D09015 3 D01040 R01000 D03011 D09016 3 D01040 R01000 D03012 D09017 4 D01040 D02004 R01000 D03013 D09018 4 D01040 D02004 R01000 D03014 D09019 4 D01031 B02003 R01000 D03011 D09020 7 D01031 B02003 R04000 B07003 B11003 B11004 B11005 D09030 7 B15004 B15005 R04000 B04015 B08006 B07004 B15003 D09040 3 D01075 D01076 D09030 D09041 4 D07041 D01075 D01076 D09030 D09042 4 D07042 D01075 D01076 D09030 D09044 4 D07044 D01075 D01076 D09030 D10001 5 D01042 D03031 D03032 R01026 D03025 D10002 5 D01042 D03031 D03032 R01009 D03023 D10003 5 D01042 D03031 D03032 R01006 D03023 D10004 5 D01042 D03031 D03032 R01003 D03024 D10005 5 D01042 D03031 D03033 R01000 D03025 D10006 5 D01042 D03031 D03033 R01000 D03023 D10007 5 D01042 D03031 D03033 R01000 D03024 D10008 8 D10011 R01019 D10012 B02150 B25079 B25080 B33032 B14045 D10009 3 D10011 R01015 D10012 D10010 3 D10011 R01005 D10012 D10014 3 D01072 D03041 D04011 D10015 13 D01072 B07024 B10002 D03041 R01003 D04032 B02152 B02024 B07004 B07004 B13003 R01003 D04033 D10016 13 D01072 B07024 B10002 D03041 R01012 D04032 B02152 B02024 B07004 B07004 B13003 R01012 D04033 D10020 6 D10022 D01011 D01013 D01021 D04034 D10021 D10022 4 B01007 B02019 B01033 B02172 D10023 17 D01072 B30021 B30022 B08012 B07024 B07025 B10002 R01012 D04032 R05002 B02152 B02024 B07004 B07004 B13003 R01012 D04033 D10050 13 D10051 D10052 R01000 D10053 R01004 D10054 B20010 D10052 R01015 D10053 D10052 R01004 D10053 D10195 3 D01250 D03250 D04250 D11001 9 D01051 B07002 B12001 B11001 B11002 B11031 B11032 B11033 B20041 D11002 4 D01065 D01066 D11003 D11004 D11003 5 B10070 B11001 B11002 B12001 B13002 D11004 12 R01000 B11034 R01000 B11035 R01000 B11075 R01000 B11076 R01000 B33025 R01000 B33026 D11005 13 B01008 B01023 D01021 D01011 D01013 B07010 B08009 B11001 B11002 B11031 B11036 B12101 B33025 D11006 6 B07010 B11001 B11002 B02064 B12101 B12103 D11193 16 D01197 D01011 D01012 D01023 B08004 B07004 B08021 B11001 B11002 B11031 B11034 B11035 B12001 B12003 B13003 B20041 D12001 2 D01043 D04001 D12002 2 D01043 D04002 D12003 2 D01042 D04003 D12004 2 D01042 D04004 D12005 2 D01042 B20014 D12006 2 D01044 D04005 D12007 2 D01042 D04006 D12010 6 B01007 B05040 B02021 B05041 B04001 B04043 D12014 8 D12010 D12011 R05056 D01023 B05042 B05052 D12012 D12013 D12016 3 D12010 D12011 D12015 D12018 3 D12010 D12011 D12017 D12020 11 D01047 D01048 B15015 B29002 B21076 R04012 B06030 R02012 B05030 B21075 B21066 D12021 6 D01047 R01003 D01049 B11012 B11011 B21067 D12022 15 D01047 B08022 B11012 B11050 B22070 B22026 D12041 B10050 B21068 B21071 B21072 B21073 D12042 B21062 B15011 D12023 7 D01047 R03003 B08022 B12061 B22050 B21069 B21085 D12024 11 D12020 B08060 B08022 B08060 B08022 B25014 B22101 B22097 B22098 B22099 B22100 D12025 11 D12019 B08060 B08022 B08060 B08022 B25014 B22101 B22097 B22098 B22099 B22100 D12026 19 D01046 D01011 D01013 D01023 D12031 R01004 D12030 B21110 D01023 D21027 B21111 D01023 D21027 B21112 D01023 D21027 B21113 D01023 D21027 D12027 9 D01047 R05009 D01023 B07021 B12061 B07021 B12061 B21085 B21070 D12031 8 B05034 B06034 B21109 B11081 B11082 B21101 B21102 B21103 D12032 4 B21120 B21121 B13055 B21122 D12033 4 B02104 B08022 B12063 B12065 D12042 6 B21077 B21078 B21079 B21080 B21081 B21082 D12045 21 B01007 B02019 B01096 B25061 B05040 D01011 D01013 D01021 B07002 B12180 B12181 B12182 B12183 B12184 B12185 B02174 B21086 B12186 B21087 B12187 B33043 D13009 3 B21001 R01000 B21001 D13010 3 B21036 R01000 B21036 D13031 4 B06002 B06012 R01000 B30001 D13032 4 B05002 B05012 R01000 D13031 D13041 9 B06002 R10000 R04000 B06012 R01000 B30001 B06012 R01000 B30001 D13042 4 B05002 B05012 R01000 D13041 D13043 11 B06002 B05002 B05012 R12000 R10000 R04000 B06012 R01000 B30001 R01000 B30001 D15001 5 B01011 D01011 D01012 D01023 D06001 D15002 5 B01011 D01011 D01012 D01023 D06004 D16001 10 D01011 B04004 D01023 B01021 B02041 B19001 B10051 B19002 B19003 B19004 D16002 15 B08021 B04001 B04002 B04003 B04004 B04005 B01033 B08021 B04001 B04002 B04003 B04004 B04005 B07002 B07002 D16003 10 R09000 B08011 B08007 R04000 B05002 B06002 B10002 B11002 B08007 B08011 D16004 11 R10000 B08011 B08007 B07002 B07002 R02000 B05002 B06002 B11031 B08007 B08011 D16005 9 R08000 B08005 B08007 B05002 B06002 B01026 B19001 B08007 B08005 D16006 12 R11000 B08011 B08007 B07002 B07002 R02000 B05002 B06002 B20011 B20012 B08007 B08011 D16007 10 R09000 B08011 B08007 R04000 B05002 B06002 B19005 B19006 B08007 B08011 D16008 11 R10000 B08001 B08007 B08023 R03000 B05002 B06002 B10002 B08023 B08007 B08001 D16009 11 R10000 B08011 B08007 B07002 B07002 R02000 B05002 B06002 B20041 B08007 B08011 D16010 8 R07000 B08011 B08007 B01022 B05002 B06002 B08007 B08011 D16011 17 R16000 B08011 B01022 B08007 R02000 B05002 B06002 B08021 B04001 B04002 B04003 B04004 B04005 B20090 B08021 B08007 B08011 D16020 5 B01023 B01025 B01027 D01011 D01012 D16021 23 D01023 B02041 B19001 B19007 B19005 B19006 B19008 B08005 B10004 B08005 B10004 B19007 B08005 B08021 B04075 B11040 B19007 R05004 B05021 B05021 R02002 B19003 B19004 D16022 23 B01032 B02041 B19001 B19010 R18000 B08021 B04014 B08005 D01023 B19005 B19006 B10004 B11041 B08021 B04075 B11040 B19008 R05004 B05021 B05021 R02002 B19003 B19004 D16026 2 D16020 D16021 D18001 2 D01025 B24011 D18003 4 D01026 B24005 B24004 B24021 D18004 6 D01025 B04023 B13011 B24005 B24004 B24022 D21001 6 B02101 B02114 B02105 B02106 B02107 B02121 D21003 4 B21051 B21014 B21017 B21030 D21004 4 D01031 B02003 R01000 D21003 D21005 12 B25004 B02121 B02122 B02123 B02124 B02125 B02126 B02127 B02128 B02129 B02130 B02131 D21006 4 B25001 B25002 B25003 B25005 D21007 8 B25009 B25010 B25011 B25012 B25013 B25015 B25016 B25017 D21008 3 B25006 B25007 B25008 D21009 2 B25018 B25019 D21010 13 B02101 B07002 B02102 B02103 B02104 B02105 B02106 B02107 B02108 B02109 B02110 B02132 B02133 D21011 3 B30031 B30032 B29002 D21012 2 R01000 B02135 D35001 4 B08035 B35001 B08036 D01001 D35002 4 B08035 B35001 B08036 B01033 D35003 6 B08021 B04001 B04002 B04003 B04004 B04073 D35004 7 B08021 B04004 B08021 B04004 B35000 D01001 B35011 D35005 7 B08021 B04004 B08021 B04004 B35000 B01001 B35011 D35006 7 B08021 B04004 B08021 B04004 B35000 B01003 B35011 D35007 9 B08021 B04004 B08021 B04004 B35000 B01001 R02000 B01002 B35011 D35010 3 D35002 D35003 D35007 dballe-5.18/tables/B0000000000200014001.txt0000644000175000017500000010263011754230765013653 00000000000000 001001 WMO BLOCK NUMBER NUMERIC 0 0 7 001002 WMO STATION NUMBER NUMERIC 0 0 10 001006 AIRCRAFT FLIGHT NUMBER CCITTIA5 0 0 64 001007 SATELLITE IDENTIFIER CODE TABLE 1007 0 0 10 001008 AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION CCITTIA5 0 0 64 001011 SHIP OR MOBILE LAND STATION IDENTIFIER CCITTIA5 0 0 72 001012 DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** DEGREE TRUE 0 0 9 001013 SPEED OF MOTION OF MOVING OBSERVING PLATFORM* M/S 0 0 10 001019 LONG STATION OR SITE NAME CCITTIA5 0 0 256 001023 OBSERVATION SEQUENCE NUMBER NUMERIC 0 0 9 001063 ICAO LOCATION INDICATOR CCITTIA5 0 0 64 001192 [SIM] MeteoDB station ID NUMERIC 0 0 24 001193 [SIM] Report code NUMERIC 0 0 16 001194 [SIM] Report mnemonic CCITTIA5 0 0 128 001212 AIR QUALITY OBSERVING STATION LOCAL CODE CCITTIA5 0 0 56 001213 AIRBASE AIR QUALITY OBSERVING STATION CODE CCITTIA5 0 0 56 001214 GEMS AIR QUALITY OBSERVING STATION CODE CCITTIA5 0 0 48 001215 AIR QUALITY OBSERVING STATION DOMINANT EMISSION SOURCE CODE TABLE 001215 0 0 3 001216 AIR QUALITY OBSERVING STATION AREA TYPE CODE TABLE 001216 0 0 3 001217 AIR QUALITY OBSERVING STATION TERRAIN TYPE CODE TABLE 001217 0 0 4 002001 TYPE OF STATION CODE TABLE 2001 0 0 2 002002 TYPE OF INSTRUMENTATION FOR WIND MEASUREMENT FLAG TABLE 2002 0 0 4 002003 TYPE OF MEASURING EQUIPMENT USED CODE TABLE 2003 0 0 4 002004 TYPE OF INSTRUMENTATION FOR EVAPORATION MEASUREMENT OR TYPE OF C CODE TABLE 2004 0 0 4 002005 PRECISION OF TEMPERATURE OBSERVATION K 2 0 7 002011 RADIOSONDE TYPE CODE TABLE 2011 0 0 8 002012 RADIOSONDE COMPUTATIONAL METHOD CODE TABLE 2012 0 0 4 002013 SOLAR AND INFRARED RADIATION CORRECTION CODE TABLE 2013 0 0 4 002014 TRACKING TECHNIQUE/STATUS OF SYSTEM USED CODE TABLE 2014 0 0 7 002048 SATELLITE SENSOR INDICATOR CODE TABLE 2048 0 0 4 002061 AIRCRAFT NAVIGATIONAL SYSTEM CODE TABLE 2061 0 0 3 002062 TYPE OF AIRCRAFT DATA RELAY SYSTEM CODE TABLE 2062 0 0 4 002063 AIRCRAFT ROLL ANGLE DEGREE 2 -18000 16 002064 AIRCRAFT ROLL ANGLE QUALITY CODE TABLE 2064 0 0 2 002070 ORIGINAL SPECIFICATION OF LATITUDE/LONGITUDE CODE TABLE 2070 0 0 4 004001 YEAR YEAR 0 0 12 004002 MONTH MONTH 0 0 4 004003 DAY DAY 0 0 6 004004 HOUR HOUR 0 0 5 004005 MINUTE MINUTE 0 0 6 004006 SECOND SECOND 0 0 6 004086 LONG TIME PERIOD OR DISPLACEMENT SECOND 0 -8192 15 004192 [SIM] Time range type NUMERIC 0 0 10 004193 [SIM] Time range P1 NUMERIC 0 -536870912 31 004194 [SIM] Time range P2 NUMERIC 0 -536870912 31 005001 LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25 005015 LATITUDE DISPLACEMENT (HIGH ACCURACY) DEGREE 5 -9000000 25 005021 BEARING OR AZIMUTH DEGREE TRUE 2 0 16 005022 SOLAR AZIMUTH DEGREE TRUE 2 0 16 005040 ORBIT NUMBER NUMERIC 0 0 24 005041 SCAN LINE NUMBER NUMERIC 0 0 8 005043 FIELD OF VIEW NUMBER NUMERIC 0 0 8 006001 LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26 006015 LONGITUDE DISPLACEMENT (HIGH ACCURACY) DEGREE 5 -18000000 26 007002 HEIGHT OR ALTITUDE M -1 -40 16 007004 PRESSURE PA -1 0 14 007007 HEIGHT M 0 -1000 17 007010 FLIGHT LEVEL M 0 -1024 16 007024 SATELLITE ZENITH ANGLE DEGREE 2 -9000 15 007025 SOLAR ZENITH ANGLE DEGREE 2 -9000 15 007030 HEIGHT OF STATION GROUND ABOVE MEAN SEA LEVEL (SEE NOTE 3) M 1 -4000 17 007031 HEIGHT OF BAROMETER ABOVE MEAN SEA LEVEL (SEE NOTE 4) M 1 - 4000 17 007032 HEIGHT OF SENSOR ABOVE LOCAL GROUND (OR DECK OF MARINE PLATFORM) M 2 0 16 007192 [SIM] First level type NUMERIC 0 0 10 007193 [SIM] Level L1 NUMERIC 0 -536870912 31 007194 [SIM] Level L2 NUMERIC 0 -536870912 31 007195 [SIM] Second level type NUMERIC 0 0 31 008002 VERTICAL SIGNIFICANCE (SURFACE OBSERVATIONS) CODE TABLE 8002 0 0 6 008004 PHASE OF AIRCRAFT FLIGHT CODE TABLE 8004 0 0 3 008009 DETAILED PHASE OF FLIGHT CODE TABLE 8009 0 0 4 008021 TIME SIGNIFICANCE CODE TABLE 8021 0 0 5 008042 EXTENDED VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8042 0 0 18 008044 (VAL) CAS REGISTRY NUMBER CCITTIA5 0 0 88 010004 PRESSURE PA -1 0 14 010007 HEIGHT M 0 -1000 17 010008 GEOPOTENTIAL M**2/S**2 0 -10000 20 010051 PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14 010052 ALTIMETER SETTING (QNH) PA -1 0 14 010060 PRESSURE CHANGE PA -1 -1024 11 010063 CHARACTERISTIC OF PRESSURE TENDENCY CODE TABLE 10063 0 0 4 010197 ANEMOMETER HEIGHT M 0 0 9 011001 WIND DIRECTION DEGREE TRUE 0 0 9 011002 WIND SPEED M/S 1 0 12 011003 U-COMPONENT M/S 1 -4096 13 011004 V-COMPONENT M/S 1 -4096 13 011005 W-COMPONENT PA/S 1 -512 10 011006 W-COMPONENT M/S 2 -4096 13 011016 EXTREME COUNTERCLOCKWISE WIND DIRECTION OF A VARIABLE WIND DEGREE TRUE 0 0 9 011017 EXTREME CLOCKWISE WIND DIRECTION OF A VARIABLE WIND DEGREE TRUE 0 0 9 011031 DEGREE OF TURBULENCE CODE TABLE 11031 0 0 4 011037 TURBULENCE INDEX CODE TABLE 11037 0 0 6 011039 EXTENDED TIME OF OCCURRENCE OF PEAK EDDY DISSIPATION RATE CODE TABLE 11039 0 0 6 011041 MAXIMUM WIND GUST SPEED M/S 1 0 12 011043 MAXIMUM WIND GUST DIRECTION DEGREE TRUE 0 0 9 011061 ABSOLUTE WIND SHEAR IN 1 KM LAYER BELOW M/S 1 0 12 011062 ABSOLUTE WIND SHEAR IN 1 KM LAYER ABOVE M/S 1 0 12 011075 MEAN TURBULENCE INTENSITY (EDDY DISSIPATION RATE) M**(2/3)/S 2 0 8 011076 PEAK TURBULENCE INTENSITY (EDDY DISSIPATION RATE) M**(2/3)/S 2 0 8 011077 REPORTING INTERVAL OR AVERAGING TIME FOR EDDY DISSIPATION RATE S 0 0 12 011192 [SIM] W-component terrain following M/S 2 -4096 13 011193 [SIM] Stability class NUMERIC 0 0 4 011194 [SIM] Friction velocity (calmet) M/S 3 0 14 011195 [SIM] Mixing height (calmet) M 0 0 12 011196 [SIM] Obukov lenght (calmet) M 1 -100000 15 011197 [SIM] Convective velocitiy scale (calmet) M/S 3 0 14 011198 [SIM] SQRT(2*TKE) M/S 4 0 20 011199 [SIM] Surface Roughness M 3 0 14 011200 [SIM] U-component of momentum flux N/M**2 4 -524288 20 011201 [SIM] V-component of momentum flux N/M**2 4 -524288 20 011202 [SIM] Friction velocity (diagmet) M/S 3 0 14 011203 [SIM] Mixing height (diagmet) M 0 0 12 011204 [SIM] Obukov lenght (diagmet) M 1 -100000 15 011205 [SIM] Convective velocitiy scale (diagmet) M/S 3 0 14 011206 [SIM] Friction velocity (COSMO) M/S 3 0 14 011207 [SIM] Obukov lenght (COSMO) M 1 -100000 15 012002 WET-BULB TEMPERATURE K 1 0 12 012030 SOIL TEMPERATURE K 1 0 12 012061 SKIN TEMPERATURE K 1 0 12 012063 BRIGHTNESS TEMPERATURE K 1 0 12 012101 TEMPERATURE/DRY-BULB TEMPERATURE K 2 0 16 012103 DEW-POINT TEMPERATURE K 2 0 16 012121 GROUND MINIMUM TEMPERATURE K 2 0 16 012192 POTENTIAL TEMPERATURE K 2 0 16 013001 SPECIFIC HUMIDITY KG/KG 5 0 14 013002 MIXING RATIO KG/KG 5 0 14 013003 RELATIVE HUMIDITY % 0 0 7 013011 TOTAL PRECIPITATION / TOTAL WATER EQUIVALENT KG/M**2 1 -1 14 013013 TOTAL SNOW DEPTH M 3 -20 20 013031 EVAPOTRANSPIRATION KG/M**2 1 0 7 013033 EVAPORATION/EVAPOTRANSPIRATION KG/M**2 1 0 10 013192 [SIM] Cloud liquid water content KG/KG 8 0 27 013193 [SIM] Cloud ice content KG/KG 8 0 27 013195 [SIM] Precipitating liquid water KG/KG 8 0 27 013196 [SIM] Precipitating ice KG/KG 8 0 27 013197 [SIM] Total precipitating water+ice KG/KG 8 0 27 013198 [SIM] Total liquid water (cloud+precipitating) KG/KG 8 0 27 013199 [SIM] Total ice (cloud+precipitating) KG/KG 8 0 27 013200 [SIM] Grid-scale liquid precipitation KG/M**2 1 -1 14 013201 [SIM] Grid-scale snowfall KG/M**2 1 -1 14 013202 [SIM] Convective liquid precipitation KG/M**2 1 -1 14 013203 [SIM] Convective snowfall KG/M**2 1 -1 14 013204 [SIM] Total convective precipitation (liquid + snow) KG/M**2 1 -1 14 013205 [SIM] Snowfall (grid-scale + convective) KG/M**2 1 -1 14 013206 [SIM] Soil water content KG/M**2 1 0 14 013212 [SIM] Leaf wetness duration S -1 0 24 014016 NET RADIATION J/M**2 -4 -16384 15 014017 INSTANTANEOUS LONG-WAVE RADIATION (incoming) W/M**2 0 -2048 12 014018 INSTANTANEOUS SHORT-WAVE RADIATION (incoming) W/M**2 0 -2048 12 014019 SURFACE ALBEDO % 0 0 7 014021 GLOBAL SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15 014031 TOTAL SUNSHINE MINUTE 0 0 11 014192 [SIM] Instantenous sensible heat flux W/m**2 0 -1024 11 014193 [SIM] Instantenous latent heat flux W/m**2 0 -1024 11 014194 [SIM] Instantenous direct solar radiation W/M**2 0 -2048 12 014195 [SIM] Instantenous diffuse solar radiation W/M**2 0 -2048 12 014196 [SIM] INSTANTANEOUS NET LONG-WAVE RADIATION W/M**2 0 -2048 12 014197 [SIM] INSTANTANEOUS NET SHORT-WAVE RADIATION W/M**2 0 -2048 12 015192 [SIM] NO Concentration KG/M**3 10 0 20 015193 [SIM] NO2 Concentration KG/M**3 10 0 20 015194 [SIM] O3 Concentration KG/M**3 10 0 20 015195 [SIM] PM10 Concentration KG/M**3 10 0 20 015196 [SIM] CO Concentration KG/M**3 10 0 20 015197 [SIM] SO2 Concentration KG/M**3 10 0 20 015198 [SIM] PM2.5 Concentration KG/M**3 10 0 20 015199 [SIM] NOY Concentration KG/M**3 10 0 20 015200 [SIM] HCNM Concentration KG/M**3 10 0 20 015201 [SIM] ALDE Concentration KG/M**3 10 0 20 015202 [SIM] PM5 Concentration (tot. aerosol < 5 ug) KG/M**3 10 0 20 015203 [SIM] PM1 Concentration (tot. aerosol < 1.25 ug) KG/M**3 10 0 20 015204 [SIM] PM06 Concentration (tot. aerosol < 0.6 ug) KG/M**3 10 0 20 015205 [SIM] PM03 Concentration (tot. aerosol < 0.3 ug) KG/M**3 10 0 20 015206 [SIM] PM015 Concentration (tot. aerosol < 0.15 ug) KG/M**3 10 0 20 015207 [SIM] PM008 Concentration (tot. aerosol < 0.08 ug) KG/M**3 10 0 20 015208 [SIM] Concentration of primary particulate matter in PM10 KG/M**3 10 0 20 015209 [SIM] Concentration of sulfate in PM10 KG/M**3 10 0 20 015210 [SIM] Concentration of nitrate in PM10 KG/M**3 10 0 20 015211 [SIM] Concentration of ammonium in PM10 KG/M**3 10 0 20 015212 [SIM] Concentration of black carbon in PM10 KG/M**3 10 0 20 015213 [SIM] Concentration of organic carbon in PM10 KG/M**3 10 0 20 015214 [SIM] Concentration of dust in PM10 KG/M**3 10 0 20 015215 [SIM] Concentration of anthrop. A1D in PM10 KG/M**3 10 0 20 015216 [SIM] Concentration of anthrop. BmP in PM10 KG/M**3 10 0 20 015217 [SIM] Concentration of biogenic A1D in PM10 KG/M**3 10 0 20 015218 [SIM] Concentration of biogenic BmP in PM10 KG/M**3 10 0 20 015219 [SIM] Concentration of water in PM10 KG/M**3 10 0 20 015220 [SIM] Concentration of sea salt in PM10 KG/M**3 10 0 20 015221 [SIM] Concentration of secondary organic aerosol in PM10 KG/M**3 10 0 20 015222 [SIM] Total concentration of primary aerosol in PM10 KG/M**3 10 0 20 015223 [SIM] Total concentration of secondary aerosol in PM10 KG/M**3 10 0 20 015224 [SIM] Uncertainity in O3 estimate (Pesco) KG/M**3 10 0 20 015225 [SIM] Uncertainity in PM10 estimate (Pesco) KG/M**3 10 0 20 015226 [SIM] Uncertainity in NO2 estimate (Pesco) KG/M**3 10 0 20 015227 [SIM] Uncertainity in PM2.5 estimate (Pesco) KG/M**3 10 0 20 015228 [SIM] NH3 Concentration KG/M**3 10 0 20 015229 [SIM] Concentration of primary part. matter in aerosol KG/M**3 10 0 20 015230 [SIM] Concentration of sulfate in aerosol KG/M**3 10 0 20 015231 [SIM] Concentration of nitrate in aerosol KG/M**3 10 0 20 015232 [SIM] Concentration of ammonium in aerosol KG/M**3 10 0 20 015233 [SIM] Concentration of anthrop. sec. org. in aerosol KG/M**3 10 0 20 015234 [SIM] Concentration of biogenic sec. org. in aerosol KG/M**3 10 0 20 015235 [SIM] Concentration of ISOPA1 in PM10 KG/M**3 10 0 20 020001 HORIZONTAL VISIBILITY M -1 0 13 020003 PRESENT WEATHER (SEE NOTE 1) CODE TABLE 20003 0 0 9 020004 PAST WEATHER (1) (SEE NOTE 2) CODE TABLE 20004 0 0 5 020005 PAST WEATHER (2) (SEE NOTE 2) CODE TABLE 20005 0 0 5 020009 GENERAL WEATHER INDICATOR (TAF/METAR) CODE TABLE 20009 0 0 4 020010 CLOUD COVER (TOTAL) % 0 0 7 020011 CLOUD AMOUNT CODE TABLE 20011 0 0 4 020012 CLOUD TYPE CODE TABLE 20012 0 0 6 020013 HEIGHT OF BASE OF CLOUD M 0 -400 17 020017 CLOUD TOP DESCRIPTION CODE TABLE 20017 0 0 4 020019 SIGNIFICANT PRESENT OR FORECAST WEATHER CCITTIA5 0 0 72 020021 TYPE OF PRECIPITATION FLAG TABLE 20021 0 0 30 020042 AIRFRAME ICING PRESENT CODE TABLE 20042 0 0 2 020043 PEAK LIQUID WATER CONTENT KG/M**3 4 0 7 020044 AVERAGE LIQUID WATER CONTENT KG/M**3 4 0 7 020045 SUPERCOOLED LARGE DROPLET (SLD) CONDITIONS CODE TABLE 20045 0 0 2 020062 STATE OF THE GROUND (WITH OR WITHOUT SNOW) CODE TABLE 20062 0 0 5 020193 [SIM] Cloud type (METAR) CCITTIA5 0 0 16 022001 DIRECTION OF WAVES DEGREE TRUE 0 0 9 022011 PERIOD OF WAVES S 0 0 6 022012 PERIOD OF WIND WAVES S 0 0 6 022021 HEIGHT OF WAVES M 1 0 10 022022 HEIGHT OF WIND WAVES M 1 0 10 022037 Tidal elevation with respect to national land datum M 3 -10000 15 022043 SEA/WATER TEMPERATURE K 2 0 15 022070 SIGNIFICANT WAVE HEIGHT M 2 0 13 022071 SPECTRAL PEAK WAVE PERIOD S 1 0 9 022074 AVERAGE WAVE PERIOD S 1 0 9 023192 [SIM] Dry deposition of H2SO4 MOL/M**2 5 0 20 023193 [SIM] Wet deposition of H2SO4 MOL/M**2 5 0 20 023194 [SIM] Dry deposition of NH4 MOL/M**2 5 0 20 023195 [SIM] Wet deposition of NH4 MOL/M**2 5 0 20 023196 [SIM] Dry deposition of HNO3 MOL/M**2 5 0 20 023197 [SIM] Wet deposition of HNO3 MOL/M**2 5 0 20 025076 LOG-10 OF (TEMP-RAD CENTRAL WAVENUMBER) FOR ATOVS LOGM-1 8 0 30 029192 [SIM] Land fraction % 1 0 10 031000 SHORT DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 1 031001 DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 8 031002 EXTENDED DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 16 031011 DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 8 031012 EXTENDED DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 16 031021 ASSOCIATED FIELD SIGNIFICANCE CODE TABLE 31021 0 0 6 031031 DATA PRESENT INDICATOR FLAG TABLE 31031 0 0 1 033002 QUALITY INFORMATION CODE TABLE 33002 0 0 2 033003 QUALITY INFORMATION CODE TABLE 33003 0 0 3 033005 QUALITY INFORMATION (AWS DATA) FLAG TABLE 33005 0 0 30 033006 INTERNAL MEASUREMENT STATUS INFORMATION (AWS) CODE TABLE 33006 0 0 3 033007 PER CENT CONFIDENCE % 0 0 7 033015 DATA QUALITY CHECK INDICATOR CODE TABLE 33015 0 0 6 033020 QUALITY CONTROL INDICATION OF FOLLOWING VALUE CODE TABLE 33020 0 0 3 033021 QUALITY OF FOLLOWING VALUE CODE TABLE 33021 0 0 2 033022 QUALITY OF BUOY SATELLITE TRANSMISSION CODE TABLE 33022 0 0 2 033023 QUALITY OF BUOY LOCATION CODE TABLE 33023 0 0 2 033024 STATION ELEVATION QUALITY MARK (FOR MOBILE STATIONS) CODE TABLE 33024 0 0 4 033025 ACARS INTERPOLATED VALUES CODE TABLE 33025 0 0 3 033026 MOISTURE QUALITY CODE TABLE 33026 0 0 6 033027 LOCATION QUALITY CLASS (RANGE OF RADIUS OF 66 % CONFIDENCE) CODE TABLE 33027 0 0 3 033030 SCAN LINE STATUS FLAGS FOR ATOVS FLAG TABLE 33030 0 0 24 033031 SCAN LINE QUALITY FLAGS FOR ATOVS FLAG TABLE 33031 0 0 24 033032 CHANNEL QUALITY FLAGS FOR ATOVS FLAG TABLE 33032 0 0 24 033033 FIELD OF VIEW QUALITY FLAGS FOR ATOVS FLAG TABLE 33033 0 0 24 033035 MANUAL/AUTOMATIC QUALITY CONTROL CODE TABLE 33035 0 0 4 033036 NOMINAL CONFIDENCE THRESHOLD % 0 0 7 033037 WIND CORRELATION ERROR FLAG TABLE 33037 0 0 20 033038 QUALITY FLAGS FOR GROUND-BASED GNSS DATA FLAG TABLE 33038 0 0 10 033040 CONFIDENCE INTERVAL % 0 0 7 033041 ATTRIBUTE OF FOLLOWING VALUE CODE TABLE 33041 0 0 2 033050 GLOBAL GTSPP QUALITY FLAG CODE TABLE 33050 0 0 4 033192 [SIM] Climatological and consistency check % 0 0 7 033193 [SIM] Time consistency % 0 0 7 033194 [SIM] Space consistency % 0 0 7 033195 [SIM] MeteoDB variable ID NUMERIC 0 0 24 033196 [SIM] Data has been invalidated CODE TABLE 33196 0 0 2 033197 [SIM] Manual replacement in substitution CODE TABLE 33197 0 0 2 033198 [SIM] Observation increment NUMERIC 4 -1073741823 31 033201 [SIM] Kalman coefficient, state vector (s.v.) x1 NUMERIC 4 -1073741823 31 033202 [SIM] Kalman coefficient, state vector (s.v.) x2 NUMERIC 4 -1073741823 31 033203 [SIM] Kalman coefficient, s.v. error covariance matrix(1,1) NUMERIC 4 -1073741823 31 033204 [SIM] Kalman coefficient, s.v. error covariance matrix(1,2) NUMERIC 4 -1073741823 31 033205 [SIM] Kalman coefficient, s.v. error covariance matrix(2,1) NUMERIC 4 -1073741823 31 033206 [SIM] Kalman coefficient, s.v. error covariance matrix(2,2) NUMERIC 4 -1073741823 31 033207 [SIM] Kalman observation sequential counter NUMERIC 0 -127 8 033208 [SIM] Kalman osservation missing counter NUMERIC 0 -127 8 033209 [SIM] Normalized Density Index % 0 0 7 dballe-5.18/tables/mkbdoc0000755000175000017500000000610511173330007012247 00000000000000#!/usr/bin/perl -w use strict; use warnings; my $op = $ARGV[0]; # Skip the declaration section my @vals; while () { push @vals, [unpack('xA6xA64xA24xA3xA12xA3xA24xA3xA10', $_)]; } # Now @vals contains an array of: # # [ # 0: B code # 1: Description # 2: BUFR units # 3: BUFR scale # 4: BUFR bit reference # 5: BUFR bit lenhth # 6: CREX units # 7: CREX scale # 8: CREX length # ] # # Only CREX data is used in the local B table sub mkformat($$$) { my ($unit, $len, $dec) = @_; $len = int($len); if ($unit =~ /^CHARACTER|^CODE TABLE/) { return "$len chars"; } elsif ($dec == 0) { return "$len digits"; } elsif ($dec > 0) { return '#' x ($len - $dec) . '.' . '#' x $dec; } elsif ($dec < 0) { return '#' x $len . '0' x (-$dec); } } #my $nc = '@{\hspace{0.5mm}}l@{\hspace{0.5mm}}'; #my $dsc = '@{\hspace{0.5mm}}p{2.0cm}@{\hspace{0.5mm}}'; #my $onc = '@{\hspace{0.5mm}}p{1.4cm}@{\hspace{0.5mm}}'; #my $cmc = '@{\hspace{0.5mm}}p{3.5cm}@{\hspace{0.5mm}}'; #print qq#{\\begin{scriptsize} #\\begin{longtable}{|$nc|$nc|$nc|$dsc|$onc|$onc|$onc|$cmc|} #\\hline #{\\em Name} & {\\em Unit} & {\\em Format} & {\\em Description} & {\\em On insert input} & {\\em On query input} & {\\em On output} & {\\em Comment} \\\\ #\\hline #\\endhead #\\hline #\\endfoot ##; if ($op eq 'tex') { my $nc = '@{\hspace{0.5mm}}l@{\hspace{0.5mm}}'; my $dsc = '@{\hspace{0.5mm}}p{8.0cm}@{\hspace{0.5mm}}'; print qq({\\begin{scriptsize} \\begin{longtable}{|$nc|$dsc|$nc|$nc|} \\hline {\\em Code} & {\\em Description} & {\\em Units} & {\\em Format} \\\\ \\hline \\endhead \\hline \\endfoot ); for my $d (@vals) { my ($code, $desc, $unit, $dec, $len) = @{$d}[0, 1, 6, 7, 8]; my $format = mkformat($unit, $len, $dec); $format =~ s/(\#+\.\#+)/{\\tiny $1}/; $unit =~ s/CHARACTER/Character/; $unit =~ s/(NUMERIC|NUMBER)/Numeric/; $desc =~ s/%/\\%/; $unit =~ s/%/\\%/; my $out = join(' & ', ($code, $desc, $unit, $format))." \\\\\n"; $out =~ s/(_|#)/\\$1/g; print $out; } print q(\hline \end{longtable} \end{scriptsize} ); } elsif ($op eq 'dox') { our ($code, $desc, $unit, $format); print q{/**@defgroup local_b_table Local B table @ingroup tables This table lists all the entries of the local B table. You can use them to provide context information for a measured value. Every entry is listed together with its measure unit, length in characters or digits and description. \verbatim }; format DoxTop = Code Description Unit Format . format Dox = @<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<< $code, $desc, $unit, $format . $^L = "\n\n"; $^ = "DoxTop"; $~ = "Dox"; for my $d (@vals) { my ($dec, $len); ($code, $desc, $unit, $dec, $len) = @{$d}[0, 1, 6, 7, 8]; $format = mkformat($unit, $len, $dec); $unit =~ s/CHARACTER/Character/; $unit =~ s/(NUMERIC|NUMBER)/Numeric/; write STDOUT; } print q{\endverbatim */ }; } else { die "unknown output format $op"; } exit 0; dballe-5.18/tables/B000000002001200.txt0000644000175000017500000004540011405254361013340 00000000000000 001001 WMO BLOCK NUMBER NUMERIC 0 0 7 001002 WMO STATION NUMBER NUMERIC 0 0 10 001007 SATELLITE IDENTIFIER CODE TABLE 1007 0 0 10 001008 AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION CCITTIA5 0 0 64 001011 SHIP OR MOBILE LAND STATION IDENTIFIER CCITTIA5 0 0 72 001012 DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** DEGREE TRUE 0 0 9 001013 SPEED OF MOTION OF MOVING OBSERVING PLATFORM* M/S 0 0 10 001019 LONG STATION OR SITE NAME CCITTIA5 0 0 256 001063 ICAO LOCATION INDICATOR CCITTIA5 0 0 64 001192 [SIM] MeteoDB station ID NUMERIC 0 0 24 001193 [SIM] Report code NUMERIC 0 0 16 001194 [SIM] Report mnemonic CCITTIA5 0 0 128 001212 AIR QUALITY OBSERVING STATION LOCAL CODE CCITTIA5 0 0 56 001213 AIRBASE AIR QUALITY OBSERVING STATION CODE CCITTIA5 0 0 56 001214 GEMS AIR QUALITY OBSERVING STATION CODE CCITTIA5 0 0 48 001215 AIR QUALITY OBSERVING STATION DOMINANT EMISSION SOURCE CODE TABLE 001215 0 0 3 001216 AIR QUALITY OBSERVING STATION AREA TYPE CODE TABLE 001216 0 0 3 001217 AIR QUALITY OBSERVING STATION TERRAIN TYPE CODE TABLE 001217 0 0 4 002001 TYPE OF STATION CODE TABLE 2001 0 0 2 002002 TYPE OF INSTRUMENTATION FOR WIND MEASUREMENT FLAG TABLE 2002 0 0 4 002005 PRECISION OF TEMPERATURE OBSERVATION K 2 0 7 002011 RADIOSONDE TYPE CODE TABLE 2011 0 0 8 002012 RADIOSONDE COMPUTATIONAL METHOD CODE TABLE 2012 0 0 4 002048 SATELLITE SENSOR INDICATOR CODE TABLE 2048 0 0 4 002061 AIRCRAFT NAVIGATIONAL SYSTEM CODE TABLE 2061 0 0 3 002062 TYPE OF AIRCRAFT DATA RELAY SYSTEM CODE TABLE 2062 0 0 4 002063 AIRCRAFT ROLL ANGLE DEGREE 2 -18000 16 002070 ORIGINAL SPECIFICATION OF LATITUDE/LONGITUDE CODE TABLE 2070 0 0 4 004001 YEAR YEAR 0 0 12 004002 MONTH MONTH 0 0 4 004003 DAY DAY 0 0 6 004004 HOUR HOUR 0 0 5 004005 MINUTE MINUTE 0 0 6 004006 SECOND SECOND 0 0 6 004192 [SIM] Time range type NUMERIC 0 0 10 004193 [SIM] Time range P1 NUMERIC 0 -536870912 31 004194 [SIM] Time range P2 NUMERIC 0 -536870912 31 005001 LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25 005021 BEARING OR AZIMUTH DEGREE TRUE 2 0 16 005022 SOLAR AZIMUTH DEGREE TRUE 2 0 16 005040 ORBIT NUMBER NUMERIC 0 0 24 005041 SCAN LINE NUMBER NUMERIC 0 0 8 005043 FIELD OF VIEW NUMBER NUMERIC 0 0 8 006001 LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26 007001 HEIGHT OF STATION (SEE NOTE 1) M 0 -400 15 007002 HEIGHT OR ALTITUDE M -1 -40 16 007004 PRESSURE PA -1 0 14 007024 SATELLITE ZENITH ANGLE DEGREE 2 -9000 15 007025 SOLAR ZENITH ANGLE DEGREE 2 -9000 15 007031 HEIGHT OF BAROMETER ABOVE MEAN SEA LEVEL (SEE NOTE 4) M 1 - 4000 17 007192 [SIM] First level type NUMERIC 0 0 10 007193 [SIM] Level L1 NUMERIC 0 -536870912 31 007194 [SIM] Level L2 NUMERIC 0 -536870912 31 007195 [SIM] Second level type NUMERIC 0 0 31 008001 VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8001 0 0 7 008004 PHASE OF AIRCRAFT FLIGHT CODE TABLE 8004 0 0 3 008021 TIME SIGNIFICANCE CODE TABLE 8021 0 0 5 008044 (VAL) CAS REGISTRY NUMBER CCITTIA5 0 0 88 010003 GEOPOTENTIAL M**2/S**2 0 -4000 24 010004 PRESSURE PA -1 0 14 010007 HEIGHT M 0 -1000 17 010009 GEOPOTENTIAL HEIGHT GPM 0 -1000 17 010051 PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14 010052 ALTIMETER SETTING (QNH) PA -1 0 14 010061 3-HOUR PRESSURE CHANGE PA -1 -500 11 010063 CHARACTERISTIC OF PRESSURE TENDENCY CODE TABLE 10063 0 0 4 010197 ANEMOMETER HEIGHT M 0 0 9 011001 WIND DIRECTION DEGREE TRUE 0 0 9 011002 WIND SPEED M/S 1 0 12 011003 U-COMPONENT M/S 1 -4096 13 011004 V-COMPONENT M/S 1 -4096 13 011005 W-COMPONENT PA/S 1 -512 10 011006 W-COMPONENT M/S 2 -4096 13 011016 EXTREME COUNTERCLOCKWISE WIND DIRECTION OF A VARIABLE WIND DEGREE TRUE 0 0 9 011017 EXTREME CLOCKWISE WIND DIRECTION OF A VARIABLE WIND DEGREE TRUE 0 0 9 011041 MAXIMUM WIND GUST SPEED M/S 1 0 12 012001 TEMPERATURE/DRY-BULB TEMPERATURE K 1 0 12 012002 WET-BULB TEMPERATURE K 1 0 12 012003 DEW-POINT TEMPERATURE K 1 0 12 012030 SOIL TEMPERATURE K 1 0 12 012061 SKIN TEMPERATURE K 1 0 12 012063 BRIGHTNESS TEMPERATURE K 1 0 12 013001 SPECIFIC HUMIDITY KG/KG 5 0 14 013003 RELATIVE HUMIDITY % 0 0 7 013011 TOTAL PRECIPITATION / TOTAL WATER EQUIVALENT KG/M**2 1 -1 14 013013 TOTAL SNOW DEPTH M 3 -20 20 014016 NET RADIATION J/M**2 -4 -16384 15 014018 INSTANTANEOUS SHORT-WAVE RADIATION W/M**2 -3 -2048 12 014021 GLOBAL SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15 014192 [SIM] Instantenous sensible heat flux W m-2 -3 -2048 12 014193 [SIM] Instantenous latent heat flux W m-2 -3 -2048 12 015192 [SIM] NO Concentration KG/M**3 10 0 14 015193 [SIM] NO2 Concentration KG/M**3 10 0 14 015194 [SIM] O3 Concentration KG/M**3 10 0 14 015195 [SIM] PM10 Concentration KG/M**3 10 0 14 015196 [SIM] CO Concentration KG/M**3 10 0 14 015197 [SIM] SO2 Concentration KG/M**3 10 0 14 015198 [SIM] PM2.5 Concentration KG/M**3 10 0 14 020001 HORIZONTAL VISIBILITY M -1 0 13 020003 PRESENT WEATHER (SEE NOTE 1) CODE TABLE 20003 0 0 9 020004 PAST WEATHER (1) (SEE NOTE 2) CODE TABLE 20004 0 0 5 020005 PAST WEATHER (2) (SEE NOTE 2) CODE TABLE 20005 0 0 5 020009 GENERAL WEATHER INDICATOR (TAF/METAR) CODE TABLE 20009 0 0 4 020010 CLOUD COVER (TOTAL) % 0 0 7 020011 CLOUD AMOUNT CODE TABLE 20011 0 0 4 020012 CLOUD TYPE CODE TABLE 20012 0 0 6 020013 HEIGHT OF BASE OF CLOUD M 0 -400 17 020019 SIGNIFICANT PRESENT OR FORECAST WEATHER CCITTIA5 0 0 72 020021 TYPE OF PRECIPITATION FLAG TABLE 20021 0 0 30 020062 STATE OF THE GROUND (WITH OR WITHOUT SNOW) CODE TABLE 20062 0 0 5 020193 [SIM] Cloud type (METAR) CCITTIA5 0 0 16 022001 DIRECTION OF WAVES DEGREE TRUE 0 0 9 022011 PERIOD OF WAVES S 0 0 6 022012 PERIOD OF WIND WAVES S 0 0 6 022021 HEIGHT OF WAVES M 1 0 10 022022 HEIGHT OF WIND WAVES M 1 0 10 022042 SEA/WATER TEMPERATURE K 1 0 12 022070 SIGNIFICANT WAVE HEIGHT M 2 0 13 022071 SPECTRAL PEAK WAVE PERIOD S 1 0 9 022074 AVERAGE WAVE PERIOD S 1 0 9 025076 LOG-10 OF (TEMP-RAD CENTRAL WAVENUMBER) FOR ATOVS LOGM-1 8 0 30 031000 SHORT DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 1 031001 DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 8 031002 EXTENDED DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 16 031011 DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 8 031012 EXTENDED DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 16 031021 ASSOCIATED FIELD SIGNIFICANCE CODE TABLE 31021 0 0 6 031031 DATA PRESENT INDICATOR FLAG TABLE 31031 0 0 1 033002 QUALITY INFORMATION CODE TABLE 33002 0 0 2 033003 QUALITY INFORMATION CODE TABLE 33003 0 0 3 033005 QUALITY INFORMATION (AWS DATA) FLAG TABLE 33005 0 0 30 033006 INTERNAL MEASUREMENT STATUS INFORMATION (AWS) CODE TABLE 33006 0 0 3 033007 PER CENT CONFIDENCE % 0 0 7 033015 DATA QUALITY CHECK INDICATOR CODE TABLE 33015 0 0 6 033020 QUALITY CONTROL INDICATION OF FOLLOWING VALUE CODE TABLE 33020 0 0 3 033021 QUALITY OF FOLLOWING VALUE CODE TABLE 33021 0 0 2 033022 QUALITY OF BUOY SATELLITE TRANSMISSION CODE TABLE 33022 0 0 2 033023 QUALITY OF BUOY LOCATION CODE TABLE 33023 0 0 2 033024 STATION ELEVATION QUALITY MARK (FOR MOBILE STATIONS) CODE TABLE 33024 0 0 4 033025 ACARS INTERPOLATED VALUES CODE TABLE 33025 0 0 3 033026 MOISTURE QUALITY CODE TABLE 33026 0 0 6 033027 LOCATION QUALITY CLASS (RANGE OF RADIUS OF 66 % CONFIDENCE) CODE TABLE 33027 0 0 3 033030 SCAN LINE STATUS FLAGS FOR ATOVS FLAG TABLE 33030 0 0 24 033031 SCAN LINE QUALITY FLAGS FOR ATOVS FLAG TABLE 33031 0 0 24 033032 CHANNEL QUALITY FLAGS FOR ATOVS FLAG TABLE 33032 0 0 24 033033 FIELD OF VIEW QUALITY FLAGS FOR ATOVS FLAG TABLE 33033 0 0 24 033035 MANUAL/AUTOMATIC QUALITY CONTROL CODE TABLE 33035 0 0 4 033036 NOMINAL CONFIDENCE THRESHOLD % 0 0 7 033037 WIND CORRELATION ERROR FLAG TABLE 33037 0 0 20 033038 QUALITY FLAGS FOR GROUND-BASED GNSS DATA FLAG TABLE 33038 0 0 10 033040 CONFIDENCE INTERVAL % 0 0 7 033041 ATTRIBUTE OF FOLLOWING VALUE CODE TABLE 33041 0 0 2 033050 GLOBAL GTSPP QUALITY FLAG CODE TABLE 33050 0 0 4 033192 [SIM] Climatological and consistency check % 0 0 7 033193 [SIM] Time consistency % 0 0 7 033194 [SIM] Space consistency % 0 0 7 033195 [SIM] MeteoDB variable ID NUMERIC 0 0 24 033196 [SIM] Data has been invalidated CODE TABLE 33196 0 0 1 033197 [SIM] Manual replacement in substitution CODE TABLE 33197 0 0 2 033198 [SIM] Observation increment NUMERIC 4 -536870912 31 dballe-5.18/tables/B990203.txt0000644000175000017500000006130111405254361012500 00000000000000 001001 WMO BLOCK NUMBER NUMERIC 0 0 7 NUMERIC 0 2 001002 WMO STATION NUMBER NUMERIC 0 0 10 NUMERIC 0 3 001007 SATELLITE IDENTIFIER CODE TABLE 1007 0 0 10 CODE TABLE 1007 0 3 001008 AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION CCITTIA5 0 0 64 CHARACTER 0 8 001011 SHIP OR MOBILE LAND STATION IDENTIFIER CCITTIA5 0 0 72 CHARACTER 0 9 001012 DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 001013 SPEED OF MOTION OF MOVING OBSERVING PLATFORM* M/S 0 0 10 M/S 0 3 001019 LONG STATION OR SITE NAME CCITTIA5 0 0 256 CHARACTER 0 32 001063 ICAO LOCATION INDICATOR CCITTIA5 0 0 64 CHARACTER 0 8 001192 [SIM] MeteoDB station ID NUMERIC 0 0 24 NUMERIC 0 8 001193 [SIM] Report code NUMERIC 0 0 16 NUMERIC 0 5 001194 [SIM] Report mnemonic CCITTIA5 0 0 128 CHARACTER 0 16 001212 AIR QUALITY OBSERVING STATION LOCAL CODE CCITTIA5 0 0 56 CHARACTER 0 7 001213 AIRBASE AIR QUALITY OBSERVING STATION CODE CCITTIA5 0 0 56 CHARACTER 0 7 001214 GEMS AIR QUALITY OBSERVING STATION CODE CCITTIA5 0 0 48 CHARACTER 0 6 001215 AIR QUALITY OBSERVING STATION DOMINANT EMISSION SOURCE CODE TABLE 001215 0 0 3 CODE TABLE 001215 0 1 001216 AIR QUALITY OBSERVING STATION AREA TYPE CODE TABLE 001216 0 0 3 CODE TABLE 001216 0 1 001217 AIR QUALITY OBSERVING STATION TERRAIN TYPE CODE TABLE 001217 0 0 4 CODE TABLE 001217 0 2 002001 TYPE OF STATION CODE TABLE 2001 0 0 2 CODE TABLE 2001 0 1 002002 TYPE OF INSTRUMENTATION FOR WIND MEASUREMENT FLAG TABLE 2002 0 0 4 FLAG TABLE 2002 0 2 002005 PRECISION OF TEMPERATURE OBSERVATION K 2 0 7 K 2 3 002011 RADIOSONDE TYPE CODE TABLE 2011 0 0 8 CODE TABLE 2011 0 3 002012 RADIOSONDE COMPUTATIONAL METHOD CODE TABLE 2012 0 0 4 CODE TABLE 2012 0 2 002048 SATELLITE SENSOR INDICATOR CODE TABLE 2048 0 0 4 CODE TABLE 2048 0 2 002061 AIRCRAFT NAVIGATIONAL SYSTEM CODE TABLE 2061 0 0 3 CODE TABLE 2061 0 1 002062 TYPE OF AIRCRAFT DATA RELAY SYSTEM CODE TABLE 2062 0 0 4 CODE TABLE 2062 0 2 002063 AIRCRAFT ROLL ANGLE DEGREE 2 -18000 16 DEGREE 2 5 002070 ORIGINAL SPECIFICATION OF LATITUDE/LONGITUDE CODE TABLE 2070 0 0 4 CODE TABLE 2070 0 2 004001 YEAR YEAR 0 0 12 YEAR 0 4 004002 MONTH MONTH 0 0 4 MONTH 0 2 004003 DAY DAY 0 0 6 DAY 0 2 004004 HOUR HOUR 0 0 5 HOUR 0 2 004005 MINUTE MINUTE 0 0 6 MINUTE 0 2 004006 SECOND SECOND 0 0 6 SECOND 0 2 004192 [SIM] Time range type NUMERIC 0 0 10 NUMERIC 0 4 004193 [SIM] Time range P1 NUMERIC 0 -536870912 31 NUMERIC 0 10 004194 [SIM] Time range P2 NUMERIC 0 -536870912 31 NUMERIC 0 10 005001 LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7 005021 BEARING OR AZIMUTH DEGREE TRUE 2 0 16 DEGREE TRUE 2 5 005022 SOLAR AZIMUTH DEGREE TRUE 2 0 16 DEGREE TRUE 2 5 005040 ORBIT NUMBER NUMERIC 0 0 24 NUMERIC 0 8 005041 SCAN LINE NUMBER NUMERIC 0 0 8 NUMERIC 0 3 005043 FIELD OF VIEW NUMBER NUMERIC 0 0 8 NUMERIC 0 3 006001 LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8 007001 HEIGHT OF STATION (SEE NOTE 1) M 0 -400 15 M 0 5 007002 HEIGHT OR ALTITUDE M -1 -40 16 M -1 5 007004 PRESSURE PA -1 0 14 PA -1 5 007024 SATELLITE ZENITH ANGLE DEGREE 2 -9000 15 DEGREE 2 5 007025 SOLAR ZENITH ANGLE DEGREE 2 -9000 15 DEGREE 2 5 007031 HEIGHT OF BAROMETER ABOVE MEAN SEA LEVEL (SEE NOTE 4) M 1 - 4000 17 M 1 5 007192 [SIM] First level type NUMERIC 0 0 10 NUMERIC 0 4 007193 [SIM] Level L1 NUMERIC 0 -536870912 31 NUMERIC 0 10 007194 [SIM] Level L2 NUMERIC 0 -536870912 31 NUMERIC 0 10 007195 [SIM] Second level type NUMERIC 0 0 31 NUMERIC 0 4 008001 VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8001 0 0 7 FLAG TABLE 8001 0 3 008004 PHASE OF AIRCRAFT FLIGHT CODE TABLE 8004 0 0 3 CODE TABLE 8004 0 1 008021 TIME SIGNIFICANCE CODE TABLE 8021 0 0 5 CODE TABLE 8021 0 2 008044 (VAL) CAS REGISTRY NUMBER CCITTIA5 0 0 88 CHARACTER 0 11 010003 GEOPOTENTIAL M**2/S**2 0 -4000 24 M**2/S**2 0 7 010004 PRESSURE PA -1 0 14 PA -1 5 010007 HEIGHT M 0 -1000 17 M 0 6 010009 GEOPOTENTIAL HEIGHT GPM 0 -1000 17 GPM 0 5 010051 PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14 PA -1 5 010052 ALTIMETER SETTING (QNH) PA -1 0 14 PA -1 5 010061 3-HOUR PRESSURE CHANGE PA -1 -500 11 PA -1 4 010063 CHARACTERISTIC OF PRESSURE TENDENCY CODE TABLE 10063 0 0 4 CODE TABLE 10063 0 2 010197 ANEMOMETER HEIGHT M 0 0 9 M 0 3 011001 WIND DIRECTION DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 011002 WIND SPEED M/S 1 0 12 M/S 1 4 011003 U-COMPONENT M/S 1 -4096 13 M/S 1 4 011004 V-COMPONENT M/S 1 -4096 13 M/S 1 4 011005 W-COMPONENT PA/S 1 -512 10 PA/S 1 4 011006 W-COMPONENT M/S 2 -4096 13 M/S 2 4 011016 EXTREME COUNTERCLOCKWISE WIND DIRECTION OF A VARIABLE WIND DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 011017 EXTREME CLOCKWISE WIND DIRECTION OF A VARIABLE WIND DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 011041 MAXIMUM WIND GUST SPEED M/S 1 0 12 M/S 1 4 012001 TEMPERATURE/DRY-BULB TEMPERATURE K 1 0 12 K 1 4 012002 WET-BULB TEMPERATURE K 1 0 12 K 1 4 012003 DEW-POINT TEMPERATURE K 1 0 12 K 1 4 012030 SOIL TEMPERATURE K 1 0 12 K 1 4 012061 SKIN TEMPERATURE K 1 0 12 K 1 4 012063 BRIGHTNESS TEMPERATURE K 1 0 12 K 1 4 013001 SPECIFIC HUMIDITY KG/KG 5 0 14 KG/KG 5 5 013003 RELATIVE HUMIDITY % 0 0 7 % 0 3 013011 TOTAL PRECIPITATION / TOTAL WATER EQUIVALENT KG/M**2 1 -1 14 KG/M**2 1 5 013013 TOTAL SNOW DEPTH M 3 -20 20 M 3 6 014016 NET RADIATION J/M**2 -4 -16384 15 J/M**2 -4 5 014018 INSTANTANEOUS SHORT-WAVE RADIATION W/M**2 -3 -2048 12 W/M**2 -3 4 014021 GLOBAL SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15 J/M**2 -4 5 014192 [SIM] Instantenous sensible heat flux W m-2 -3 -2048 12 W m-2 -3 4 014193 [SIM] Instantenous latent heat flux W m-2 -3 -2048 12 W m-2 -3 4 015192 [SIM] NO Concentration KG/M**3 10 0 14 KG/M**3 10 4 015193 [SIM] NO2 Concentration KG/M**3 10 0 14 KG/M**3 10 4 015194 [SIM] O3 Concentration KG/M**3 10 0 14 KG/M**3 10 4 015195 [SIM] PM10 Concentration KG/M**3 10 0 14 KG/M**3 10 4 015196 [SIM] CO Concentration KG/M**3 10 0 14 KG/M**3 10 4 015197 [SIM] SO2 Concentration KG/M**3 10 0 14 KG/M**3 10 4 015198 [SIM] PM2.5 Concentration KG/M**3 10 0 14 KG/M**3 10 4 020001 HORIZONTAL VISIBILITY M -1 0 13 M -1 4 020003 PRESENT WEATHER (SEE NOTE 1) CODE TABLE 20003 0 0 9 CODE TABLE 20003 0 3 020004 PAST WEATHER (1) (SEE NOTE 2) CODE TABLE 20004 0 0 5 CODE TABLE 20004 0 2 020005 PAST WEATHER (2) (SEE NOTE 2) CODE TABLE 20005 0 0 5 CODE TABLE 20005 0 2 020009 GENERAL WEATHER INDICATOR (TAF/METAR) CODE TABLE 20009 0 0 4 CODE TABLE 20009 0 2 020010 CLOUD COVER (TOTAL) % 0 0 7 % 0 3 020011 CLOUD AMOUNT CODE TABLE 20011 0 0 4 CODE TABLE 20011 0 2 020012 CLOUD TYPE CODE TABLE 20012 0 0 6 CODE TABLE 20012 0 2 020013 HEIGHT OF BASE OF CLOUD M 0 -400 17 M 0 5 020019 SIGNIFICANT PRESENT OR FORECAST WEATHER CCITTIA5 0 0 72 CHARACTER 0 9 020021 TYPE OF PRECIPITATION FLAG TABLE 20021 0 0 30 FLAG TABLE 20021 0 10 020062 STATE OF THE GROUND (WITH OR WITHOUT SNOW) CODE TABLE 20062 0 0 5 CODE TABLE 20062 0 2 020193 [SIM] Cloud type (METAR) CCITTIA5 0 0 16 CHARACTER 0 2 022001 DIRECTION OF WAVES DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 022011 PERIOD OF WAVES S 0 0 6 S 0 2 022012 PERIOD OF WIND WAVES S 0 0 6 S 0 2 022021 HEIGHT OF WAVES M 1 0 10 M 1 4 022022 HEIGHT OF WIND WAVES M 1 0 10 M 1 4 022042 SEA/WATER TEMPERATURE K 1 0 12 K 1 4 022070 SIGNIFICANT WAVE HEIGHT M 2 0 13 M 2 4 022071 SPECTRAL PEAK WAVE PERIOD S 1 0 9 S 1 3 022074 AVERAGE WAVE PERIOD S 1 0 9 S 1 3 025076 LOG-10 OF (TEMP-RAD CENTRAL WAVENUMBER) FOR ATOVS LOGM-1 8 0 30 LOGM-1 8 10 031000 SHORT DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 1 NUMERIC 0 1 031001 DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 8 NUMERIC 0 3 031002 EXTENDED DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 16 NUMERIC 0 5 031011 DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 8 NUMERIC 0 3 031012 EXTENDED DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 16 NUMERIC 0 5 031021 ASSOCIATED FIELD SIGNIFICANCE CODE TABLE 31021 0 0 6 CODE TABLE 31021 0 2 031031 DATA PRESENT INDICATOR FLAG TABLE 31031 0 0 1 FLAG TABLE 31031 0 1 033002 QUALITY INFORMATION CODE TABLE 33002 0 0 2 CODE TABLE 33002 0 1 033003 QUALITY INFORMATION CODE TABLE 33003 0 0 3 CODE TABLE 33003 0 1 033005 QUALITY INFORMATION (AWS DATA) FLAG TABLE 33005 0 0 30 FLAG TABLE 33005 0 10 033006 INTERNAL MEASUREMENT STATUS INFORMATION (AWS) CODE TABLE 33006 0 0 3 CODE TABLE 33006 0 1 033007 PER CENT CONFIDENCE % 0 0 7 % 0 3 033015 DATA QUALITY CHECK INDICATOR CODE TABLE 33015 0 0 6 CODE TABLE 33015 0 2 033020 QUALITY CONTROL INDICATION OF FOLLOWING VALUE CODE TABLE 33020 0 0 3 CODE TABLE 33020 0 1 033021 QUALITY OF FOLLOWING VALUE CODE TABLE 33021 0 0 2 CODE TABLE 33021 0 1 033022 QUALITY OF BUOY SATELLITE TRANSMISSION CODE TABLE 33022 0 0 2 CODE TABLE 33022 0 1 033023 QUALITY OF BUOY LOCATION CODE TABLE 33023 0 0 2 CODE TABLE 33023 0 1 033024 STATION ELEVATION QUALITY MARK (FOR MOBILE STATIONS) CODE TABLE 33024 0 0 4 CODE TABLE 33024 0 2 033025 ACARS INTERPOLATED VALUES CODE TABLE 33025 0 0 3 CODE TABLE 33025 0 1 033026 MOISTURE QUALITY CODE TABLE 33026 0 0 6 CODE TABLE 33026 0 2 033027 LOCATION QUALITY CLASS (RANGE OF RADIUS OF 66 % CONFIDENCE) CODE TABLE 33027 0 0 3 CODE TABLE 33027 0 1 033030 SCAN LINE STATUS FLAGS FOR ATOVS FLAG TABLE 33030 0 0 24 FLAG TABLE 33030 0 8 033031 SCAN LINE QUALITY FLAGS FOR ATOVS FLAG TABLE 33031 0 0 24 FLAG TABLE 33031 0 8 033032 CHANNEL QUALITY FLAGS FOR ATOVS FLAG TABLE 33032 0 0 24 FLAG TABLE 33032 0 8 033033 FIELD OF VIEW QUALITY FLAGS FOR ATOVS FLAG TABLE 33033 0 0 24 FLAG TABLE 33033 0 8 033035 MANUAL/AUTOMATIC QUALITY CONTROL CODE TABLE 33035 0 0 4 CODE TABLE 33035 0 2 033036 NOMINAL CONFIDENCE THRESHOLD % 0 0 7 % 0 3 033037 WIND CORRELATION ERROR FLAG TABLE 33037 0 0 20 FLAG TABLE 33037 0 7 033038 QUALITY FLAGS FOR GROUND-BASED GNSS DATA FLAG TABLE 33038 0 0 10 FLAG TABLE 33038 0 4 033040 CONFIDENCE INTERVAL % 0 0 7 PERCENT 0 3 033041 ATTRIBUTE OF FOLLOWING VALUE CODE TABLE 33041 0 0 2 CODE TABLE 33041 0 1 033050 GLOBAL GTSPP QUALITY FLAG CODE TABLE 33050 0 0 4 CODE TABLE 33050 0 2 033192 [SIM] Climatological and consistency check % 0 0 7 PERCENT 0 3 033193 [SIM] Time consistency % 0 0 7 PERCENT 0 3 033194 [SIM] Space consistency % 0 0 7 PERCENT 0 3 033195 [SIM] MeteoDB variable ID NUMERIC 0 0 24 NUMERIC 0 8 033196 [SIM] Data has been invalidated CODE TABLE 33196 0 0 1 CODE TABLE 33196 0 1 033197 [SIM] Manual replacement in substitution CODE TABLE 33197 0 0 2 CODE TABLE 33197 0 1 033198 [SIM] Observation increment NUMERIC 4 -536870912 31 NUMERIC 4 10 dballe-5.18/Makefile.in0000644000175000017500000007523311754230756011704 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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@ 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@ @DO_DBALLEF_TRUE@am__append_1 = fortran @DO_DOCS_TRUE@am__append_2 = doc @DO_DBALLE_PYTHON_TRUE@am__append_3 = swig provami @DO_DBALLE_DB_TRUE@am__append_4 = dbadb.1 subdir = . DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(srcdir)/libdballe.pc.in $(srcdir)/libdballef.pc.in \ $(top_srcdir)/configure COPYING ChangeLog TODO compile \ config.guess config.sub depcomp install-sh ltmain.sh missing \ py-compile ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_flag.m4 \ $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/python.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 = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = libdballe.pc libdballef.pc CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-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 uninstall-recursive 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)$(m4dir)" \ "$(DESTDIR)$(pkgconfigdir)" NROFF = nroff MANS = $(man_MANS) DATA = $(m4_DATA) $(pkgconfig_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir dist dist-all distcheck ETAGS = etags CTAGS = ctags DIST_SUBDIRS = tables dballe extra tools fortran doc swig provami . 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__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 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@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FC = @FC@ FCFLAGS = @FCFLAGS@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBDBALLEF_VERSION_INFO = @LIBDBALLEF_VERSION_INFO@ LIBDBALLE_VERSION_INFO = @LIBDBALLE_VERSION_INFO@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LUA_CFLAGS = @LUA_CFLAGS@ LUA_LIBS = @LUA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ 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@ PKG_CONFIG = @PKG_CONFIG@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WIBBLE_CFLAGS = @WIBBLE_CFLAGS@ WIBBLE_LIBS = @WIBBLE_LIBS@ WREPORT_CFLAGS = @WREPORT_CFLAGS@ WREPORT_LIBS = @WREPORT_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ confdir = @confdir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ have_doxygen = @have_doxygen@ have_gperf = @have_gperf@ have_latex2html = @have_latex2html@ have_rst2html = @have_rst2html@ have_swig = @have_swig@ 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@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ tabledir = @tabledir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ACLOCAL_AMFLAGS = -I m4 SUBDIRS = tables dballe extra tools $(am__append_1) $(am__append_2) \ $(am__append_3) . #examples pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libdballe.pc libdballef.pc m4dir = $(datadir)/aclocal m4_DATA = libdballe.m4 libdballef.m4 man_MANS = dbatbl.1 dbamsg.1 $(am__append_4) EXTRA_DIST = autogen.sh \ libdballe.m4 libdballef.m4 \ libdballe.pc.in libdballef.pc.in \ $(conf_DATA) dballe.spec get_line_no run-check.conf.example \ run-check run-local show_code_notes \ TODO.provami UPGRADE-5.x CLEANFILES = $(man_MANS) all: config.h $(MAKE) $(AM_MAKEFLAGS) 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) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign 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): config.h: stamp-h1 @if test ! -f $@; then rm -f stamp-h1; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 libdballe.pc: $(top_builddir)/config.status $(srcdir)/libdballe.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ libdballef.pc: $(top_builddir)/config.status $(srcdir)/libdballef.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt install-man1: $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" @list=''; test -n "$(man1dir)" || exit 0; \ { 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'; \ } | 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=''; 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-m4DATA: $(m4_DATA) @$(NORMAL_INSTALL) test -z "$(m4dir)" || $(MKDIR_P) "$(DESTDIR)$(m4dir)" @list='$(m4_DATA)'; test -n "$(m4dir)" || list=; \ 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)$(m4dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(m4dir)" || exit $$?; \ done uninstall-m4DATA: @$(NORMAL_UNINSTALL) @list='$(m4_DATA)'; test -n "$(m4dir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(m4dir)'; $(am__uninstall_files_from_dir) install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) test -z "$(pkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ 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)$(pkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ done uninstall-pkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) # 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. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; 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" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) 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; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @list='$(MANS)'; if test -n "$$list"; then \ list=`for p in $$list; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ if test -n "$$list" && \ grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ echo " typically \`make maintainer-clean' will remove them" >&2; \ exit 1; \ else :; fi; \ else :; fi $(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 \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ 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 -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__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__remove_distdir) dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__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.lzma*) \ lzma -dc $(distdir).tar.lzma | $(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 a+w $(distdir) mkdir $(distdir)/_build mkdir $(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__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 $(MANS) $(DATA) config.h installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(m4dir)" "$(DESTDIR)$(pkgconfigdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done 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: -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." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr \ distclean-libtool distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-m4DATA install-man install-pkgconfigDATA 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-man1 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 mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-m4DATA uninstall-man uninstall-pkgconfigDATA uninstall-man: uninstall-man1 .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \ ctags-recursive install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am am--refresh check check-am clean clean-generic \ clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \ dist-gzip dist-lzip dist-lzma dist-shar dist-tarZ dist-xz \ dist-zip distcheck distclean distclean-generic distclean-hdr \ distclean-libtool distclean-tags distcleancheck distdir \ distuninstallcheck 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-m4DATA \ install-man install-man1 install-pdf install-pdf-am \ install-pkgconfigDATA install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am uninstall-m4DATA \ uninstall-man uninstall-man1 uninstall-pkgconfigDATA @DO_DBALLE_DB_TRUE@dbadb.1: tools/dbadb doc/add_templates_to_manpage @DO_DBALLE_DB_TRUE@ ( cd tools && ./`basename $<` help manpage ) | ( cd $(srcdir) && $(srcdir)/doc/add_templates_to_manpage ) > $@ dbamsg.1: tools/dbamsg doc/add_templates_to_manpage ( cd tools && ./`basename $<` help manpage ) | ( cd $(srcdir) && $(srcdir)/doc/add_templates_to_manpage ) > $@ %.1: tools/% ( cd tools && ./`basename $<` help manpage ) > $@ # 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: dballe-5.18/provami/0000755000175000017500000000000011754670142011357 500000000000000dballe-5.18/provami/regenerate-provami-manpage0000755000175000017500000000042011173330007016407 00000000000000#!/bin/sh -ue WORKDIR=`mktemp -d` cp provami.py "$WORKDIR/provami" cp $0 "$WORKDIR/" cd "$WORKDIR/" help2man -n "Manipulate georeferentiated raster image files" --no-info -i $0 -o provami.1 ./provami cd - cp "$WORKDIR/provami.1" . rm -rf "$WORKDIR" exit 0 [SEE ALSO] dballe-5.18/provami/provami.py0000755000175000017500000000367611501711754013340 00000000000000#!/usr/bin/python from optparse import OptionParser import sys, os VERSION="1.0" ### ### Main ### class Parser(OptionParser): def __init__(self, *args, **kwargs): OptionParser.__init__(self, *args, **kwargs) def error(self, msg): sys.stderr.write("%s: error: %s\n\n" % (self.get_prog_name(), msg)) self.print_help(sys.stderr) sys.exit(2) if __name__ == "__main__": parser = Parser(usage="usage: %prog [options]", version="%prog "+ VERSION, description="Navigate a DB-ALLe database") parser.add_option("--dsn", default=os.environ.get("DBA_DB", "test"), help="DSN, or URL-like database definition, to use for connecting to the DB-All.e database (default: %default, can be set in the environment as DBA_DB)"), parser.add_option("--user", default=os.environ['USER'], help="User name to use to connect to the database (default: %default)") parser.add_option("--pass", default="", dest="password", help="Password to use to connect to the database (default: none)") (opts, args) = parser.parse_args() import dballe import string import re import wx from provami.Model import * #from provami.ModelSingleQuery import Model from provami.MapCanvas import MapCanvas from provami.MapChoice import MapChoice #from provami.MapChoiceSingleQuery import MapChoice #from provami.DateCanvas import DateCanvas from provami.ProvamiArtProvider import ProvamiArtProvider from provami.Navigator import Navigator app = wx.PySimpleApp() db = dballe.DB() if dballe.DB.is_url(opts.dsn): db.connect_from_url(opts.dsn) else: db.connect(opts.dsn, opts.user, opts.password) model = Model(db) for q in args: model.filter.setFromString(q) wx.ArtProvider.PushProvider(ProvamiArtProvider()) navigator = Navigator(None, model, "Provami - DB-ALLe Navigator") navigator.Show() model.update() app.MainLoop() dballe-5.18/provami/Makefile.in0000644000175000017500000005344411754230756013361 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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@ 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 = provami DIST_COMMON = $(dist_bin_SCRIPTS) $(provamipython_PYTHON) \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_flag.m4 \ $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/python.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h 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)" \ "$(DESTDIR)$(provamipythondir)" \ "$(DESTDIR)$(provamipythondir)" "$(DESTDIR)$(man1dir)" \ "$(DESTDIR)$(dballedatadir)" SCRIPTS = $(dist_bin_SCRIPTS) SOURCES = DIST_SOURCES = am__py_compile = PYTHON=$(PYTHON) $(SHELL) $(py_compile) py_compile = $(top_srcdir)/py-compile man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) DATA = $(dballedata_DATA) $(noinst_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FC = @FC@ FCFLAGS = @FCFLAGS@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBDBALLEF_VERSION_INFO = @LIBDBALLEF_VERSION_INFO@ LIBDBALLE_VERSION_INFO = @LIBDBALLE_VERSION_INFO@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LUA_CFLAGS = @LUA_CFLAGS@ LUA_LIBS = @LUA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ 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@ PKG_CONFIG = @PKG_CONFIG@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WIBBLE_CFLAGS = @WIBBLE_CFLAGS@ WIBBLE_LIBS = @WIBBLE_LIBS@ WREPORT_CFLAGS = @WREPORT_CFLAGS@ WREPORT_LIBS = @WREPORT_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ confdir = @confdir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ have_doxygen = @have_doxygen@ have_gperf = @have_gperf@ have_latex2html = @have_latex2html@ have_rst2html = @have_rst2html@ have_swig = @have_swig@ 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@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ tabledir = @tabledir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ dballedatadir = $(datadir)/dballe dballedata_DATA = \ icon-provami.png \ icon-ana-window.png \ icon-attr-window.png \ icon-filters-window.png \ icon-map-move.png \ icon-map-select-area.png \ icon-map-select-ident.png \ icon-map-select-station.png \ icon-map-window.png \ world.dat provamipythondir = $(pythondir)/provami provamiModules = \ provami/__init__.py \ provami/AnaDetails.py \ provami/AttrDetails.py \ provami/DataMenu.py \ provami/DataResults.py \ provami/DateCanvas.py \ provami/DateChoice.py \ provami/DateTimeCanvas.py \ provami/FilterWindow.py \ provami/IdentChoice.py \ provami/LevelsChoice.py \ provami/LimitChoice.py \ provami/MapCanvas.py \ provami/MapChoice.py \ provami/MapChoiceSingleQuery.py \ provami/Model.py \ provami/ModelSingleQuery.py \ provami/Navigator.py \ provami/ProgressDisplay.py \ provami/ProvamiArtProvider.py \ provami/QueryButton.py \ provami/QueryChoice.py \ provami/QueryPanel.py \ provami/QueryTextCtrl.py \ provami/ReportChoice.py \ provami/ResultGrid.py \ provami/TimeRangeChoice.py \ provami/VarNamesChoice.py provamipython_PYTHON = $(provamiModules) nodist_provamipython_PYTHON = provami/Paths.py noinst_DATA = provami/Paths.py dist_bin_SCRIPTS = provami.py man_MANS = provami.1 EXTRA_DIST = dballe-print-stations populate.py provami/Paths.py.in \ $(dballedata_DATA) $(provamiModules) \ provami.1 dballecsv notes regenerate-provami-manpage CLEANFILES = provami/*.pyc provami/Paths.py 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) --foreign provami/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign provami/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-dist_binSCRIPTS: $(dist_bin_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(dist_bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ 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-dist_binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(dist_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) mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-nodist_provamipythonPYTHON: $(nodist_provamipython_PYTHON) @$(NORMAL_INSTALL) test -z "$(provamipythondir)" || $(MKDIR_P) "$(DESTDIR)$(provamipythondir)" @list='$(nodist_provamipython_PYTHON)'; dlist=; list2=; test -n "$(provamipythondir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then b=; else b="$(srcdir)/"; fi; \ if test -f $$b$$p; then \ $(am__strip_dir) \ dlist="$$dlist $$f"; \ list2="$$list2 $$b$$p"; \ else :; fi; \ done; \ for file in $$list2; do echo $$file; done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(provamipythondir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(provamipythondir)" || exit $$?; \ done || exit $$?; \ if test -n "$$dlist"; then \ $(am__py_compile) --destdir "$(DESTDIR)" \ --basedir "$(provamipythondir)" $$dlist; \ else :; fi uninstall-nodist_provamipythonPYTHON: @$(NORMAL_UNINSTALL) @list='$(nodist_provamipython_PYTHON)'; test -n "$(provamipythondir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ dir='$(DESTDIR)$(provamipythondir)'; \ filesc=`echo "$$files" | sed 's|$$|c|'`; \ fileso=`echo "$$files" | sed 's|$$|o|'`; \ st=0; \ for files in "$$files" "$$filesc" "$$fileso"; do \ $(am__uninstall_files_from_dir) || st=$$?; \ done; \ exit $$st install-provamipythonPYTHON: $(provamipython_PYTHON) @$(NORMAL_INSTALL) test -z "$(provamipythondir)" || $(MKDIR_P) "$(DESTDIR)$(provamipythondir)" @list='$(provamipython_PYTHON)'; dlist=; list2=; test -n "$(provamipythondir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then b=; else b="$(srcdir)/"; fi; \ if test -f $$b$$p; then \ $(am__strip_dir) \ dlist="$$dlist $$f"; \ list2="$$list2 $$b$$p"; \ else :; fi; \ done; \ for file in $$list2; do echo $$file; done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(provamipythondir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(provamipythondir)" || exit $$?; \ done || exit $$?; \ if test -n "$$dlist"; then \ $(am__py_compile) --destdir "$(DESTDIR)" \ --basedir "$(provamipythondir)" $$dlist; \ else :; fi uninstall-provamipythonPYTHON: @$(NORMAL_UNINSTALL) @list='$(provamipython_PYTHON)'; test -n "$(provamipythondir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ dir='$(DESTDIR)$(provamipythondir)'; \ filesc=`echo "$$files" | sed 's|$$|c|'`; \ fileso=`echo "$$files" | sed 's|$$|o|'`; \ st=0; \ for files in "$$files" "$$filesc" "$$fileso"; do \ $(am__uninstall_files_from_dir) || st=$$?; \ done; \ exit $$st install-man1: $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" @list=''; test -n "$(man1dir)" || exit 0; \ { 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'; \ } | 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=''; 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-dballedataDATA: $(dballedata_DATA) @$(NORMAL_INSTALL) test -z "$(dballedatadir)" || $(MKDIR_P) "$(DESTDIR)$(dballedatadir)" @list='$(dballedata_DATA)'; test -n "$(dballedatadir)" || list=; \ 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)$(dballedatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(dballedatadir)" || exit $$?; \ done uninstall-dballedataDATA: @$(NORMAL_UNINSTALL) @list='$(dballedata_DATA)'; test -n "$(dballedatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(dballedatadir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @list='$(MANS)'; if test -n "$$list"; then \ list=`for p in $$list; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ if test -n "$$list" && \ grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ echo " typically \`make maintainer-clean' will remove them" >&2; \ exit 1; \ else :; fi; \ else :; fi @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) $(MANS) $(DATA) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(provamipythondir)" "$(DESTDIR)$(provamipythondir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(dballedatadir)"; 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: -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." clean: clean-am clean-am: clean-generic clean-libtool 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-dballedataDATA install-man \ install-nodist_provamipythonPYTHON install-provamipythonPYTHON install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-dist_binSCRIPTS @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-exec-hook install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 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 mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-dballedataDATA uninstall-dist_binSCRIPTS \ uninstall-man uninstall-nodist_provamipythonPYTHON \ uninstall-provamipythonPYTHON @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook uninstall-man: uninstall-man1 .MAKE: install-am install-exec-am install-strip uninstall-am .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dballedataDATA \ install-dist_binSCRIPTS install-dvi install-dvi-am \ install-exec install-exec-am install-exec-hook install-html \ install-html-am install-info install-info-am install-man \ install-man1 install-nodist_provamipythonPYTHON install-pdf \ install-pdf-am install-provamipythonPYTHON install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am uninstall uninstall-am uninstall-dballedataDATA \ uninstall-dist_binSCRIPTS uninstall-hook uninstall-man \ uninstall-man1 uninstall-nodist_provamipythonPYTHON \ uninstall-provamipythonPYTHON # mkdir is there for VPATH builds, as the provami directory at this point only # exists in $(srcdir) provami/Paths.py: $(srcdir)/provami/Paths.py.in mkdir -p provami sed -e 's|@DATADIR@|$(dballedatadir)|g' $< > $@ install-exec-hook: mv $(DESTDIR)$(bindir)/provami.py $(DESTDIR)$(bindir)/provami uninstall-hook: rm -f $(DESTDIR)$(bindir)/provami # 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: dballe-5.18/provami/icon-map-select-area.png0000644000175000017500000000050011173330007015652 00000000000000PNG  IHDRVΎW pHYs+tIMEIDAT8˝k0?O=85#%Uf C#D?' /DC@d5&dɰ~w{i6 &o#Rj@`L8qG?>l-cT Ӗ0"ڪ"в9g ߶ [^so!Z-c ykg5N!ZNjDrSS9߷ۻ,݃IENDB`dballe-5.18/provami/notes0000644000175000017500000000036011173330007012335 00000000000000PyGTK + Mathplotlib: http://www.serpia.org/pygtk Coastlines and other lines: http://oas.ngdc.noaa.gov/mgg/plsql/extract.search_screen?p_lat_min=0.0&p_lat_max=75.5&p_lon_min=-28.0&p_lon_max=72.0 Test DSN with lots of data: --dsn="big" dballe-5.18/provami/icon-map-move.png0000644000175000017500000000032111173330007014434 00000000000000PNG  IHDRa pHYs  tIME$ tEXtCommentCreated with The GIMPd%nGIDAT8c`18#2 6TDf dhF &Z9A1&2)DqR Y:2IENDB`dballe-5.18/provami/provami/0000755000175000017500000000000011754670142013034 500000000000000dballe-5.18/provami/provami/Model.py0000644000175000017500000007143411741056677014406 00000000000000import dballe, dballe.dbacsv import time import datetime import gc import os import sys import traceback from provami.Paths import DATADIR try: import dballe.rconvert, rpy HAS_RPY = True except ImportError: HAS_RPY = False try: import dballe.volnd HAS_VOLND = True except ImportError: HAS_VOLND = False def filePath(fileName): if os.access(fileName, os.R_OK): return fileName elif os.access(DATADIR + "/" + fileName, os.R_OK): return DATADIR + "/" + fileName else: print sys.stderr, "WARNING: file", fileName, "cannot be found either in the current directory or in", DATADIR return None class DateUtils: fields = ( ("year", "month", "day", "hour", "min", "sec"), ("yearmin", "monthmin", "daymin", "hourmin", "minumin", "secmin"), ("yearmax", "monthmax", "daymax", "hourmax", "minumax", "secmax"), ) EXACT = 0 MIN = 1 MAX = 2 def completeDate(fields, how = DateUtils.EXACT): """ Fill in the blanks from a partial date information. Round towards the past is how is EXACT or MIN; round towards the future if how is MAX. """ year, month, day, hour, minute, second = tuple(fields) if year is None: return None if how == DateUtils.MIN or how == DateUtils.EXACT: return datetime.datetime(year, \ month or 1, day or 1, hour or 0, minute or 0, second or 0) else: if hour is None: hour = 23 if minute is None: minute = 59 if second is None: second = 59 time = datetime.time(hour, minute, second) month = month or 12 if day is None: # To get the day as the last day of the month, # get the date as "the day before the first day of the next" if month == 12: month = 1 year = year + 1 else: month = month + 1 date = datetime.date(year, month, 1) - datetime.timedelta(1) else: date = datetime.date(year, month, day) return datetime.datetime.combine(date, time) def datetimeFromRecord(rec, fieldset = DateUtils.MIN): fn = DateUtils.fields[fieldset] return completeDate([rec.get(fn[x], None) for x in range(6)], fieldset) class TTracer: def __init__(self, name): self.start = time.clock() self.name = name print " TT", self.name, ": start" def __del__(self): print " TT", self.name, ": ", time.clock() - self.start def partial(self, str): print " TT", self.name, "[", str, "]: ", time.clock() - self.start class ModelListener: def filterDirty(self, isDirty): pass def filterChanged(self, what): pass def invalidate(self): pass def hasData(self, what): pass class ProgressListener: def progress(self, perc, text): pass def queryError(self, message): pass class UpdateInterrupted: pass class Model: HAS_RPY = HAS_RPY HAS_VOLND = HAS_VOLND def __init__(self, db): # Init DB-ALLe and connect to the database self.db = db self.truncateResults = True self.lowerTruncateThreshold = 250 self.resultsMax = 500 self.resultsCount = 0 self.resultsTruncated = False self.cached_results = [] self.cached_stations = [] self.cached_idents = [] self.cached_dtimes = [] self.cached_levels = [] self.cached_tranges = [] self.cached_vartypes = [] self.cached_repinfo = [] self.filter = dballe.Record() self.filterDirty = False self.activeFilter = self.filter.copy() self.updateListeners = [] self.progressListeners = [] self.updating = False self.updateCanceled = False #self.update() # Set the filter as dirty and notify listeners of the change def filterChanged(self, what=None): # If we are changing anything except the limits, reset the # limits if what is not None and what != 'limit': self.resetResultLimit() # See if the filter has been changed dirty = not self.activeFilter.equals(self.filter) if self.filterDirty != dirty: for l in self.updateListeners: l.filterDirty(dirty) self.filterDirty = dirty if what is not None: for l in self.updateListeners: l.filterChanged(what) def hasStation(self, s_id): "Return true if the given station is among the current result set" for id, lat, lon, ident in self.cached_stations: if id == s_id: return True return False def stations(self): "Generate all the station data" tracer = TTracer("model.stations (%d stations)" % (len(self.cached_stations))) for result in self.cached_stations: yield result def stationByID(self, station_id): "Return the data for one station, given its ID" for id, lat, lon, ident in self.cached_stations: if id == station_id: return id, lat, lon, ident # Not found in cache, query through elencamele so we can give basic # details of stations not in the result set, or stations with no data filter = dballe.Record() filter["ana_id"] = station_id for result in self.db.query_stations(filter): return result["ana_id"], result["lat"], result["lon"], result.get("ident", None) return None, None, None, None def recordByContextAndVar(self, context, var): "Return a result record by context ID and variable type" for r in self.cached_results: if r["context_id"] == context and r["var"] == var: return r return None def idents(self): "Generate a list of idents" tracer = TTracer("model.idents") for result in self.cached_idents: yield result def hasVariable(self, context, var): "Returns true if the given context,var is in the current result set" for result in self.cached_results: if context == result["context_id"] and var == result["var"]: return True return False # Generate the list of all data def data(self): tracer = TTracer("model.data") for result in self.cached_results: yield result # Generate the list of all available datetimes def datetimes(self): tracer = TTracer("model.datetimes") for results in self.cached_dtimes: yield results # Return a 2-tuple with the minimum and maximum datetime values def daterange(self): if len(self.cached_dtimes) == 0: return (None, None) return (self.cached_dtimes[0], self.cached_dtimes[-1]) # Generate the list of all available levels def levels(self): tracer = TTracer("model.levels") for val in self.cached_levels: yield val # Generate the list of all available time ranges def timeranges(self): tracer = TTracer("model.timeranges") for val in self.cached_tranges: yield val # Generate the list of all available variable types def variableTypes(self): tracer = TTracer("model.variableTypes") for val in self.cached_vartypes: yield val # Generate the list of all available reports def reports(self): tracer = TTracer("model.reports") for results in self.cached_repinfo: yield results # Generate the list of all attributes available for the current context # and varcode def attributes(self): tracer = TTracer("model.attributes") result = dballe.Record() self.db.query_attrs(self.currentContext, self.currentVarcode, [], result) for var in result: yield var def registerUpdateListener(self, func): self.updateListeners.append(func) def registerProgressListener(self, func): self.progressListeners.append(func) def checkForCancelation(self): if self.updateCanceled: for l in self.progressListeners: l.progress(100, "Canceling update...") raise UpdateInterrupted() def notifyProgress(self, perc, text): self.checkForCancelation() for l in self.progressListeners: l.progress(perc, text) self.checkForCancelation() def cancelUpdate(self): self.updateCanceled = True def queryStations(self): filter = self.filter.copy() filter["query"] = "nosort" for i in ("latmin", "latmax", "lonmin", "lonmax", "ana_id", "ident", "mobile"): del filter[i] return self.db.query_station_summary(filter) def queryDateTimes(self): filter = self.filter.copy() filter["query"] = "nosort" for i in ("yearmin", "monthmin", "daymin", "hourmin", "minumin", "secmin", "yearmax", "monthmax", "daymax", "hourmax", "minumax", "secmax", "year", "month", "day", "hour", "min", "sec"): del filter[i] return self.db.query_datetimes(filter) def queryVariableTypes(self): filter = self.filter.copy() filter["query"] = "nosort" del filter["var"] return self.db.query_variable_types(filter) def queryReportTypes(self): filter = self.filter.copy() filter["query"] = "nosort" del filter["rep_cod"] del filter["rep_memo"] return self.db.query_reports(filter) def queryLevels(self): filter = self.filter.copy() filter["query"] = "nosort" del filter["level"] return self.db.query_levels(filter) def queryTimeRanges(self): filter = self.filter.copy() filter["query"] = "nosort" del filter["trange"] return self.db.query_tranges(filter) def writeRecord(self, record): self.db.insert(record, True, False) #context = record.pop("context_id") #ana = record.pop("ana_id") def updateAttribute(self, context, varcode, var): attrs = dballe.Record() self.db.query_attrs(context, varcode, [], attrs) attrs.set(var) self.db.attr_insert(context, varcode, attrs) def deleteValues(self, values): for context, var in values: print "Removing", context, var filter = dballe.Record() filter["context_id"] = context filter["var"] = var self.db.remove(filter) self.update() def deleteAllAttrs(self, context, varcode): self.db.attr_remove(context, varcode, []) self.update() def deleteAttrs(self, context, varcode, attrs): self.db.attr_remove(context, varcode, attrs) self.update() def deleteCurrent(self): filter = self.activeFilter.copy() del filter["limit"] self.db.remove(filter) self.update() def deleteOrphans(self): self.db.removeOrphans() self.update() def exportToFile(self, file, encoding): filter = self.activeFilter.copy() del filter["limit"] if encoding == "CSV": exporter = dballe.dbacsv.export(self.db, filter, open(file, "w")) elif encoding == "R" and HAS_VOLND and HAS_RPY: idx = (dballe.volnd.AnaIndex(), \ dballe.volnd.DateTimeIndex(), \ dballe.volnd.LevelIndex(), \ dballe.volnd.TimeRangeIndex(), \ dballe.volnd.NetworkIndex()) vars = dballe.volnd.read(self.db.query_data(filter), idx) dballe.rconvert.volnd_save_to_r(vars, file) #elif encoding == "VOLND": # import dballe.volnd, cPickle # idx = (dballe.volnd.AnaIndex(), \ # dballe.volnd.DateTimeIndex(), \ # dballe.volnd.LevelIndex(), \ # dballe.volnd.TimeRangeIndex(), \ # dballe.volnd.NetworkIndex()) # vars = dballe.volnd.read(self.db.query_data(filter), idx) # cPickle.dump(vars, open(file, "w")) elif encoding == "gBUFR": self.db.export_results_as_generic(filter, "BUFR", file) else: self.db.export_results(filter, encoding, file) def update(self): try: if self.updating: print "ALREADY UPDATING" return self.updating = True self.updateCanceled = False print >>sys.stderr, self.filter self.notifyProgress(0, "Beginning update.") #for i in 'latmin', 'latmax', 'lonmin', 'lonmax', 'ana_id': #print "%s: %s" % (i, self.filter.enqc(i)) # Notify invalidation of the data in the model self.notifyProgress(1, "Invalidating components...") for l in self.updateListeners: l.invalidate() # Save old data so we can restore it in case the query # is aborted or fails self.oldData = {} self.oldData['cached_stations'] = [x for x in self.cached_stations] self.oldData['cached_idents'] = [x for x in self.cached_idents] self.oldData['cached_dtimes'] = [x for x in self.cached_dtimes] self.oldData['resultsCount'] = self.resultsCount self.oldData['resultsTruncated'] = self.resultsTruncated self.oldData['cached_results'] = [x for x in self.cached_results] self.oldData['cached_levels'] = [x for x in self.cached_levels] self.oldData['cached_tranges'] = [x for x in self.cached_tranges] self.oldData['cached_vartypes'] = [x for x in self.cached_vartypes] self.oldData['cached_repinfo'] = [x for x in self.cached_repinfo] self.oldData['active_filter'] = self.activeFilter.copy() self.cached_stations = [] self.cached_idents = [] self.cached_dtimes = [] self.resultsCount = 0 self.resultsTruncated = False self.cached_results = [] self.cached_levels = [] self.cached_tranges = [] self.cached_vartypes = [] self.cached_repinfo = [] # Take a note of the filter that is effectively active self.activeFilter = self.filter.copy() # This is a good moment to call the garbage collector, # since we're throwing away lots of data and # regenerating it gc.collect() t = TTracer("model.update") # Query station data self.notifyProgress(2, "Querying station data...") idents = {} for result in self.queryStations(): self.cached_stations.append(( result["ana_id"], result["lat"], result["lon"], result.get("ident", None))) idents[result.get("ident", None)] = 1 self.cached_idents = idents.keys() self.cached_idents.sort() t.partial("got station (%d items) and ident (%d items) data" % (len(self.cached_stations), len(self.cached_idents))) self.notifyProgress(15, "Notifying station data...") for l in self.updateListeners: l.hasData("stations") t.partial("notified station data") for l in self.updateListeners: l.hasData("idents") t.partial("notified ident data") # Query datetimes self.notifyProgress(18, "Querying date and time data...") for result in self.queryDateTimes(): self.cached_dtimes.append(result["date"]) self.cached_dtimes.sort() t.partial("got date and time data (%d items)" % (len(self.cached_dtimes))) self.notifyProgress(30, "Notifying date and time data...") for l in self.updateListeners: l.hasData("dtimes") t.partial("notified date and time data") # Query variable data self.notifyProgress(35, "Querying result data...") if self.truncateResults: # We ask for 1 more than the upper bound, to detect the # case where the result set has been truncated self.filter["limit"] = self.resultsMax + 1 else: del self.filter["limit"] self.filter["query"] = "nosort" for result in self.db.query_data(self.filter): self.cached_results.append(result.copy()) self.resultsCount = self.resultsCount + 1 # Bound to the real upper bound. if self.truncateResults and self.resultsCount > self.resultsMax: self.resultsCount = self.resultsCount - 1 self.resultsTruncated = True break t.partial("got variable data (%d items)" % (len(self.cached_results))); self.notifyProgress(52, "Notifying result data...") for l in self.updateListeners: l.hasData("data") t.partial("notified variable data"); del self.filter["limit"] # Query levels self.notifyProgress(55, "Querying level data...") levels = {} for results in self.queryLevels(): levels[results["level"]] = 1 self.cached_levels = levels.keys() self.cached_levels.sort() t.partial("got level data (%d items)" % (len(self.cached_levels))); self.notifyProgress(60, "Notifying level data...") for l in self.updateListeners: l.hasData("levels") t.partial("notified level data"); # Query time ranges self.notifyProgress(62, "Querying time range data...") tranges = {} for results in self.queryTimeRanges(): tranges[results["trange"]] = 1 self.cached_tranges = tranges.keys() self.cached_tranges.sort() t.partial("got time range data (%d items)" % (len(self.cached_tranges))); self.notifyProgress(68, "Notifying time range data...") for l in self.updateListeners: l.hasData("tranges") t.partial("notified time range data"); # Query variable types self.notifyProgress(70, "Querying variable types...") for results in self.queryVariableTypes(): self.cached_vartypes.append(results["var"]) t.partial("got variable type data (%d items)" % (len(self.cached_vartypes))); self.notifyProgress(82, "Notifying variable types...") for l in self.updateListeners: l.hasData("vartypes") t.partial("notified variable type data"); # Query available reports self.notifyProgress(85, "Querying report types...") for results in self.queryReportTypes(): self.cached_repinfo.append((results["rep_cod"], results["rep_memo"])) t.partial("got repinfo data (%d items)" % (len(self.cached_repinfo))); self.notifyProgress(95, "Notifying report types...") for l in self.updateListeners: l.hasData("repinfo") t.partial("notified repinfo data"); del self.filter["query"] # Notify that all data in the model are up to date self.notifyProgress(98, "Notifying completion...") for l in self.updateListeners: l.hasData("all") self.notifyProgress(100, "Completed.") # Notify the change in filter dirtyness, without any # specific changes in the filter itself self.filterChanged() except UpdateInterrupted: print "INTERRUPTED" self.tidyUpAfterInterruptedQuery() except RuntimeError, e: print "QUERY FAILED", str(e) traceback.print_tb(sys.exc_traceback) self.tidyUpAfterInterruptedQuery() for l in self.progressListeners: l.queryError(str(e)) # This is another good moment to call the garbage collector, to get rid # of the database handles and temporary data that could still be around gc.collect() self.oldData = {} self.updating = False def tidyUpAfterInterruptedQuery(self): # Restore the old data self.activeFilter = self.oldData['active_filter'] for l in self.updateListeners: l.invalidate() self.cached_stations = self.oldData['cached_stations'] self.cached_idents = self.oldData['cached_idents'] for l in self.updateListeners: l.hasData("stations") for l in self.updateListeners: l.hasData("idents") self.cached_dtimes = self.oldData['cached_dtimes'] for l in self.updateListeners: l.hasData("dtimes") self.resultsCount = self.oldData['resultsCount'] self.resultsTruncated = self.oldData['resultsTruncated'] self.cached_results = self.oldData['cached_results'] for l in self.updateListeners: l.hasData("data") self.cached_levels = self.oldData['cached_levels'] for l in self.updateListeners: l.hasData("levels") self.cached_tranges = self.oldData['cached_tranges'] for l in self.updateListeners: l.hasData("tranges") self.cached_vartypes = self.oldData['cached_vartypes'] for l in self.updateListeners: l.hasData("vartypes") self.cached_repinfo = self.oldData['cached_repinfo'] for l in self.updateListeners: l.hasData("repinfo") for l in self.updateListeners: l.hasData("all") self.notifyProgress(100, "Completed.") def setiFilter(self, name, value): """ If the value has changed, set the value and call DirtyFilter. Returns True if the value has been changed, else False """ if value is not None: value = int(value) if value != self.filter.get(name, None): if value is None: del self.filter[name] else: self.filter[name] = value return True return False def setdFilter(self, name, value): """ If the value has changed, set the value and call DirtyFilter. Returns True if the value has been changed, else False """ value = float(value) if value else None if value != self.filter.get(name, None): if value is None: del self.filter[name] else: self.filter[name] = value return True return False def setcFilter(self, name, value): """ If the value has changed, set the value and call DirtyFilter. Returns True if the value has been changed, else False """ value = str(value) if value else None if value != self.filter.get(name, None): if value is None: del self.filter[name] else: self.filter[name] = value return True return False def setReportFilter(self, rep_cod): """ Set the filter to match a given report code Returns True if the filter has been changed, else False """ r1 = self.setiFilter("rep_cod", rep_cod); if r1: self.filterChanged("repinfo") return True return False def setVarFilter(self, var): """ Set the filter to match a given variable type Returns True if the filter has been changed, else False """ r1 = self.setcFilter("var", var) if r1: self.filterChanged("var") return True return False def setAnaFilter(self, filter): """ Set the ana filter expression Returns True if the filter has been changed, else False """ #print "ANAFilter:", filter r1 = self.setcFilter("ana_filter", filter) if r1: self.filterChanged("ana_filter") return True return False def setDataFilter(self, filter): """ Set the data filter expression Returns True if the filter has been changed, else False """ #print "DATAFilter:", filter r1 = self.setcFilter("data_filter", filter) if r1: self.filterChanged("data_filter") return True return False def setAttrFilter(self, filter): """ Set the attribute filter expression Returns True if the filter has been changed, else False """ r1 = self.setcFilter("attr_filter", filter) if r1: self.filterChanged("attr_filter") return True return False def setStationFilter(self, id): """ Set the filter to match a single station. Returns True if the filter has been changed, else False """ r1 = self.setdFilter("latmin", None) r2 = self.setdFilter("latmax", None) r3 = self.setdFilter("lonmin", None) r4 = self.setdFilter("lonmax", None) r5 = self.setdFilter("mobile", None) r6 = self.setcFilter("ident", None) r7 = self.setiFilter("ana_id", id) if r1 or r2 or r3 or r4 or r5 or r6 or r7: self.filterChanged("stations") return True return False def setAreaFilter(self, latmin, latmax, lonmin, lonmax): """ Set the filter to all stations in a given area. Returns True if the filter has been changed, else False """ r1 = self.setdFilter("latmin", latmin) r2 = self.setdFilter("latmax", latmax) r3 = self.setdFilter("lonmin", lonmin) r4 = self.setdFilter("lonmax", lonmax) r5 = self.setiFilter("ana_id", None) if r1 or r2 or r3 or r4 or r5: self.filterChanged("stations") return True return False def setIdentFilter(self, mobile, ident): """ Set the filter to match a given station ident. Returns True if the filter has been changed, else False """ r1 = self.setiFilter("mobile", mobile) r2 = self.setcFilter("ident", ident) r3 = self.setiFilter("ana_id", None) if r1 or r2 or r3: self.filterChanged("stations") return True return False def getLevelFilter(self, record=None): return (record or self.filter).get("level", None) def setLevelFilter(self, level): """ Set the filter to match a given level. Returns True if the filter has been changed, else False """ if level != self.filter.get("level", None): self.filter["level"] = level self.filterChanged("level") return True return False def getTimeRangeFilter(self, record=None): return (record or self.filter).get("trange", None) def setTimeRangeFilter(self, tr): """ Set the filter to match a given time range. Returns True if the filter has been changed, else False """ if tr != self.filter.get("trange", None): self.filter["trange"] = tr self.filterChanged("trange") return True return False def getDateTimeFilter(self, filter=DateUtils.EXACT): return (self.filter.get(i, None) for i in DateUtils.fields[filter]) def setDateTimeFilter(self, year, month=None, day=None, hour=None, min=None, sec=None, filter=DateUtils.EXACT): """ Set the filter to match a given minimum, maximum or exact date. Returns True if the filter has been changed, else False """ fn = DateUtils.fields[filter] r1 = self.setiFilter(fn[0], year) r2 = self.setiFilter(fn[1], month) r3 = self.setiFilter(fn[2], day) r4 = self.setiFilter(fn[3], hour) r5 = self.setiFilter(fn[4], min) r6 = self.setiFilter(fn[5], sec) if r1 or r2 or r3 or r4 or r5 or r6: self.filterChanged("datetime") return True return False def resetResultLimit(self): """ Reset the result limit to its original value. Returns True if the filter has been changed, else False. """ return self.setResultLimit(500) #if not self.truncateResults or self.resultsMax != 500: # self.truncateResults = True # self.resultsMax = 500 # changed = True # self.filterChanged("limit") # return True #return False def setResultLimit(self, limit): """ Set the result limit. Returns True if the filter has been changed, else False """ changed = False if limit is None and self.truncateResults: self.truncateResults = False; changed = True else: if not self.truncateResults: self.truncateResults = True changed = True if self.resultsMax != limit: self.resultsMax = limit changed = True if changed: self.filterChanged("limit") return True return False dballe-5.18/provami/provami/MapChoiceSingleQuery.py0000644000175000017500000001365311450143155017346 00000000000000import Numeric import string import wx from wx.lib.floatcanvas import FloatCanvas, Resources class MapChoice(wx.Panel): def __init__(self, parent, model): wx.Panel.__init__(self, parent) self.points = [] self.userScale = 1.0 self.mouseDown = False # 0: move # 1: select self.mode = 0 self.model = model self.model.registerUpdateListener(self.update) self.canvas = FloatCanvas.FloatCanvas(self, Debug = 0) self.canvas.SetProjectionFun("FlatEarth") self.canvas.SetMode("Mouse") FloatCanvas.EVT_LEFT_DOWN(self.canvas, self.onMouseDown) FloatCanvas.EVT_LEFT_UP(self.canvas, self.onMouseUp) FloatCanvas.EVT_MOTION(self.canvas, self.onMove) #self.canvas.Enable() # Draw shore lines Shorelines = self.readMap() for segment in Shorelines: self.canvas.AddLine(segment) #bb = self.canvas.CalcBoundingBox() buttonPanel = wx.Panel(self) bpbox = wx.BoxSizer(wx.HORIZONTAL) self.smallButton = wx.Button(buttonPanel, -1, "Enlarge") self.Bind(wx.EVT_BUTTON, self.onSizeButton, self.smallButton) bpbox.Add(self.smallButton) self.largeButton = wx.Button(buttonPanel, -1, "Reduce") self.Bind(wx.EVT_BUTTON, self.onSizeButton, self.largeButton) bpbox.Add(self.largeButton) self.selectButton = wx.ToggleButton(buttonPanel, -1, "Select") self.Bind(wx.EVT_TOGGLEBUTTON, self.onToggleSelect, self.selectButton) bpbox.Add(self.selectButton) self.resetButton = wx.Button(buttonPanel, -1, "Reset filter") self.Bind(wx.EVT_BUTTON, self.onResetButton, self.resetButton) bpbox.Add(self.resetButton) buttonPanel.SetSizer(bpbox) box = wx.BoxSizer(wx.VERTICAL) box.Add(self.canvas, 1, wx.EXPAND) box.Add(buttonPanel) self.SetSizerAndFit(box) self.update() def update(self): self.userScale = 1.0 self.largeButton.Enable() self.smallButton.Enable() if self.model.filter["latmin"] is None and self.model.filter["lonmin"] is None and \ self.model.filter["latmax"] is None and self.model.filter["lonmax"] is None: self.resetButton.Disable() else: self.resetButton.Enable() # Delete old set of stations self.canvas.RemoveObjects(self.points) # Draw new set of stations self.latmin = 1000.0 self.lonmin = 1000.0 self.latmax = -1000.0 self.lonmax = -1000.0 self.points = [] for s in self.model.stations(): lat = s["lat"] if lat < self.latmin: self.latmin = lat if lat > self.latmax: self.latmax = lat lon = s["lon"] if lon < self.lonmin: self.lonmin = lon if lon > self.lonmax: self.lonmax = lon p = FloatCanvas.Point((lon, lat), Color = "RED", Diameter = 3) self.points.append(p) self.canvas.AddObject(p) #self.canvas.AddPoint((s["lon"], s["lat"]), Color = "RED", Diameter = 3) if self.lonmax - self.lonmin < 12: self.lonmax = self.lonmax + 6 self.lonmin = self.lonmin - 6 if self.latmax - self.latmin < 6: self.latmax = self.latmax + 3 self.latmin = self.latmin - 3 self.center = ((self.lonmax + self.lonmin) / 2, (self.latmax + self.latmin) / 2) self.rescale() def rescale(self): scale = min(360/(self.lonmax - self.lonmin), 180/(self.latmax - self.latmin)) print "Scale: %f %f" % (scale, scale * self.userScale) self.canvas.Scale = scale * self.userScale self.canvas.Zoom(1, self.center) def onToggleSelect(self, event): if self.selectButton.GetValue(): self.mode = 1 else: self.mode = 0 def onSizeButton(self, event): button = event.GetEventObject() oldUserScale = self.userScale if button == self.smallButton: self.largeButton.Enable() self.userScale = self.userScale * 1.5 elif button == self.largeButton: self.smallButton.Enable() self.userScale = self.userScale / 1.5 if oldUserScale != self.userScale: self.rescale() def onResetButton(self, event): self.model.setAreaFilter(None, None, None, None) def onMouseDown(self, event): self.mouseDown = True self.mouseDownCoords = tuple(event.GetCoords()) self.mouseDownCenter = self.center if self.mode == 1: self.dragRectangle = self.canvas.AddRectangle(self.mouseDownCoords, (1, 1), LineWidth=1) self.canvas.Draw() print "MD" def onMouseUp(self, event): self.mouseDown = False if self.mode == 1: self.canvas.RemoveObject(self.dragRectangle) self.canvas.Draw() self.mode = 0 self.selectButton.SetValue(False) latmin = min(event.GetCoords()[1], self.mouseDownCoords[1]) latmax = max(event.GetCoords()[1], self.mouseDownCoords[1]) lonmin = min(event.GetCoords()[0], self.mouseDownCoords[0]) lonmax = max(event.GetCoords()[0], self.mouseDownCoords[0]) print "Coords: lat %f-%f lon %f-%f" % (latmin, latmax, lonmin, lonmax) self.model.setAreaFilter(latmin, latmax, lonmin, lonmax) print "MU" def onMove(self, event): if self.mouseDown: print "MDrag" coords = tuple(event.GetCoords()) stride = (coords[0] - self.mouseDownCoords[0], coords[1] - self.mouseDownCoords[1]) if self.mode == 0: self.center = (self.mouseDownCenter[0] - stride[0]/2, self.mouseDownCenter[1] - stride[1]/2) self.rescale() else: self.canvas.RemoveObject(self.dragRectangle) print "RECT ", self.mouseDownCoords, " ", stride self.dragRectangle = self.canvas.AddRectangle(self.mouseDownCoords, stride, LineWidth=1) self.canvas.Draw() #print event.GetCoords() #print "%.2f, %.2f" % tuple(event.GetCoords()) def readMap(self): """ This function reads a MapGen Format file, and returns a list of NumPy arrays with the line segments in them. Each NumPy array in the list is an NX2 array of Python Floats. The demo should have come with a file, "world.dat" that is the shorelines of the whole world, in MapGen format. """ file = open('world.dat', 'rt') Shorelines = [] segment = [] for line in map(string.strip, file.readlines()): if line: if line == "# -b": #New segment beginning if segment: Shorelines.append(Numeric.array(segment)) segment = [] else: segment.append(map(float,string.split(line))) if segment: Shorelines.append(Numeric.array(segment)) return Shorelines dballe-5.18/provami/provami/VarNamesChoice.py0000644000175000017500000000123011450142565016145 00000000000000import dballe import wx from provami.QueryChoice import QueryChoice class VarNamesChoice(QueryChoice): def __init__(self, parent, model): QueryChoice.__init__(self, parent, model, "var", "vartypes") self.hasData("vartypes") def readFilterFromRecord(self, record): return record.get("var", None) def readOptions(self): res = [] res.append(("All variables", None)) for v in self.model.variableTypes(): info = dballe.varinfo(v) res.append(("%s: %s (%s)" % (v, info.desc.lower(), info.unit), v)) return res def selected(self, event): if self.updating: return sel = self.GetSelection() self.model.setVarFilter(self.GetClientData(sel)) dballe-5.18/provami/provami/ModelSingleQuery.py0000644000175000017500000001207211450143624016551 00000000000000import Dballe class Model: def __init__(self, dsn, user, password): # Init DB-ALLe and connect to the database self.lib = Dballe.LibInit() self.db = Dballe.DB(dsn, user, password) self.truncateResults = True self.lowerTruncateThreshold = 250 self.resultsMax = 500 self.resultsCount = 0 self.resultsTruncated = False self.filter = Dballe.Record() self.updateListeners = [] self.update() def registerUpdateListener(self, func): self.updateListeners.append(func) def update(self): self.results = [] self.cache_stations = {} self.cache_levels = {} self.cache_tranges = {} self.cache_vtypes = {} self.cache_idents = {} self.cache_reports = {} self.filter.setc("query", "nosort,stream") dcur = self.db.query(self.filter) count = 0 for record in dcur: self.results.append(record.copy()) self.cache_stations[record["ana_id"]] = [ \ record["lat"], \ record["lon"], \ record["ident"] ] self.cache_levels[",".join(map(lambda x: record.enqc(x), ["leveltype1", "l1", "leveltype2", "l2"]))] = 1 self.cache_tranges[",".join(map(lambda x: record.enqc(x), ["pindicator", "p1", "p2"]))] = 1 self.cache_vtypes[dcur.varcode()] = 1 self.cache_idents[record["ident"]] = 1 self.cache_reports[record["rep_cod"]] = record["rep_memo"] count = count + 1 if count % 10000 == 0: print count for l in self.updateListeners: l() # Fill up the ana list with all the ana stations def stations(self): for (k, v) in self.cache_stations.items(): yield k, tuple(v) # Fill up the data list with all the data from the given ana def data(self): self.resultsCount = 0 self.resultsTruncated = False for result in self.results: yield result self.resultsCount = self.resultsCount + 1 # Bound to the real upper bound. if self.truncateResults and self.resultsCount > self.resultsMax: self.resultsCount = self.resultsCount - 1 self.resultsTruncated = True break def attributes(self): result = Dballe.Record() self.db.attrQuery(self.currentContext, self.currentVarcode, result) for var in result: yield var def levels(self): for results in self.cache_levels.keys(): yield results.split(',') def timeranges(self): for results in self.cache_tranges.keys(): yield results.split(',') def variableTypes(self): for res in self.cache_vtypes.keys(): yield res def idents(self): for res in self.cache_idents.keys(): yield res def reports(self): for results in self.cache_reports.items(): yield results def setiFilter(self, name, value): # If the value has changed, perform the update if value != self.filter.enqi(name): self.filter.seti(name, value) self.update() def setdFilter(self, name, value): # If the value has changed, perform the update if value != self.filter.enqd(name): self.filter.setd(name, value) self.update() def setcFilter(self, name, value): # If the value has changed, perform the update if value != self.filter.enqc(name): self.filter.setc(name, value) self.update() def setAreaFilter(self, latmin, latmax, lonmin, lonmax): updated = False if latmin != self.filter.get("latmin", None): self.filter["latmin"] = latmin updated = True if latmin != self.filter.get("latmax", None): self.filter["latmax"] = latmax updated = True if latmin != self.filter.get("lonmin", None): self.filter["lonmin"] = lonmin updated = True if latmin != self.filter.get("lonmax", None): self.filter["lonmax"] = lonmax updated = True if updated: self.update() def setLevelFilter(self, ltype1, l1, ltype2, l2): # If the value has changed, perform the update updated = False if ltype1 != self.filter.get("leveltype1", None): self.filter["leveltype1"] = ltype1 updated = True if l1 != self.filter.get("l1", None): self.filter["l1"] = l1 updated = True if ltype2 != self.filter.get("leveltype2", None): self.filter["leveltype2"] = ltype2 updated = True if l2 != self.filter.get("l2", None): self.filter["l2"] = l2 updated = True if updated: self.update() def setTimeRangeFilter(self, pind, p1, p2): # If the value has changed, perform the update updated = False if pind != self.filter.get("pindicator", None): self.filter["pindicator"] = pind updated = True if p1 != self.filter.get("p1", None): self.filter["p1"] = p1 updated = True if p2 != self.filter.get("p2", None): self.filter["p2"] = p2 updated = True if updated: self.update() def setIdentFilter(self, mobile, ident): updated = False if mobile != self.filter.get("mobile", None): self.filter["mobile"] = mobile updated = True if ident != self.filter.get("ident", None): self.filter["ident"] = ident updated = True if updated: self.update() def setResultLimit(self, limit): updated = False if limit is None and self.truncateResults: self.truncateResults = False; updated = True; else: if not self.truncateResults: self.truncateResults = True updated = True if self.resultsMax != limit: self.resultsMax = limit updated = True if updated: self.update() dballe-5.18/provami/provami/QueryTextCtrl.py0000644000175000017500000000352311450146304016117 00000000000000import wx from provami.Model import ModelListener class QueryTextCtrl(wx.TextCtrl, ModelListener): def __init__(self, parent, model, filterTag, updateFunc = None, isValid = None): wx.TextCtrl.__init__(self, parent) self.model = model self.model.registerUpdateListener(self) # tag to identify the model filter changes to which we react self.filterTag = filterTag self.updateFunc = updateFunc if isValid is None: self.isValid = lambda x: True else: self.isValid = isValid self.defaultBackground = self.GetBackgroundColour() self.invalidBackground = wx.Colour(0xff, 0xbb, 0xbb) self.dirtyBackground = wx.Colour(0xff, 0xff, 0xbb) self.Bind(wx.EVT_TEXT, self.onChanged) self.Bind(wx.EVT_CHAR, self.onChar) self.updating = False def updateColour(self): if not self.isValid(self.GetValue()): self.SetBackgroundColour(self.invalidBackground) elif self.readValue() != self.model.filter.get(self.filterTag, None): self.SetBackgroundColour(self.dirtyBackground) else: self.SetBackgroundColour(self.defaultBackground) def readValue(self): res = str(self.GetValue()).strip() if res == "": return None return res def onChanged(self, event): if self.updating: return self.updateColour() def onChar(self, event): c = event.GetKeyCode() if c == 13: self.activated(event) else: event.Skip() def activated(self, event): #print "Activated", self.GetValue() if self.updateFunc is not None: self.updateFunc(self.readValue()) def filterChanged(self, what): if what == self.filterTag: self.updating = True text = self.model.filter.get(self.filterTag, None) if text is not None: self.SetValue(text) else: self.SetValue("") self.updateColour() self.updating = False def invalidate(self): self.Enable(False) def hasData(self, what): if what == "all": self.Enable(True) dballe-5.18/provami/provami/DateTimeCanvas.py0000644000175000017500000001073111450143077016153 00000000000000import string import wx import datetime from provami.Model import Model, ModelListener, TTracer def dtToMinutes(datetime): days = datetime.date().toordinal() time = datetime.time() return days * (24*60) + time.hour * 60 + time.minute def minutesToDT(minutes): date = datetime.date.fromordinal(minutes / (24*60)) time = datetime.time((minutes % (24*60)) / 60, minutes % 60) return datetime.datetime.combine(date, time) class DateTimeCanvas(wx.Window, ModelListener): def __init__(self, parent, model): wx.Window.__init__(self, parent, style=wx.FULL_REPAINT_ON_RESIZE) # Hook with the model self.model = model self.model.registerUpdateListener(self) # Initialize mouse tracking structures self.mouseDown = False # Bind events self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_SIZE, self.OnResize) self.Bind(wx.EVT_MOTION, self.OnMouseMoved) #self.Bind(wx.EVT_MOUSEWHEEL, self.OnMouseWheel) self.Bind(wx.EVT_LEFT_DOWN, self.OnMouseDown) self.Bind(wx.EVT_LEFT_UP, self.OnMouseUp) # Zoom to fit all the stations #self.zoomToFit() def timeToOffset (self, datetime): "Map a time to the corresponding offset in the widget" if datetime is None: return None mintime, maxtime = self.model.daterange() width, height = self.GetClientSizeTuple() if datetime < mintime: return 0 if datetime >= maxtime: return width - 1 min = dtToMinutes(mintime) max = dtToMinutes(maxtime) cur = dtToMinutes(datetime) return (cur - min) * width / (max - min) def offsetToTime (self, offset): "Map an offset in the widget to the corresponding time" if offset is None: return None mintime, maxtime = self.model.daterange() width, height = self.GetClientSizeTuple() if offset < 0: return mintime if offset >= width: return maxtime min = dtToMinutes(mintime) max = dtToMinutes(maxtime) return minutesToDT(min + offset * (max - min) / width) def selectPixelRange (self, offset1, offset2): sel_min = min(offset1, offset2) sel_max = max(offset1, offset2) self.model.setMinDateTimeFilter(self.offsetToTime(sel_min)) self.model.setMaxDateTimeFilter(self.offsetToTime(sel_max)) def OnMouseDown (self, event): self.mouseDown = True x, y = event.GetPosition() self.mouseDownOffset = x self.selectPixelRange(self.mouseDownOffset, x) def OnMouseUp (self, event): self.mouseDown = False x, y = event.GetPosition() self.selectPixelRange(self.mouseDownOffset, x) def OnMouseMoved (self, event): if self.mouseDown: x, y = event.GetPosition() self.selectPixelRange(self.mouseDownOffset, x) def OnResize (self, event): self.resize() def resize (self): # Invalidate the pre-rendered background image when the size # changes self.backgroundImage = None self.Refresh() def OnPaint (self, event): if self.backgroundImage is None: self.renderBackgroundImage() wx.BufferedPaintDC(self, self.backgroundImage, wx.BUFFER_VIRTUAL_AREA) def filterChanged(self, what): if what == "datetime": self.backgroundImage = None self.Refresh() def invalidate(self): self.backgroundImage = None self.Refresh() def hasData(self, what): if what == "dtimes": self.backgroundImage = None self.Refresh() def renderBackgroundImage (self): tracer = TTracer("regenerate background image") # Datetime extremes mintime, maxtime = self.model.daterange() # Widget size width, height = self.GetClientSizeTuple() # Selection extremes sel_mintime = self.model.getMinDateTimeFilter() sel_maxtime = self.model.getMaxDateTimeFilter() # Selection extremes as offsets minsel = self.timeToOffset(sel_mintime) maxsel = self.timeToOffset(sel_maxtime) # If there is a partial selection, make it open ended if minsel is not None or maxsel is not None: if minsel is None: minsel = 0 if maxsel is None: maxsel = width - 1 else: minsel = width maxsel = -1 # Compute histogram hist = [0] * width maxCount = 0 for dt in self.model.datetimes(): x = self.timeToOffset(dt) hist[x] = hist[x] + 1 if hist[x] > maxCount: maxCount = hist[x] self.backgroundImage = wx.EmptyBitmap(width, height) dc = wx.BufferedDC(None, self.backgroundImage) dc.BeginDrawing() dc.SetBackground(wx.Brush("WHITE")) dc.Clear() normalPen = wx.Pen("#FF0000") selectedPen = wx.Pen("#00FF00") # Draw the histogram for i in range(width): if i >= minsel and i <= maxsel: dc.SetPen(selectedPen) else: dc.SetPen(normalPen) dc.DrawLine(i, height, i, height - (hist[i] * height / maxCount)) dc.EndDrawing() dballe-5.18/provami/provami/DataResults.py0000644000175000017500000001737411450145035015564 00000000000000# -*- coding: UTF-8 -*- import wx import wx.grid import dballe from provami.Model import ModelListener, DateUtils, datetimeFromRecord from provami.ResultGrid import ResultTable, ResultGrid from provami.DataMenu import DataMenu # Tooltips per grid cell # http://www.archivesat.com/wxPython/thread379326.htm # # wxGrid introduction # http://wiki.wxpython.org/index.cgi/wxGrid def val_compare(a, b): vara = a.getvar(a["var"]) varb = b.getvar(b["var"]) isstra = vara.info().is_string() isstrb = varb.info().is_string() if isstra and isstrb: return cmp(vara.enqc(), varb.enqc()) elif isstra and not isstrb: return 1 elif not isstra and isstrb: return -1 else: return cmp(vara.enqd(), varb.enqd()) def intormiss(x): if x == dballe.MISSING_INT: return "-" else: return "%d" % x class DataTable(ResultTable): def __init__(self, model): ResultTable.__init__(self) self.model = model self.appendColumn("Ana", \ renderer = lambda x: x["ana_id"], sorter = lambda x, y: cmp(x["ana_id"], y["ana_id"])) self.appendColumn("Network", \ renderer = lambda x: x["rep_memo"], \ sorter = lambda x, y: cmp(x["rep_memo"], y["rep_memo"])) self.appendColumn("Date", \ renderer = lambda x: x["date"], \ sorter = lambda x, y: cmp(x["date"], y["date"])) self.appendColumn("Level", \ renderer = lambda x: ",".join([intormiss(y) for y in x["level"]]), \ sorter = lambda x, y: cmp(x["level"], y["level"])) self.appendColumn("Time range", \ renderer = lambda x: ",".join([intormiss(y) for y in x["trange"]]), \ sorter = lambda x, y: cmp(x["trange"], y["trange"])) self.appendColumn("Variable", \ renderer = lambda x: x["var"], \ sorter = lambda x, y: cmp(x["var"], y["var"])) self.appendColumn("Value", \ renderer = lambda x: x.getvar(x["var"]).format(), \ sorter = val_compare, editable = True) def SetValue(self, row, col, value): if row >= len(self.items): return if col != 6: return try: record = self.items[row] varcode = record["var"] var = record.getvar(varcode) if var.info().is_string(): record[varcode] = str(value) else: record[varcode] = float(value) self.model.writeRecord(record) except ValueError: pass def rowByContextAndVar(self, context, var): "Return the row number of a result given its context id and varcode" for idx, i in enumerate(self.items): if i["context_id"] == context and i["var"] == var: return idx return None def getRow(self, data): if data is None: return None context_id = data["context_id"] var = data["var"] for row, d in enumerate(self.items): if d["context_id"] == context_id and d["var"] == var: return row return None def update(self): for record in self.model.data(): self.items.append(record.copy()) self.sort() view = self.GetView() if view is not None: view.ProcessTableMessage( wx.grid.GridTableMessage(self, wx.grid.GRIDTABLE_NOTIFY_ROWS_APPENDED, len(self.items))) # FIXME: wxwidgets bug workaround to have the # scrollbars to resize # See: http://wiki.wxpython.org/index.cgi/Frequently_Asked_Questions#head-43f3f79f739a4c503584c4fb9620d40bf273e418 view.FitInside() class DataPanel(wx.Panel, ModelListener): def __init__(self, parent, model, statusbar): wx.Panel.__init__(self, parent) #wx.Panel.__init__(self, parent, id, wx.TAB_TRAVERSAL) self.model = model self.model.registerUpdateListener(self) self.current = None self.statusBar = statusbar self.dataMenu = DataMenu() self.results = ResultGrid(self) self.results.SetTable(DataTable(model)) self.results.setPopupMenu(self.dataMenu) box = wx.BoxSizer(wx.VERTICAL) box.Add(self.results, 1, flag=wx.EXPAND) self.SetSizerAndFit(box) self.dataMenu.Bind(wx.EVT_MENU, self.onDataMenu) self.results.Bind(ResultGrid.EVT_FLYOVER, self.onFlyOver) self.invalidate() self.hasData("data") def invalidate (self): self.current = self.results.saveCurrent() #self.results.GetTable().clear() def hasData (self, what): if what == "data": self.results.updating = True self.results.GetTable().clear() self.results.GetTable().update() self.results.restoreCurrent(self.current) self.results.updating = False def onFlyOver(self, event): row, col = event.GetCell() record = event.GetData() if record is not None: if col == 0: ident = record.get("ident", None) if ident is None: info = "Fixed station" else: info = "Mobile station " + ident info = info + ", lat %f, lon %f" % (record["lat"], record["lon"]) elif col == 3: info = dballe.Level(*record["level"]).describe() elif col == 4: info = dballe.Trange(*record["trange"]).describe() else: info = record.getvar(record["var"]).info() info = "%s (%s)" % (info.desc, info.unit) self.statusBar.SetStatusText(info, 0) def onDataMenu(self, event): if event.GetId() == DataMenu.ACTION_SELECT_SAME_ANA_ID: record = self.dataMenu.getData() self.model.setStationFilter(record["ana_id"]) elif event.GetId() == DataMenu.ACTION_SELECT_SAME_IDENT: record = self.dataMenu.getData() ident = record["ident"] self.model.setIdentFilter(ident is not None, ident) elif event.GetId() == DataMenu.ACTION_SELECT_SAME_LEVEL: record = self.dataMenu.getData() self.model.setLevelFilter(record["level"]) elif event.GetId() == DataMenu.ACTION_SELECT_SAME_TRANGE: record = self.dataMenu.getData() self.model.setTimeRangeFilter(record["trange"]) elif event.GetId() == DataMenu.ACTION_SELECT_SAME_VAR: record = self.dataMenu.getData() self.model.setVarFilter(record["var"]) elif event.GetId() == DataMenu.ACTION_SELECT_SAME_REPCOD: record = self.dataMenu.getData() self.model.setReportFilter(record["rep_cod"]) elif event.GetId() == DataMenu.ACTION_SELECT_SAME_DATEMIN: dt = datetimeFromRecord(self.dataMenu.getData(), DateUtils.EXACT) self.model.setDateTimeFilter(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, DateUtils.MIN) elif event.GetId() == DataMenu.ACTION_SELECT_SAME_DATEMAX: dt = datetimeFromRecord(self.dataMenu.getData(), DateUtils.EXACT) self.model.setDateTimeFilter(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, DateUtils.MAX) elif event.GetId() == DataMenu.ACTION_DELETE_CURRENT: record = self.dataMenu.getData() context, id = record["context_id"], record["var"] self.model.deleteValues(((context, id),)) elif event.GetId() == DataMenu.ACTION_DELETE_SELECTED: grid = self.dataMenu.getGrid() self.model.deleteValues([(r["context_id"], r["var"]) for r in grid.getSelectedData()]) else: event.Skip() dballe-5.18/provami/provami/MapChoice.py0000644000175000017500000002331311450143703015147 00000000000000import wx from provami.Model import * from provami.MapCanvas import MapCanvas, MapCanvasListener from provami.IdentChoice import IdentChoice from provami.QueryButton import QueryButton class MapChoice(wx.Frame, ModelListener, MapCanvasListener): # Toolbar IDs TB_ZOOM_IN=10 TB_ZOOM_OUT=20 TB_MOVE=30 TB_SELECT_AREA=40 TB_SELECT_STATION=50 TB_SELECT_IDENT=60 ICON_MAP_MOVE = "provami-map-move" ICON_MAP_SELECT_AREA = "provami-select-area" ICON_MAP_SELECT_STATION = "provami-select-station" ICON_MAP_SELECT_IDENT = "provami-select-ident" def __init__(self, parent, model): wx.Frame.__init__(self, parent, -1, "Map", size = (500, 500), style=wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE) self.points = [] self.userScale = 1.0 self.mouseDown = False # 0: move # 1: select area # 2: select station self.mode = 0 self.model = model self.model.registerUpdateListener(self) # When closing the window, notify parent so that it can enable # the button to open us again self.parent = parent self.Bind(wx.EVT_CLOSE, self.onClose) self.map = MapCanvas(self, model) self.map.loadShoreLines(filePath('world.dat')) #self.map.loadShoreLines(filePath('nations.dat')) self.map.Bind(MapCanvas.EVT_MODE_CHANGED, self.modeChanged) # Flag set to true when the input fields are updated internally # insted of on user input self.updating = True self.tb = self.CreateToolBar(wx.TB_HORIZONTAL | wx.NO_BORDER | wx.TB_FLAT | wx.TB_TEXT) bmp = wx.ArtProvider.GetBitmap("gtk-zoom-in", wx.ART_TOOLBAR, (16,16)) self.tb.AddSimpleTool(MapChoice.TB_ZOOM_IN, bmp, "Zoom in", "Zoom in") self.Bind(wx.EVT_TOOL, self.onToolClick, id=MapChoice.TB_ZOOM_IN) bmp = wx.ArtProvider.GetBitmap("gtk-zoom-out", wx.ART_TOOLBAR, (16,16)) self.tb.AddSimpleTool(MapChoice.TB_ZOOM_OUT, bmp, "Zoom out", "Zoom out") self.Bind(wx.EVT_TOOL, self.onToolClick, id=MapChoice.TB_ZOOM_OUT) bmp = wx.ArtProvider.GetBitmap(MapChoice.ICON_MAP_MOVE, wx.ART_TOOLBAR, (16,16)) self.tb.AddRadioTool(MapChoice.TB_MOVE, bmp, shortHelp="Move", longHelp="Move the map") self.Bind(wx.EVT_TOOL, self.onToolClick, id=MapChoice.TB_MOVE) bmp = wx.ArtProvider.GetBitmap(MapChoice.ICON_MAP_SELECT_AREA, wx.ART_TOOLBAR, (16,16)) self.tb.AddRadioTool(MapChoice.TB_SELECT_AREA, bmp, shortHelp="Select area", longHelp="Select area") self.Bind(wx.EVT_TOOL, self.onToolClick, id=MapChoice.TB_SELECT_AREA) bmp = wx.ArtProvider.GetBitmap(MapChoice.ICON_MAP_SELECT_STATION, wx.ART_TOOLBAR, (16,16)) self.tb.AddRadioTool(MapChoice.TB_SELECT_STATION, bmp, shortHelp="Select station", longHelp="Select station") self.Bind(wx.EVT_TOOL, self.onToolClick, id=MapChoice.TB_SELECT_STATION) bmp = wx.ArtProvider.GetBitmap(MapChoice.ICON_MAP_SELECT_IDENT, wx.ART_TOOLBAR, (16,16)) self.tb.AddRadioTool(MapChoice.TB_SELECT_IDENT, bmp, shortHelp="Select same ident", longHelp="Select same ident") self.Bind(wx.EVT_TOOL, self.onToolClick, id=MapChoice.TB_SELECT_IDENT) self.tb.ToggleTool(MapChoice.TB_MOVE, True) buttonPanel = wx.Panel(self) bpsizer = wx.GridBagSizer() self.timedUpdater = None self.latminSpin = wx.TextCtrl(buttonPanel) self.Bind(wx.EVT_TEXT, self.onSpinChanged, self.latminSpin) #self.latminSpin.SetRange(-90, 90) self.latminSpin.SetValue('') self.latmaxSpin = wx.TextCtrl(buttonPanel) self.Bind(wx.EVT_TEXT, self.onSpinChanged, self.latmaxSpin) #self.latmaxSpin.SetRange(-90, 90) self.latmaxSpin.SetValue('') self.lonminSpin = wx.TextCtrl(buttonPanel) self.Bind(wx.EVT_TEXT, self.onSpinChanged, self.lonminSpin) #self.lonminSpin.SetRange(-180, 180) self.lonminSpin.SetValue('') self.lonmaxSpin = wx.TextCtrl(buttonPanel) self.Bind(wx.EVT_TEXT, self.onSpinChanged, self.lonmaxSpin) #self.lonmaxSpin.SetRange(-180, 180) self.lonmaxSpin.SetValue('') self.idField = wx.TextCtrl(buttonPanel) self.Bind(wx.EVT_TEXT, self.onSpinChanged, self.idField) for i in self.latminSpin, self.latmaxSpin, self.lonminSpin, self.lonmaxSpin, self.idField: i.Enable(False) self.updating = False bpsizer.Add(wx.StaticText(buttonPanel, -1, "Lat: "), (0, 0), (1, 1), flag=wx.ALIGN_CENTER_VERTICAL) bpsizer.Add(self.latminSpin, (0, 1), (1, 1)) bpsizer.Add(wx.StaticText(buttonPanel, -1, " to "), (0, 2), (1, 1), flag=wx.ALIGN_CENTER_VERTICAL) bpsizer.Add(self.latmaxSpin, (0, 3), (1, 1)) bpsizer.Add(wx.StaticText(buttonPanel, -1, "Lon: "), (1, 0), (1, 1), flag=wx.ALIGN_CENTER_VERTICAL) bpsizer.Add(self.lonminSpin, (1, 1), (1, 1)) bpsizer.Add(wx.StaticText(buttonPanel, -1, " to "), (1, 2), (1, 1), flag=wx.ALIGN_CENTER_VERTICAL) bpsizer.Add(self.lonmaxSpin, (1, 3), (1, 1)) bpsizer.Add(IdentChoice(buttonPanel, self.model), (0, 4), (1, 2), flag=wx.EXPAND) bpsizer.Add(wx.StaticText(buttonPanel, -1, "Id: "), (1, 4), (1, 1), flag=wx.ALIGN_CENTER_VERTICAL) bpsizer.Add(self.idField, (1, 5), (1, 1), flag=wx.ALIGN_CENTER_VERTICAL) self.resetButton = wx.Button(buttonPanel, -1, "Reset filter") self.Bind(wx.EVT_BUTTON, self.onResetButton, self.resetButton) bpsizer.Add(self.resetButton, (0, 6), (1, 1), flag=wx.ALIGN_RIGHT) bpsizer.Add(QueryButton(buttonPanel, model), (1, 6), (1, 1)) buttonPanel.SetSizer(bpsizer) box = wx.BoxSizer(wx.VERTICAL) box.Add(self.map, 1, wx.EXPAND) box.Add(buttonPanel) self.SetSizerAndFit(box) self.invalidate() self.hasData("stations") def modeChanged(self, event): "Handle mode change on the map canvas" oldMode, mode = event.GetModeChange() if mode == MapCanvas.MODE_MOVE: self.tb.ToggleTool(MapChoice.TB_MOVE, True) for i in self.latminSpin, self.latmaxSpin, self.lonminSpin, self.lonmaxSpin, self.idField: i.Enable(False) elif mode == MapCanvas.MODE_SELECT_AREA: self.tb.ToggleTool(MapChoice.TB_SELECT_AREA, True) for i in self.latminSpin, self.latmaxSpin, self.lonminSpin, self.lonmaxSpin: i.Enable(True) self.idField.Enable(False) elif mode == MapCanvas.MODE_SELECT_STATION: self.tb.ToggleTool(MapChoice.TB_SELECT_STATION, True) for i in self.latminSpin, self.latmaxSpin, self.lonminSpin, self.lonmaxSpin, self.idField: i.Enable(True) elif mode == MapCanvas.MODE_SELECT_IDENT: self.tb.ToggleTool(MapChoice.TB_SELECT_IDENT, True) for i in self.latminSpin, self.latmaxSpin, self.lonminSpin, self.lonmaxSpin, self.idField: i.Enable(False) def filterChanged(self, what): if what == "stations": # Temporarily disable the changed events from the spins self.updating = True sel_latmin = self.model.filter.get("latmin", None) sel_latmax = self.model.filter.get("latmax", None) sel_lonmin = self.model.filter.get("lonmin", None) sel_lonmax = self.model.filter.get("lonmax", None) sel_id = self.model.filter.get("ana_id", None) if sel_latmin is None: self.latminSpin.SetValue('') elif self.latminSpin.GetValue() != str(sel_latmin): self.latminSpin.SetValue(str(sel_latmin)) if sel_latmax is None: self.latmaxSpin.SetValue('') elif self.latmaxSpin.GetValue() != str(sel_latmax): self.latmaxSpin.SetValue(str(sel_latmax)) if sel_lonmin is None: self.lonminSpin.SetValue('') elif self.lonminSpin.GetValue() != str(sel_lonmin): self.lonminSpin.SetValue(str(sel_lonmin)) if sel_lonmax is None: self.lonmaxSpin.SetValue('') elif self.lonmaxSpin.GetValue() != str(sel_lonmax): self.lonmaxSpin.SetValue(str(sel_lonmax)) if sel_id is None: self.idField.SetValue('') elif self.idField.GetValue() != str(sel_id): self.idField.SetValue(str(sel_id)) if sel_latmin is None and sel_lonmin is None and \ sel_latmax is None and sel_lonmax is None and sel_id is None: self.resetButton.Disable() else: self.resetButton.Enable() # Re-enable the changed events from the spins self.updating = False def onClose(self, event): # Hide the window self.Hide() # Don't destroy the window event.Veto() # Notify parent that we've been closed self.parent.mapHasClosed() def onToolClick(self, event): #print "Tool", event.GetId() if event.GetId() == MapChoice.TB_ZOOM_IN: # Zoom in self.map.zoom(0.8) elif event.GetId() == MapChoice.TB_ZOOM_OUT: # Zoom out self.map.zoom(1.2) elif event.GetId() == MapChoice.TB_MOVE: # Pan mode self.map.setMode(MapCanvas.MODE_MOVE) elif event.GetId() == MapChoice.TB_SELECT_AREA: # Select area mode self.map.setMode(MapCanvas.MODE_SELECT_AREA) elif event.GetId() == MapChoice.TB_SELECT_STATION: # Select station mode self.map.setMode(MapCanvas.MODE_SELECT_STATION) elif event.GetId() == MapChoice.TB_SELECT_IDENT: # Select same ident mode self.map.setMode(MapCanvas.MODE_SELECT_IDENT) def updateFromSpins(self): "Delayed update of the filter from the value of the input fields" if self.updating: return try : if self.fieldUpdated == "area": # Select the area from the area fields self.model.setAreaFilter( \ latmin = float(self.latminSpin.GetValue()), \ latmax = float(self.latmaxSpin.GetValue()), \ lonmin = float(self.lonminSpin.GetValue()), \ lonmax = float(self.lonmaxSpin.GetValue()) \ ); else: # Select the station by ID self.model.setStationFilter(int(self.idField.GetValue())) except ValueError: # Do nothing in case there are incorrect numbers in the fields pass def onSpinChanged(self, event): """ When a field is edited, trigger a delayed update according to its contents. The reason for the delay is to trigger the update only when the user seems to have finished typing. """ if self.updating: return if event.GetEventObject() == self.idField: self.fieldUpdated = "station" else: self.fieldUpdated = "area" if self.timedUpdater is None: self.timedUpdater = wx.FutureCall(300, self.updateFromSpins) else: self.timedUpdater.Restart(300) def onResetButton(self, event): self.model.setStationFilter(None) dballe-5.18/provami/provami/LimitChoice.py0000644000175000017500000000457411173330007015515 00000000000000import wx from provami.Model import ModelListener from provami.QueryButton import QueryButton class LimitChoice(wx.Panel, ModelListener): def __init__(self, parent, model, id=-1): wx.Panel.__init__(self, parent, id) self.model = model self.model.registerUpdateListener(self) self.checkBox = wx.CheckBox(self, -1, "Limit results", style=wx.ALIGN_RIGHT) self.moreButton = wx.Button(self, -1, "More") self.lessButton = wx.Button(self, -1, "Less") self.queryButton = QueryButton(self, model) self.info = wx.StaticText(self, -1, "") self.Bind(wx.EVT_CHECKBOX, self.onCheckBox, self.checkBox) self.Bind(wx.EVT_BUTTON, self.onClick, self.lessButton) self.Bind(wx.EVT_BUTTON, self.onClick, self.moreButton) box = wx.BoxSizer(wx.HORIZONTAL) box.Add(self.info, 0, wx.ALIGN_CENTER) box.Add(wx.StaticText(self, -1, ""), 1) box.Add(self.checkBox, 0, wx.ALIGN_CENTER) box.Add(self.lessButton) box.Add(self.moreButton) box.Add(self.queryButton) self.SetSizerAndFit(box) self.invalidate() self.hasData("data") def onClick(self, event): button = event.GetEventObject() if button == self.lessButton: if self.model.resultsMax / 2 < self.model.lowerTruncateThreshold: self.model.setResultLimit(self.model.lowerTruncateThreshold) else: self.model.setResultLimit(self.model.resultsMax / 2) elif button == self.moreButton: self.model.setResultLimit(self.model.resultsMax * 2) self.model.update() def onCheckBox(self, event): cb = event.GetEventObject() if cb.GetValue(): self.model.setResultLimit(self.model.resultsMax) else: self.model.setResultLimit(None) self.model.update() def invalidate(self): self.checkBox.Enable(False) self.lessButton.Enable(False) self.moreButton.Enable(False) def hasData(self, what): if what == "data": self.checkBox.SetValue(self.model.truncateResults) if self.model.resultsTruncated: self.info.SetLabel("%d+ results" % self.model.resultsCount) self.moreButton.Enable() else: self.info.SetLabel("%d results" % self.model.resultsCount) self.moreButton.Disable() if self.model.resultsCount < self.model.lowerTruncateThreshold: self.checkBox.Disable() self.lessButton.Disable() self.moreButton.Disable() else: self.checkBox.Enable() if self.model.resultsMax <= self.model.lowerTruncateThreshold: self.lessButton.Disable() else: self.lessButton.Enable() dballe-5.18/provami/provami/DateCanvas.py0000644000175000017500000001067511450143077015343 00000000000000import string import wx import datetime from provami.Model import Model, ModelListener, TTracer class DateCanvas(wx.Window, ModelListener): def __init__(self, parent, model): wx.Window.__init__(self, parent, style=wx.FULL_REPAINT_ON_RESIZE) # Hook with the model self.model = model self.model.registerUpdateListener(self) # Initialize mouse tracking structures self.mouseDown = False # Bind events self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_SIZE, self.OnResize) self.Bind(wx.EVT_MOTION, self.OnMouseMoved) #self.Bind(wx.EVT_MOUSEWHEEL, self.OnMouseWheel) self.Bind(wx.EVT_LEFT_DOWN, self.OnMouseDown) self.Bind(wx.EVT_LEFT_UP, self.OnMouseUp) # Zoom to fit all the stations #self.zoomToFit() def dateToOffset (self, date): "Map a date to the corresponding offset in the widget" if date is None: return None width, height = self.GetClientSizeTuple() mintime, maxtime = self.model.daterange() mindate = mintime.date() maxdate = maxtime.date() if date < mindate: return 0 if date >= maxdate: return width - 1 min = mindate.toordinal() max = maxdate.toordinal() cur = date.toordinal() return (cur - min) * width / (max - min) def offsetToDate (self, offset): "Map an offset in the widget to the corresponding date" if offset is None: return None width, height = self.GetClientSizeTuple() mintime, maxtime = self.model.daterange() mindate = mintime.date() maxdate = maxtime.date() if offset < 0: return mindate if offset >= width: return maxdate min = mindate.toordinal() max = maxdate.toordinal() return datetime.date.fromordinal(min + offset * (max - min) / width) def selectPixelRange (self, offset1, offset2): sel_min = min(offset1, offset2) sel_max = max(offset1, offset2) self.model.setMinDateTimeFilter(datetime.datetime.combine(self.offsetToDate(sel_min), datetime.time(0))) self.model.setMaxDateTimeFilter(datetime.datetime.combine(self.offsetToDate(sel_max), datetime.time(23, 59, 59))) def OnMouseDown (self, event): self.mouseDown = True x, y = event.GetPosition() self.mouseDownOffset = x self.selectPixelRange(self.mouseDownOffset, x) def OnMouseUp (self, event): self.mouseDown = False x, y = event.GetPosition() self.selectPixelRange(self.mouseDownOffset, x) def OnMouseMoved (self, event): if self.mouseDown: x, y = event.GetPosition() self.selectPixelRange(self.mouseDownOffset, x) def OnResize (self, event): self.resize() def resize (self): # Invalidate the pre-rendered background image when the size # changes self.backgroundImage = None self.Refresh() def OnPaint (self, event): if self.backgroundImage is None: self.renderBackgroundImage() wx.BufferedPaintDC(self, self.backgroundImage, wx.BUFFER_VIRTUAL_AREA) def filterChanged(self, what): if what == "datetime": self.backgroundImage = None self.Refresh() def invalidate(self): self.backgroundImage = None self.Refresh() def hasData(self, what): if what == "dtimes": self.backgroundImage = None self.Refresh() def renderBackgroundImage (self): tracer = TTracer("regenerate background image") # Datetime extremes mintime, maxtime = self.model.daterange() # Widget size width, height = self.GetClientSizeTuple() # Selection extremes sel_mindate = self.model.getMinDateTimeFilter() sel_maxdate = self.model.getMaxDateTimeFilter() if sel_mindate: sel_mindate = sel_mindate.date() if sel_maxdate: sel_maxdate = sel_maxdate.date() # Selection extremes as offsets minsel = self.dateToOffset(sel_mindate) maxsel = self.dateToOffset(sel_maxdate) # If there is a partial selection, make it open ended if minsel is not None or maxsel is not None: if minsel is None: minsel = 0 if maxsel is None: maxsel = width - 1 else: minsel = width maxsel = -1 # Compute histogram hist = [0] * width maxCount = 0 for dt in self.model.datetimes(): x = self.dateToOffset(dt.date()) hist[x] = hist[x] + 1 if hist[x] > maxCount: maxCount = hist[x] self.backgroundImage = wx.EmptyBitmap(width, height) dc = wx.BufferedDC(None, self.backgroundImage) dc.BeginDrawing() dc.SetBackground(wx.Brush("WHITE")) dc.Clear() normalPen = wx.Pen("#FF0000") selectedPen = wx.Pen("#00FF00") # Draw the histogram for i in range(width): if i >= minsel and i <= maxsel: dc.SetPen(selectedPen) else: dc.SetPen(normalPen) dc.DrawLine(i, height, i, height - (hist[i] * height / maxCount)) dc.EndDrawing() dballe-5.18/provami/provami/FilterWindow.py0000644000175000017500000001003411173330007015725 00000000000000import dballe import wx import wx.html import re from provami.Model import * from provami.QueryTextCtrl import QueryTextCtrl class FilterWindow(wx.Frame): def __init__(self, parent, model): wx.Frame.__init__(self, parent, title = "Extra filters", size = (400, 300), style=wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE) self.parent = parent self.model = model #self.statusBar = self.CreateStatusBar() self.validateExpression1 = re.compile(r"^(?:([^<=>]+)(?:<=|==|=|>=|<|>|<>)[^<=>]+|)$") self.validateExpression2 = re.compile(r"^[^<=>]+<=([^<=>]+)<=[^<=>]+$") self.bcodeExpression = re.compile(r"^B([0-9]{2})([0-9]{3})$") self.intro = wx.html.HtmlWindow(self) self.intro.SetSizeHints(500, 300) self.intro.SetBorders(3) self.intro.SetFonts("", "", [4, 6, 8, 10, 11, 12, 13]) self.intro.SetPage("""

Here you can enter some extra filters for your data.

The ana filter restricts the data to only those stations for which there is a station variable matching the filter.

The data filter restricts the data to only those stations for which there is a data variable matching the filter.

The attribute filter restricts the data to only those values for which there is an attribute matching the filter.

The format of the filter is like B12001>=10, and consists of a variable code, a comparison operator (<, <=, =, >=, >, <>), and a value.

It is also possible to specify a range with the syntax: 10<=B12001<=20.

Aliases can be used instead of the variable codes. For example: 1000<=height<=2000.

"""); filterPanel = wx.Panel(self) self.anaFilter = QueryTextCtrl(filterPanel, model, "ana_filter", lambda x: model.setAnaFilter(x), self.validateFilter) self.dataFilter = QueryTextCtrl(filterPanel, model, "data_filter", lambda x: model.setDataFilter(x), self.validateFilter) self.attrFilter = QueryTextCtrl(filterPanel, model, "attr_filter", lambda x: model.setAttrFilter(x), self.validateFilter) sizer = wx.GridBagSizer() sizer.Add(wx.StaticText(filterPanel, -1, "Ana filter: "), (0, 0), (1, 1), flag=wx.ALIGN_CENTER_VERTICAL) sizer.Add(self.anaFilter, (0, 1), (1, 1), flag = wx.ALIGN_CENTER_VERTICAL | wx.EXPAND) sizer.Add(wx.StaticText(filterPanel, -1, "Data filter: "), (1, 0), (1, 1), flag=wx.ALIGN_CENTER_VERTICAL) sizer.Add(self.dataFilter, (1, 1), (1, 1), flag = wx.ALIGN_CENTER_VERTICAL | wx.EXPAND) sizer.Add(wx.StaticText(filterPanel, -1, "Attr filter: "), (2, 0), (1, 1), flag=wx.ALIGN_CENTER_VERTICAL) sizer.Add(self.attrFilter, (2, 1), (1, 1), flag = wx.ALIGN_CENTER_VERTICAL | wx.EXPAND) sizer.AddGrowableCol(1) filterPanel.SetSizerAndFit(sizer) box = wx.BoxSizer(wx.VERTICAL) box.Add(filterPanel, 0, flag = wx.EXPAND) box.Add(self.intro, 1, flag = wx.EXPAND) self.SetSizerAndFit(box) self.Bind(wx.EVT_CLOSE, self.onClose) def validateFilter(self, str): # Accept the empty string if len(str.strip()) == 0: return True # Match the filter format match = self.validateExpression1.match(str) if not match: match = self.validateExpression2.match(str) if not match: return False # See if the B codes are in the valid range bmatch = self.bcodeExpression.match(match.groups()[0]) if bmatch: x, y = map(int, bmatch.groups()) if x > 63: return False if y > 255: return False else: try: info = dballe.Varinfo.create(match.groups()[0]) except: return False return True def onClose(self, event): # Hide the window self.Hide() # Don't destroy the window event.Veto() # Notify parent that we've been closed self.parent.filtersHasClosed() dballe-5.18/provami/provami/ResultGrid.py0000644000175000017500000002240111450143077015404 00000000000000# -*- coding: UTF-8 -*- import wx import wx.grid # Tooltips per grid cell # http://www.archivesat.com/wxPython/thread379326.htm # # wxGrid introduction # http://wiki.wxpython.org/index.cgi/wxGrid # # Custom event type examples # http://archives.devshed.com/forums/python-122/wxstatictext-164649.html class ResultTable(wx.grid.PyGridTableBase): def __init__(self): wx.grid.PyGridTableBase.__init__(self) self.items = [] self.renderer = [] self.sorter = [] self.colNames = [] self.colEditable = [] self.sortColumn = None self.sortDescending = False def appendColumn(self, title, renderer = None, sorter = None, editable = False): self.colNames.append(title) if renderer is not None: self.renderer.append(renderer) else: self.renderer.append(lambda x: str(x)) if sorter is not None: self.sorter.append(sorter) else: self.sorter.append(lambda x, y: cmp(x, y)) self.colEditable.append(editable) def getData(self, row): if row < 0 or row >= len(self.items): return None return self.items[row] def getRow(self, data): """Return the row number for the given data, or None if no row contains the given data""" for row, d in enumerate(self.items): if d == data: return row return None def GetNumberCols(self): return len(self.colNames) def GetNumberRows(self): return len(self.items) def GetColLabelValue(self, col): "Get column titles" # ˄˅↑↓↥↧⇑⇓⇧⇩∇∆ if col == self.sortColumn: if self.sortDescending: return self.colNames[col] + " ∆" else: return self.colNames[col] + " ∇" else: return self.colNames[col] def GetValue(self, row, col): "Get cell values" if row < 0 or row >= self.GetNumberRows(): return "(error)" else: return self.renderer[col](self.items[row]) def GetAttr(self, row, col, kind): """ Get cell attributes. It will return the standard attribute if the value is different than the cell above, else it will return a grayed attribute. """ attr = wx.grid.GridCellAttr() provider = self.GetAttrProvider() if provider is not None: defattr = provider.GetAttr(row, col, kind) if defattr is not None: attr.MergeWith(defattr) if row >= len(self.items): attr.SetReadOnly(True) else: attr.SetReadOnly(not self.colEditable[col]) if row != 0: this = self.renderer[col](self.items[row]) sup = self.renderer[col](self.items[row - 1]) if sup == this: attr.SetTextColour("GRAY50") return attr def setSortColumn(self, col): "Change the sorting column" if col == self.sortColumn: self.sortDescending = not self.sortDescending else: self.sortColumn = col if self.sortDescending: self.items.sort(lambda a, b: self.sorter[self.sortColumn](b, a)) else: self.items.sort(self.sorter[self.sortColumn]) # This triggers a redraw view = self.GetView() if view is not None: view.ProcessTableMessage( wx.grid.GridTableMessage(self, wx.grid.GRIDTABLE_REQUEST_VIEW_GET_VALUES)) self.GetView().Refresh() def sort(self): "Resort using the current sorting column" if self.sortColumn is not None: if self.sortDescending: self.items.sort(lambda a, b: self.sorter[self.sortColumn](b, a)) else: self.items.sort(self.sorter[self.sortColumn]) # This triggers a redraw view = self.GetView() if view is not None: view.ProcessTableMessage( wx.grid.GridTableMessage(self, wx.grid.GRIDTABLE_REQUEST_VIEW_GET_VALUES)) def clear(self): count = len(self.items) self.items = [] view = self.GetView() if view is not None: view.ProcessTableMessage( wx.grid.GridTableMessage(self, wx.grid.GRIDTABLE_NOTIFY_ROWS_DELETED, 0, count)) # FIXME: wxwidgets bug workaround to have the # scrollbars to resize # See: http://wiki.wxpython.org/index.cgi/Frequently_Asked_Questions#head-43f3f79f739a4c503584c4fb9620d40bf273e418 view.FitInside() class ResultGrid(wx.grid.Grid): class ResultGridEvent(wx.PyCommandEvent): def __init__(self, eventType, id): wx.PyCommandEvent.__init__(self, eventType, id) self.pos = None self.data = None def SetCell(self, row, col): self.pos = (row, col) def SetData(self, data): self.data = data def GetCell(self): "Get the (row, column) position of the cell" return self.pos def GetData(self): "Get the data corresponding to the cell row" return self.data # Create custom events wxEVT_FLYOVER = wx.NewEventType() EVT_FLYOVER = wx.PyEventBinder(wxEVT_FLYOVER, 0) wxEVT_CHANGED_CURRENT_ROW = wx.NewEventType() EVT_CHANGED_CURRENT_ROW = wx.PyEventBinder(wxEVT_CHANGED_CURRENT_ROW, 0) def __init__(self, parent): wx.grid.Grid.__init__(self, parent) self.oldFlyoverCell = None self.currentRow = None self.currentCol = None self.popupMenu = None self.selection = set() self.EnableEditing(True) self.EnableDragRowSize(False) self.SetSelectionMode(self.wxGridSelectRows) self.SetRowLabelSize(0) # Allow the grid to become smaller: by default it wants to be too tall self.SetSizeHints(100, 100) self.AutoSizeColumns() self.Bind(wx.grid.EVT_GRID_LABEL_LEFT_CLICK, self.onLabelLeftClicked) self.Bind(wx.grid.EVT_GRID_CELL_RIGHT_CLICK, self.onCellRightClicked) self.Bind(wx.grid.EVT_GRID_SELECT_CELL, self.onCellSelect) self.Bind(wx.grid.EVT_GRID_RANGE_SELECT, self.onRangeSelect) self.GetGridWindow().Bind(wx.EVT_MOTION, self.onMouseMotion) self.updating = False def countSelectedRows(self): "Return the number of selected rows" return len(self.selection) def getSelectedRows(self): "Return the (unsorted) sequence of selected row indexes" return self.selection def getSelectedData(self): "Return the (unsorted) sequence of selected data" return (self.GetTable().getData(i) for i in self.selection) def getFirstRow(self): "Return the data corresponding to the first row" return self.GetTable().getData(0) def setPopupMenu(self, menu): """ Set a menu to use as a right-click popup menu The menu must be a wx.Menu or one of its descendents. If it contains a method like: def configureCell(grid, row, col, data): then it is called every time before popping up the menu, to give a chance to implement custom per-cell menus """ self.popupMenu = menu def onRangeSelect(self, event): """Internal update to the selection tracking list""" if event.Selecting(): # adding to the list... for index in range(event.GetTopRow(), event.GetBottomRow()+1): self.selection.add(index) else: # removal from list for index in range(event.GetTopRow(), event.GetBottomRow()+1): self.selection.discard(index) event.Skip() def onCellSelect(self, event): """ Internal update to the selection tracking list Also generate FLYOVER events """ self.selection.clear() self.selection.add(event.GetRow()) row, col = event.GetRow(), event.GetCol() self.triggerFlyOver(row, col) self.triggerChangedCurrentRow(row, col) self.currentCol = col event.Skip() def onCellRightClicked(self, event): "Handle popping up a menu at right click" if self.popupMenu is not None: if getattr(self.popupMenu, "configureCell", None) is not None: # If the menu has a configureCell method, call # it to give a chance to offer a different, # per-cell menu row, col, data = event.GetRow(), event.GetCol(), None if row != -1: data = self.GetTable().getData(row) if not self.popupMenu.configureCell(self, row, col, data): # Don't pop up if the menu does not want to return self.PopupMenu(self.popupMenu, event.GetPosition()) def triggerFlyOver(self, row, col): if self.updating: return if self.oldFlyoverCell != (row, col): self.oldFlyoverCell = (row, col) e = ResultGrid.ResultGridEvent(ResultGrid.wxEVT_FLYOVER, self.GetId()) e.SetCell(row, col) if row != -1: e.SetData(self.GetTable().getData(row)) self.GetEventHandler().ProcessEvent(e) def triggerChangedCurrentRow(self, row, col): if self.updating: return #if self.currentRow == row: return self.currentRow = row e = ResultGrid.ResultGridEvent(ResultGrid.wxEVT_CHANGED_CURRENT_ROW, self.GetId()) e.SetCell(row, col) if row != -1: e.SetData(self.GetTable().getData(row)) self.GetEventHandler().ProcessEvent(e) def onLabelLeftClicked(self, event): c = self.saveCurrent() row, col = event.GetRow(), event.GetCol() if row == -1: self.GetTable().setSortColumn(col) self.restoreCurrent(c) #event.Skip() def onMouseMotion(self, event): # FIXME: nothing better than going through the scrolled window? x, y = self.CalcUnscrolledPosition(event.GetPosition()) row, col = self.XYToCell(x, y).Get() self.triggerFlyOver(row, col) event.Skip() def saveCurrent(self): """ Return an opaque object that represent the current cell in the table. The object can survive sorting and data updates, and be used later with restoreCurrent """ data = self.GetTable().getData(self.currentRow) return (data, self.currentCol) def restoreCurrent(self, current): if current is None: return data, col = current row = self.GetTable().getRow(data) or 0 if col is None: col = 0 self.SetGridCursor(row, col) # Scroll to the cell if it went out of view if not self.IsVisible(row, col, True): self.MakeCellVisible(row, col) dballe-5.18/provami/provami/DateChoice.py0000644000175000017500000002135011553334665015323 00000000000000import re import wx import wx.calendar import datetime from provami.Model import * #def datetime_from_controls(wxdate, wxtime): # date = wxdate.GetValue() # year = date.GetYear() # month = date.GetMonth() + 1 # day = date.GetDay() # date = wxtime.GetValue(as_wxDateTime=True) # hour = date.GetHour() # min = date.GetMinute() # sec = date.GetSecond() # print year, month, day, hour, min, sec # return datetime.datetime(year, month, day, hour, min, sec) def int_or_none(x): try: return int(x) except: return None class DateChoice(wx.TextCtrl): def __init__(self, parent, model, type=DateUtils.EXACT): wx.TextCtrl.__init__(self, parent) self.model = model self.model.registerUpdateListener(self) # Prevent change hooks to take place when we are updating after # a model change self.updating = False self.min = None self.max = None self.date = None self.tip = wx.ToolTip("") self.SetToolTip(self.tip) # Time value to use self.type = type # Matchers for all the allowed date formats self.emptyMatch = re.compile(r'^\s*$') self.dateMatch = [ re.compile(r'^\s*(?P\d{4})(?:[/-](?P\d{1,2})(?:[/-](?P\d{1,2})(?:\s+(?P\d{1,2})(?::(?P\d{1,2})(?::(?P\d{1,2}))?)?)?)?)?\s*$'), re.compile(r'^\s*(?:(?:(?P\d{1,2})[/-])?(?P\d{1,2})[/-])?(?P\d{4})(?:\s+(?P\d{1,2})(?::(?P\d{1,2})(?::(?P\d{1,2}))?)?)?\s*$') ] self.defaultBackground = self.GetBackgroundColour() self.invalidBackground = wx.Colour(0xff, 0xbb, 0xbb) self.Bind(wx.EVT_TEXT, self.changed) self.invalidate() self.hasData("dtimes") self.filterChanged("datetime") def isValid(self, str): """ Check if the date entered is a valid date in the accepted range Returns a 2-tuple: a boolean that is true if the string is valid or false if it is not valid, and an array with the 6 parsed values (some of which may be None) with the parsed date (or is None if the string is not a valid date). """ # Se if it's empty if self.emptyMatch.match(str): return True, None # Try out all the matchers m = None for matcher in self.dateMatch: m = matcher.match(str) if m is not None: break # If none succeeds, return false if m is None: return False, None # Get the values out of the group values = [int_or_none(m.group(x)) for x in ('year', 'month', 'day', 'hour', 'min', 'sec')] # If the year is empty, we can return a valid, empty date if values[0] is None: return True, None # If there is a partial date matching bits of minimum and maximum values, use those for completion if self.min is None or self.max is None: vmin = [0, 0, 0, 0, 0, 0] else: vmin = [self.min.year, self.min.month, self.min.day, self.min.hour, self.min.minute, self.min.second] if self.max is None: vmax = [9999, 12, 31, 24, 59, 59] else: vmax = [self.max.year, self.max.month, self.max.day, self.max.hour, self.max.minute, self.max.second] vvalues = [x for x in values] if self.type == DateUtils.MAX: for i in range(1,6): if vvalues[i - 1] != vmax[i - 1]: break if vvalues[i] is None: vvalues[i] = vmax[i] for i in range(1,6): if vvalues[i - 1] != vmin[i - 1]: break if vvalues[i] is None: vvalues[i] = vmin[i] else: for i in range(1,6): if vvalues[i - 1] != vmin[i - 1]: break if vvalues[i] is None: vvalues[i] = vmin[i] for i in range(1,6): if vvalues[i - 1] != vmax[i - 1]: break if vvalues[i] is None: vvalues[i] = vmax[i] try: dt = completeDate(vvalues, self.type) except ValueError: return False, None if dt is None: return True, None if (self.min is None or dt >= self.min) and (self.max is None or dt <= self.max): return True, values return False, values def changed(self, event): if self.updating: return valid, values = self.isValid(self.GetValue()) self.updating = True if valid: self.SetBackgroundColour(self.defaultBackground) if values is not None: self.model.setDateTimeFilter(values[0], values[1], values[2], values[3], values[4], values[5], filter=self.type) else: self.model.setDateTimeFilter(None) else: self.SetBackgroundColour(self.invalidBackground) self.model.setDateTimeFilter(None, filter = self.type) self.updating = False def filterChanged(self, what): if self.updating: return if what == "datetime": self.updating = True year, month, day, hour, min, sec = self.model.getDateTimeFilter(self.type) if year is None: self.SetValue('') elif month is None: self.SetValue("%04d" % (year)) elif day is None: self.SetValue("%04d-%02d" % (year, month)) elif hour is None: self.SetValue("%04d-%02d-%02d" % (year, month, day)) elif min is None: self.SetValue("%04d-%02d-%02d %02d" % (year, month, day, hour)) elif sec is None: self.SetValue("%04d-%02d-%02d %02d:%02d" % (year, month, day, hour, min)) else: self.SetValue("%04d-%02d-%02d %02d:%02d:%02d" % (year, month, day, hour, min, sec)) self.updating = False def hasData(self, what): if what == "dtimes": self.min, self.max = self.model.daterange() self.tip.SetTip("Minimum value: " + str(self.min) + "\nMaximum value: " + str(self.max)) self.filterChanged("datetime") self.changed(None) class MinDateChoice(DateChoice, ModelListener): def __init__(self, parent, model): DateChoice.__init__(self, parent, model, type=DateUtils.MIN) class MaxDateChoice(DateChoice, ModelListener): def __init__(self, parent, model): DateChoice.__init__(self, parent, model, type=DateUtils.MAX) #class DateChoice(wx.Panel): # def __init__(self, parent, model, id=-1): # wx.Panel.__init__(self, parent, id) # # self.model = model # self.model.registerUpdateListener(self) # # # Prevent change hooks to take place when we are updating after # # a model change # self.updating = False # # self.activate = wx.CheckBox(self, style=wx.ALIGN_RIGHT) # self.date = wx.DatePickerCtrl(self, style=wx.DP_DROPDOWN | wx.DP_SHOWCENTURY | wx.calendar.CAL_SHOW_SURROUNDING_WEEKS ) # self.timespin = wx.SpinButton(self, style=wx.SP_VERTICAL) # self.time = wx.lib.masked.TimeCtrl(self, fmt24hr=True, spinButton = self.timespin) # # sizer = wx.BoxSizer(wx.HORIZONTAL) # sizer.Add(self.activate) # sizer.Add(self.date) # sizer.Add(self.time) # sizer.Add(self.timespin) # # self.SetSizerAndFit(sizer) # # self.activate.SetValue(False) # self.date.Enable(False) # self.time.Enable(False) # # self.Bind(wx.EVT_CHECKBOX, self.changed, self.activate) # self.Bind(wx.EVT_DATE_CHANGED, self.changed, self.date) # self.Bind(wx.lib.masked.EVT_TIMEUPDATE, self.changed, self.time) # # self.invalidate() # self.hasData("dtimes") # self.filterChanged("datetime") # # def fromDateTime(self, dt, enable = False): # if dt is None: # self.activate.SetValue(False) # self.date.Enable(False) # self.time.Enable(False) # else: # date = wx.DateTime() # date.Set(dt.day, dt.month - 1, dt.year, dt.hour, dt.minute, dt.second) # self.date.SetValue(date) # self.time.SetValue(date) # if enable: # self.activate.SetValue(True) # self.date.Enable(True) # self.time.Enable(True) # # def changed(self, event): # if self.updating: return # if self.activate.GetValue(): # self.date.Enable(True) # self.time.Enable(True) # else: # self.date.Enable(False) # self.time.Enable(False) # # def hasData(self, what): # if what == "dtimes": # (tmin, tmax) = self.model.daterange() # ll = wx.DateTime() # ll.Set(tmin.day, tmin.month, tmin.year, tmin.hour, tmin.minute, tmin.second, tmin.microsecond/1000) # ul = wx.DateTime() # ul.Set(tmax.day, tmax.month, tmax.year, tmax.hour, tmax.minute, tmax.second, tmax.microsecond/1000) # self.date.SetRange(ll, ul) # #class MinDateChoice(DateChoice, ModelListener): # def __init__(self, parent, model): # DateChoice.__init__(self, parent, model) # # def filterChanged(self, what): # if what == "datetime": # self.updating = True # self.fromDateTime(self.model.getMinDateTimeFilter(), True) # self.updating = False # # def changed(self, event): # if self.updating: return # DateChoice.changed(self, event) # # if self.activate.GetValue(): # date = datetime_from_controls(self.date, self.time) # self.model.setMinDateTimeFilter(date) # else: # self.model.setMinDateTimeFilter(None) # #class MaxDateChoice(DateChoice, ModelListener): # def __init__(self, parent, model): # DateChoice.__init__(self, parent, model) # # def filterChanged(self, what): # if what == "datetime": # self.updating = True # self.fromDateTime(self.model.getMaxDateTimeFilter(), True) # self.updating = False # # def changed(self, event): # if self.updating: return # DateChoice.changed(self, event) # # if self.activate.GetValue(): # date = datetime_from_controls(self.date, self.time) # self.model.setMaxDateTimeFilter(date) # else: # self.model.setMaxDateTimeFilter(None) dballe-5.18/provami/provami/AttrDetails.py0000644000175000017500000001641311450147655015554 00000000000000import dballe import wx import wx.grid import traceback from provami.Model import ModelListener from provami.ResultGrid import ResultTable, ResultGrid def val_compare(a, b): isstra = a.info().is_string() isstrb = b.info().is_string() if isstra and isstrb: return cmp(a.enqc(), b.enqc()) elif isstra and not isstrb: return 1 elif not isstra and isstrb: return -1 else: return cmp(a.enqd(), b.enqd()) class AttrMenu(wx.Menu): ACTION_DELETE_CURRENT = wx.NewId() ACTION_DELETE_SELECTED = wx.NewId() def __init__(self): wx.Menu.__init__(self) self.row, self.col, self.data, self.grid = None, None, None, None def clearMenu(self): "Removes all items from the menu" while self.GetMenuItemCount() > 0: item = self.FindItemByPosition(0) self.DestroyItem(item) def getCell(self): return self.row, self.col def getData(self): return self.data def getGrid(self): return self.grid def configureCell(self, grid, row, col, data): "Reconfigure the menu to pop up on the given grid cell" hasVoices = False self.clearMenu() if data is not None: self.Append(AttrMenu.ACTION_DELETE_CURRENT, "Delete value") hasVoices = True selCount = grid.countSelectedRows() if selCount > 1: self.Append(AttrMenu.ACTION_DELETE_SELECTED, "Delete %d selected values" % (selCount)) hasVoices = True; if hasVoices: self.row, self.col, self.data, self.grid = row, col, data, grid # If there are no entries, we do not pop up return hasVoices class AttributeTable(ResultTable): def __init__(self, model): ResultTable.__init__(self) self.model = model self.appendColumn("Variable", \ renderer = lambda x: x.code(), \ sorter = lambda x, y: cmp(x.code(), y.code())) self.appendColumn("Value", \ renderer = lambda x: x.format(), \ sorter = val_compare, editable = True) self.appendColumn("Unit", \ renderer = lambda x: x.info().unit, \ sorter = val_compare) self.appendColumn("Description", \ renderer = lambda x: x.info().desc, \ sorter = val_compare) self.context = None self.varcode = None def SetValue(self, row, col, value): if row >= len(self.items): return if col != 1: return try : var = self.items[row] if var.info().is_string(): var.set(str(value)) else: var.set(float(value)) self.model.updateAttribute(self.context, self.varcode, var) except ValueError: pass def display (self, context, var): count = len(self.items) self.items = [] self.context = context self.varcode = var if context is not None: attrs = dballe.Record() self.model.db.query_attrs(context, var, [], attrs) for var in attrs: self.items.append(dballe.Var(var)) self.sort() view = self.GetView() if view is not None: view.ProcessTableMessage( wx.grid.GridTableMessage(self, wx.grid.GRIDTABLE_NOTIFY_ROWS_DELETED, 0, count)) view.ProcessTableMessage( wx.grid.GridTableMessage(self, wx.grid.GRIDTABLE_NOTIFY_ROWS_APPENDED, len(self.items))) # FIXME: wxwidgets bug workaround to have the # scrollbars to resize # See: http://wiki.wxpython.org/index.cgi/Frequently_Asked_Questions#head-43f3f79f739a4c503584c4fb9620d40bf273e418 view.FitInside() def getRow(self, data): if data is None: return None var = data.code() for row, d in enumerate(self.items): if d.code() == var: return row return None class AttrResults(wx.Frame, ModelListener): def __init__(self, parent, model): wx.Frame.__init__(self, parent, title = "Attributes", size = (400, 400), style=wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE) self.SetSizeHints(500, 300) self.parent = parent self.model = model self.model.registerUpdateListener(self) self.currentID = (None, None) self.statusBar = self.CreateStatusBar() self.dataMenu = AttrMenu() self.dataMenu.Bind(wx.EVT_MENU, self.onDataMenu) self.data = ResultGrid(self) self.data.SetTable(AttributeTable(model)) self.data.setPopupMenu(self.dataMenu) self.data.Bind(ResultGrid.EVT_FLYOVER, self.onFlyOver) self.details = wx.StaticText(self) box = wx.BoxSizer(wx.VERTICAL) box.Add(self.details, 0, wx.EXPAND) box.Add(self.data, 1, wx.EXPAND) self.SetSizerAndFit(box) self.Bind(wx.EVT_CLOSE, self.onClose) def invalidate (self): self.current = self.data.saveCurrent() #self.data.GetTable().clear() def hasData (self, what): if what == "all": self.data.updating = True if self.model.hasVariable(self.currentID[0], self.currentID[1]): self.displayID(self.currentID[0], self.currentID[1]) else: self.displayID(None, None) self.data.restoreCurrent(self.current) self.data.updating = False def displayID(self, context, var): #print "DISPLAY ID", context, var #traceback.print_stack() current = self.data.saveCurrent() if context is None or var is None: self.details.SetLabel("No variable is currently selected") else: self.details.SetLabel("Variable %s in context %d" % (var, context)) self.data.GetTable().display(context, var) self.currentID = (context, var) self.data.restoreCurrent(current) def display(self, record): #print "ATTR Got record", record["context_id"], record["var"] if record is not None: self.displayID(record["context_id"], record["var"]) else: self.displayID(None, None) def onFlyOver(self, event): row, col = event.GetCell() var = event.GetData() if var is not None: info = var.info() info = "%s (%s)" % (info.desc, info.unit) self.statusBar.SetStatusText(info, 0) def onClose(self, event): # Hide the window self.Hide() # Don't destroy the window event.Veto() # Notify parent that we've been closed self.parent.attrHasClosed() def onDataMenu(self, event): if event.GetId() == AttrMenu.ACTION_DELETE_CURRENT: table = self.data.GetTable() context, id = table.context, table.varcode var = self.dataMenu.getData() self.model.deleteAttrs(context, id, (var.code(),)) elif event.GetId() == AttrMenu.ACTION_DELETE_SELECTED: table = self.data.GetTable() context, id = table.context, table.varcode self.model.deleteAttrs(context, id, [v.code() for v in self.data.getSelectedData()]) else: event.Skip() dballe-5.18/provami/provami/QueryPanel.py0000644000175000017500000000433511173330007015404 00000000000000import wx from provami.LevelsChoice import LevelsChoice from provami.ReportChoice import ReportChoice from provami.TimeRangeChoice import TimeRangeChoice from provami.VarNamesChoice import VarNamesChoice from provami.DateChoice import MinDateChoice, MaxDateChoice class QueryPanel(wx.Panel): def __init__(self, parent, model, id=-1): wx.Panel.__init__(self, parent, id) #wx.Panel.__init__(self, parent, id, wx.TAB_TRAVERSAL) self.model = model gbs = wx.GridBagSizer() gbs.Add(wx.StaticText(self, -1, "Variable: "), (0, 0), (1, 1), flag=wx.ALIGN_CENTER_VERTICAL) gbs.Add(VarNamesChoice(self, self.model), (0, 1), (1, 1), flag=wx.EXPAND) gbs.Add(wx.StaticText(self, -1, "Level: "), (1, 0), (1, 1), flag=wx.ALIGN_CENTER_VERTICAL) gbs.Add(LevelsChoice(self, self.model), (1, 1), (1, 1), flag=wx.EXPAND) gbs.Add(wx.StaticText(self, -1, "Time range: "), (2, 0), (1, 1), flag=wx.ALIGN_CENTER_VERTICAL) gbs.Add(TimeRangeChoice(self, self.model), (2, 1), (1, 1), flag=wx.EXPAND) gbs.Add(wx.StaticText(self, -1, "Report: "), (3, 0), (1, 1), flag=wx.ALIGN_CENTER_VERTICAL) gbs.Add(ReportChoice(self, self.model), (3, 1), (1, 1), flag=wx.EXPAND) timePanel = wx.Panel(self) box = wx.BoxSizer(wx.HORIZONTAL) box.Add(wx.StaticText(timePanel, -1, "min: "), 0, flag = wx.ALIGN_CENTER_VERTICAL) box.Add(MinDateChoice(timePanel, model), 1, flag=wx.EXPAND) box.Add(wx.StaticText(timePanel, -1, " max: "), 0, flag = wx.ALIGN_CENTER_VERTICAL) box.Add(MaxDateChoice(timePanel, model), 1, flag=wx.EXPAND) timePanel.SetSizer(box) gbs.Add(wx.StaticText(self, -1, "Time: "), (4, 0), (1, 1), flag=wx.ALIGN_CENTER_VERTICAL) gbs.Add(timePanel, (4, 1), (1, 1), flag=wx.EXPAND) # gbs.Add(wx.StaticText(self, -1, "Min time: "), (4, 0), (1, 1), flag=wx.ALIGN_CENTER_VERTICAL) # gbs.Add(MinDateChoice(self, self.model), (4, 1), (1, 1), flag=wx.EXPAND) # # gbs.Add(wx.StaticText(self, -1, "Max time: "), (5, 0), (1, 1), flag=wx.ALIGN_CENTER_VERTICAL) # gbs.Add(MaxDateChoice(self, self.model), (5, 1), (1, 1), flag=wx.EXPAND) # gbs.Add(wx.StaticText(self, -1, "Timeline: "), (6, 0), (1, 1), flag=wx.ALIGN_CENTER_VERTICAL) # gbs.Add(DateCanvas(self, self.model), (6, 1), (1, 1), flag=wx.EXPAND) gbs.AddGrowableCol(1) self.SetSizerAndFit(gbs) dballe-5.18/provami/provami/Navigator.py0000644000175000017500000003462611553324757015300 00000000000000import wx, os, re, sys from provami.ProgressDisplay import ProgressDisplay from provami.Model import Model, ModelListener, ProgressListener from provami.MapChoice import MapChoice from provami.MapCanvas import MapCanvas from provami.QueryPanel import QueryPanel from provami.LimitChoice import LimitChoice from provami.DataResults import DataPanel from provami.ResultGrid import ResultGrid from provami.AnaDetails import AnaResults from provami.AttrDetails import AttrResults from provami.FilterWindow import FilterWindow class Navigator(wx.Frame, ProgressListener, ModelListener): ACTION_MAP_WINDOW = wx.NewId() ACTION_ANA_WINDOW = wx.NewId() ACTION_ATTR_WINDOW = wx.NewId() ACTION_FILTERS_WINDOW = wx.NewId() ACTION_QUIT = wx.NewId() ACTION_DELETE_SELECTED = wx.NewId() ACTION_DELETE_ORPHANS = wx.NewId() ACTION_EXPORT = wx.NewId() ACTION_REFRESH = wx.NewId() ICON_PROVAMI = "provami_icon" ICON_MAP_WINDOW = "provami_map_window" ICON_ANA_WINDOW = "provami_ana_window" ICON_ATTR_WINDOW = "provami_attr_window" ICON_FILTERS_WINDOW = "provami_filters_window" def __init__(self, parent, model, title): wx.Frame.__init__(self, parent, -1, title, size = (600, 600), style=wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE) self.model = model self.model.registerProgressListener(self) self.model.registerUpdateListener(self) icon = wx.EmptyIcon() icon.CopyFromBitmap(wx.ArtProvider.GetBitmap(Navigator.ICON_PROVAMI, wx.ART_TOOLBAR, (16, 16))) self.SetIcon(icon) self.SetSizeHints(700, 500) # Create progress display manager self.progressDisplay = ProgressDisplay(self, model) # Create toolbar self.tb = self.CreateToolBar(wx.TB_HORIZONTAL | wx.NO_BORDER | wx.TB_FLAT | wx.TB_TEXT) bmp = wx.ArtProvider.GetBitmap(Navigator.ICON_MAP_WINDOW, wx.ART_TOOLBAR, (16,16)) self.tb.AddCheckTool(Navigator.ACTION_MAP_WINDOW, bmp, shortHelp="Open/close map", \ longHelp="Open/close map window") bmp = wx.ArtProvider.GetBitmap(Navigator.ICON_ANA_WINDOW, wx.ART_TOOLBAR, (16,16)) self.tb.AddCheckTool(Navigator.ACTION_ANA_WINDOW, bmp, shortHelp="Open/close pseudoana details", \ longHelp="Open/close pseudoana details window") bmp = wx.ArtProvider.GetBitmap(Navigator.ICON_ATTR_WINDOW, wx.ART_TOOLBAR, (16,16)) self.tb.AddCheckTool(Navigator.ACTION_ATTR_WINDOW, bmp, shortHelp="Open/close attribute details", \ longHelp="Open/close attribute details window") self.Bind(wx.EVT_TOOL, self.onToolClick) bmp = wx.ArtProvider.GetBitmap(Navigator.ICON_FILTERS_WINDOW, wx.ART_TOOLBAR, (16,16)) self.tb.AddCheckTool(Navigator.ACTION_FILTERS_WINDOW, bmp, shortHelp="Open/close extra filters", \ longHelp="Open/close extra filters window") self.Bind(wx.EVT_TOOL, self.onToolClick) self.tb.ToggleTool(Navigator.ACTION_MAP_WINDOW, True) # Create menu bar self.menuBar = wx.MenuBar() mFile = wx.Menu() mFile.Append(Navigator.ACTION_EXPORT, "&Export...", "Export all selected data") mFile.AppendSeparator() mFile.Append(Navigator.ACTION_QUIT, "&Quit", "Quit wxdballe") self.menuBar.Append(mFile, "&File") mView = wx.Menu() mView.Append(Navigator.ACTION_MAP_WINDOW, "&Map", "Map window", wx.ITEM_CHECK) mView.Append(Navigator.ACTION_ANA_WINDOW, "&Pseudoana", "Pseudoana window", wx.ITEM_CHECK) mView.Append(Navigator.ACTION_ATTR_WINDOW, "&Attributes", "Attributes window", wx.ITEM_CHECK) mView.Append(Navigator.ACTION_FILTERS_WINDOW, "&Extra filters", "Extra filters window", wx.ITEM_CHECK) mView.AppendSeparator() mView.Append(Navigator.ACTION_REFRESH, "&Refresh", "Reload data from database") self.menuBar.Append(mView, "&View") self.menuBar.Check(Navigator.ACTION_MAP_WINDOW, True) mEdit = wx.Menu() mEdit.Append(Navigator.ACTION_DELETE_SELECTED, "&Delete displayed values", "Delete all values currently displayed") mEdit.Append(Navigator.ACTION_DELETE_ORPHANS, "&Delete empty stations", "Delete all stations with no data") self.menuBar.Append(mEdit, "&Edit") self.SetMenuBar(self.menuBar) self.Bind(wx.EVT_MENU, self.onToolClick) # Create status bar self.statusBar = self.CreateStatusBar() # Create extra windows self.mapWindow = MapChoice(self, model); self.mapWindow.SetIcon(icon) self.mapWindow.Show() self.mapWindow.Bind(MapCanvas.EVT_CURRENT_STATION_CHANGED, self.onChangedCurrentStation) self.query = QueryPanel(self, model) self.dataPanel = DataPanel(self, model, self.statusBar) self.dataPanel.Bind(ResultGrid.EVT_CHANGED_CURRENT_ROW, self.onChangedCurrentRow) box = wx.BoxSizer(wx.VERTICAL) box.Add(self.query, 0, flag=wx.EXPAND) box.Add(LimitChoice(self, model), 0, flag=wx.EXPAND) box.Add(self.dataPanel, 1, flag=wx.EXPAND) self.SetSizerAndFit(box) self.anaWindow = AnaResults(self, model) self.anaWindow.SetIcon(icon) self.anaWindow.Bind(ResultGrid.EVT_CHANGED_CURRENT_ROW, self.onChangedCurrentRow) #self.dataPanel.results.registerRecordListener(self.anaWindow) self.attrWindow = AttrResults(self, model) self.attrWindow.SetIcon(icon) #self.attrWindow.registerUpdatesWith(self.dataPanel.results) #self.attrWindow.registerUpdatesWith(self.anaWindow) self.filtersWindow = FilterWindow(self, model) self.filtersWindow.SetIcon(icon) self.last_context_id = None self.last_var = None self.updating = False def invalidate(self): self.updating = True def hasData(self, what): # """ # Try to reposition on the previously selected items after a data update # """ if what != "all": return # record = self.dataPanel.results.getFirstRow() # # if self.last_context_id is None or self.last_var is None: # # Position on the first row # record = self.dataPanel.results.getFirstRow() # else: # # Try to get the previously selected item # record = self.model.recordByContextAndVar(self.last_context_id, self.last_var) # if record is None: # # If it's not in the results anymore, then go # # on the first row # record = self.dataPanel.results.getFirstRow() # # if record is not None: # context, var = record["context_id"], record["var"] # print "HDR", context, var # row = self.dataPanel.results.GetTable().rowByContextAndVar(context, var) # self.anaWindow.displayRecord(record) # self.attrWindow.display(record) # self.last_context_id = record["context_id"] # self.last_var = record["var"] # else: # print "HDR none" # self.last_context_id = None # self.last_var = None # self.updating = False def queryError(self, message): cnf = wx.MessageDialog(self, "The DB-ALLe query has failed. The error is: " + message, 'Query failed', wx.OK | wx.ICON_ERROR ) cnf.ShowModal() cnf.Destroy() def onChangedCurrentStation(self, event): if self.updating: return "Handle change of currently selected station in the map" id = event.GetStation() self.anaWindow.displayID(id) def onChangedCurrentRow(self, event): if self.updating: return self.updating = True record = event.GetData() self.anaWindow.displayRecord(record) self.attrWindow.display(record) self.updating = False def mapHasClosed(self): self.tb.ToggleTool(Navigator.ACTION_MAP_WINDOW, False) self.menuBar.Check(Navigator.ACTION_MAP_WINDOW, False) def anaHasClosed(self): self.tb.ToggleTool(Navigator.ACTION_ANA_WINDOW, False) self.menuBar.Check(Navigator.ACTION_ANA_WINDOW, False) def attrHasClosed(self): self.tb.ToggleTool(Navigator.ACTION_ATTR_WINDOW, False) self.menuBar.Check(Navigator.ACTION_ATTR_WINDOW, False) def filtersHasClosed(self): self.tb.ToggleTool(Navigator.ACTION_FILTERS_WINDOW, False) self.menuBar.Check(Navigator.ACTION_FILTERS_WINDOW, False) def onToolClick(self, event): if event.GetId() == Navigator.ACTION_MAP_WINDOW: state = self.mapWindow.IsShown() self.tb.ToggleTool(Navigator.ACTION_MAP_WINDOW, not state) self.menuBar.Check(Navigator.ACTION_MAP_WINDOW, not state) self.mapWindow.Show(not state) elif event.GetId() == Navigator.ACTION_ANA_WINDOW: state = self.anaWindow.IsShown() self.tb.ToggleTool(Navigator.ACTION_ANA_WINDOW, not state) self.menuBar.Check(Navigator.ACTION_ANA_WINDOW, not state) self.anaWindow.Show(not state) elif event.GetId() == Navigator.ACTION_ATTR_WINDOW: state = self.attrWindow.IsShown() self.tb.ToggleTool(Navigator.ACTION_ATTR_WINDOW, not state) self.menuBar.Check(Navigator.ACTION_ATTR_WINDOW, not state) self.attrWindow.Show(not state) elif event.GetId() == Navigator.ACTION_FILTERS_WINDOW: state = self.filtersWindow.IsShown() self.tb.ToggleTool(Navigator.ACTION_FILTERS_WINDOW, not state) self.menuBar.Check(Navigator.ACTION_FILTERS_WINDOW, not state) self.filtersWindow.Show(not state) elif event.GetId() == Navigator.ACTION_REFRESH: self.model.update() elif event.GetId() == Navigator.ACTION_QUIT: self.Destroy() elif event.GetId() == Navigator.ACTION_DELETE_SELECTED: self.model.deleteCurrent() elif event.GetId() == Navigator.ACTION_DELETE_ORPHANS: self.model.deleteOrphans() elif event.GetId() == Navigator.ACTION_EXPORT: # dlg = wx.FileDialog( # self, message="Save file as...", defaultDir=os.getcwd(), # defaultFile="", style=wx.SAVE # ) wildcards="According to file extension|*|BUFR optimal template (*.bufr)|*.bufr|BUFR generic template (*.bufr)|*.bufr|CREX (*.crex)|*.crex|Comma Separated Values (*.csv)|*.csv" if Model.HAS_RPY: wildcards += "|GNU R data file (*.Rdata)|*.Rdata" dlg = wx.FileDialog( self, message="Save file as...", defaultDir=os.getcwd(), #defaultFile="", wildcard="According to file extension|*|BUFR optimal template (*.bufr)|*.bufr|BUFR generic template (*.bufr)|*.bufr|CREX (*.crex)|*.crex|Comma Separated Values (*.csv)|*.csv|GNU R data file (*.Rdata)|*.Rdata|Pickled volNd Python objects (*.volnd)|*.volnd", style=wx.SAVE defaultFile="", wildcard=wildcards, style=wx.SAVE ) # Show the dialog and retrieve the user response. If it is the OK response, # process the data. path = None eidx = 0 if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() eidx = dlg.GetFilterIndex() # # Check if it exists # if os.access(path, os.F_OK): # cnf = wx.MessageDialog(self, # path + " already exists. Would you like to overwrite it?", # 'File exists', # wx.OK | wx.ICON_INFORMATION | wx.YES_NO # ) # if cnf.ShowModal() != wx.ID_OK: # path = None # cnf.Destroy() dlg.Destroy() if path is not None: # Determine file type by its extension, defaulting to bufr encoding = "BUFR" # According to file extension if eidx == 0: if re.search('.crex$', path, re.IGNORECASE): encoding = "CREX" elif re.search('.csv$', path, re.IGNORECASE): encoding = "CSV" elif re.search('.Rdata$', path, re.IGNORECASE): encoding = "R" # BUFR optimal template (*.bufr) elif eidx == 1: encoding = "BUFR" # BUFR generic template (*.bufr) elif eidx == 2: encoding = "gBUFR" # CREX (*.crex) elif eidx == 3: encoding = "CREX" # Comma Separated Values (*.csv) elif eidx == 4: encoding = "CSV" elif eidx == 5: encoding = "R" #elif eidx == 6: # encoding = "VOLND" # Add extension if missing if os.path.basename(path).find(".") == -1: extensions = {"BUFR": ".bufr", "gBUFR": ".bufr", "CREX": ".crex", "CSV": ".csv", "R": ".Rdata"} path = path + extensions.get(encoding, "") pdlg = None try: try: pdlg = wx.ProgressDialog("Saving...", "Saving file " + path + "...", maximum=100, parent=self, style=wx.PD_APP_MODAL) wx.Yield() self.model.exportToFile(str(path), encoding) # It seems that it never returns from this function #pdlg.Update(100, "Done.") except RuntimeError: error = ": ".join(map(str, sys.exc_info()[:2])) dlg = wx.MessageDialog(self, "Saving " + path + " failed: " + error, 'Error saving ' + path, wx.OK | wx.ICON_ERROR | wx.ICON_INFORMATION ) dlg.ShowModal() print >>sys.stderr, error dlg.Destroy() finally: if pdlg: pdlg.Destroy() else: event.Skip() dballe-5.18/provami/provami/IdentChoice.py0000644000175000017500000000162311450143077015501 00000000000000import wx from provami.QueryChoice import QueryChoice class IdentChoice(QueryChoice): def __init__(self, parent, model): QueryChoice.__init__(self, parent, model, "stations", "idents") self.hasData("idents") def readFilterFromRecord(self, rec): mobile = rec.get("mobile", None) ident = rec.get("ident", None) if mobile is None: return None if ident is None: return "__fixed__" return ident def readOptions(self): res = [] res.append(("All stations", None)) for v in self.model.idents(): if v is None: res.append(("Only fixed stations", "__fixed__")) else: res.append((v, v)) return res def selected(self, event): if self.updating: return sel = self.GetClientData(self.GetSelection()) if sel is None: self.model.setIdentFilter(None, None) elif sel == "__fixed__": self.model.setIdentFilter(False, None) else: self.model.setIdentFilter(True, sel) dballe-5.18/provami/provami/ProvamiArtProvider.py0000644000175000017500000000254011173330007017112 00000000000000import wx from provami.Navigator import Navigator from provami.Model import filePath from provami.MapChoice import MapChoice class ProvamiArtProvider(wx.ArtProvider): def __init__(self): wx.ArtProvider.__init__(self) def CreateBitmap(self, artid, client, size): bmp = wx.NullBitmap if artid == Navigator.ICON_PROVAMI: bmp = wx.Bitmap(filePath("icon-provami.png"), wx.BITMAP_TYPE_PNG) elif artid == Navigator.ICON_MAP_WINDOW: bmp = wx.Bitmap(filePath("icon-map-window.png"), wx.BITMAP_TYPE_PNG) elif artid == Navigator.ICON_ANA_WINDOW: bmp = wx.Bitmap(filePath("icon-ana-window.png"), wx.BITMAP_TYPE_PNG) elif artid == Navigator.ICON_ATTR_WINDOW: bmp = wx.Bitmap(filePath("icon-attr-window.png"), wx.BITMAP_TYPE_PNG) elif artid == Navigator.ICON_FILTERS_WINDOW: bmp = wx.Bitmap(filePath("icon-filters-window.png"), wx.BITMAP_TYPE_PNG) elif artid == MapChoice.ICON_MAP_MOVE: bmp = wx.Bitmap(filePath("icon-map-move.png"), wx.BITMAP_TYPE_PNG) elif artid == MapChoice.ICON_MAP_SELECT_AREA: bmp = wx.Bitmap(filePath("icon-map-select-area.png"), wx.BITMAP_TYPE_PNG) elif artid == MapChoice.ICON_MAP_SELECT_STATION: bmp = wx.Bitmap(filePath("icon-map-select-station.png"), wx.BITMAP_TYPE_PNG) elif artid == MapChoice.ICON_MAP_SELECT_IDENT: bmp = wx.Bitmap(filePath("icon-map-select-ident.png"), wx.BITMAP_TYPE_PNG) return bmp dballe-5.18/provami/provami/DataMenu.py0000644000175000017500000000507411450146701015022 00000000000000import wx from provami.Model import * class DataMenu(wx.Menu): ACTION_SELECT_SAME_ANA_ID = wx.NewId() ACTION_SELECT_SAME_IDENT = wx.NewId() ACTION_SELECT_SAME_LEVEL = wx.NewId() ACTION_SELECT_SAME_TRANGE = wx.NewId() ACTION_SELECT_SAME_VAR = wx.NewId() ACTION_SELECT_SAME_REPCOD = wx.NewId() ACTION_SELECT_SAME_DATEMIN = wx.NewId() ACTION_SELECT_SAME_DATEMAX = wx.NewId() ACTION_DELETE_CURRENT = wx.NewId() ACTION_DELETE_SELECTED = wx.NewId() def __init__(self): wx.Menu.__init__(self) self.row, self.col, self.data, self.grid = None, None, None, None def clearMenu(self): "Removes all items from the menu" while self.GetMenuItemCount() > 0: item = self.FindItemByPosition(0) self.DestroyItem(item) def getCell(self): return self.row, self.col def getData(self): return self.data def getGrid(self): return self.grid def configureCell(self, grid, row, col, data): "Reconfigure the menu to pop up on the given grid cell" hasVoices = False self.clearMenu() if data is not None: isAnaContext = data["year"] == 1000 self.Append(DataMenu.ACTION_SELECT_SAME_ANA_ID, "Select station %d (lat %f lon %f)" % (data["ana_id"], data["lat"], data["lon"])) ident = data.get("ident", None) if ident is not None: self.Append(DataMenu.ACTION_SELECT_SAME_IDENT, "Select all stations " + ident) else: self.Append(DataMenu.ACTION_SELECT_SAME_IDENT, "Select all fixed stations") if not isAnaContext: self.Append(DataMenu.ACTION_SELECT_SAME_LEVEL, "Select level " + str(data["level"])) self.Append(DataMenu.ACTION_SELECT_SAME_TRANGE, "Select time range " + str(data["trange"])) self.Append(DataMenu.ACTION_SELECT_SAME_VAR, "Select variable type " + data["var"]) self.Append(DataMenu.ACTION_SELECT_SAME_REPCOD, "Select report type " + data["rep_memo"]) if not isAnaContext: mindate = datetimeFromRecord(data, DateUtils.EXACT) self.Append(DataMenu.ACTION_SELECT_SAME_DATEMIN, "Select minimum date " + str(mindate)) maxdate = datetimeFromRecord(data, DateUtils.EXACT) self.Append(DataMenu.ACTION_SELECT_SAME_DATEMAX, "Select maximum date " + str(maxdate)) self.AppendSeparator() self.Append(DataMenu.ACTION_DELETE_CURRENT, "Delete value") hasVoices = True selCount = grid.countSelectedRows() if selCount > 1: #if hasVoices: mFile.AppendSeparator() self.Append(DataMenu.ACTION_DELETE_SELECTED, "Delete %d selected values" % (selCount)) hasVoices = True; if hasVoices: self.row, self.col, self.data, self.grid = row, col, data, grid # If there are no entries, we do not pop up return hasVoices dballe-5.18/provami/provami/LevelsChoice.py0000644000175000017500000000161511450144611015664 00000000000000import wx import dballe from provami.QueryChoice import QueryChoice def intormiss(x): if x == dballe.MISSING_INT: return "-" else: return "%d" % x class LevelsChoice(QueryChoice): def __init__(self, parent, model): QueryChoice.__init__(self, parent, model, "level", "levels") self.hasData("levels") def readFilterFromRecord(self, rec): return self.model.getLevelFilter(rec) def readOptions(self): res = [] res.append(("All levels", None)) for lev in self.model.levels(): res.append((",".join([intormiss(x) for x in lev]), lev)) return res def selected(self, event): if self.updating: return sel = self.GetSelection() lev = self.GetClientData(sel) if lev is None: self.model.setLevelFilter(None) else: self.model.setLevelFilter(lev) dballe-5.18/provami/provami/ProgressDisplay.py0000644000175000017500000000140211450143077016450 00000000000000import wx from provami.Model import Model, ProgressListener class ProgressDisplay(ProgressListener): def __init__(self, parent, model): self.parent = parent self.model = model self.model.registerProgressListener(self) self.dlg = None def progress(self, perc, text): print "%d%%: %s" % (perc, text) if perc == 100: if self.dlg is not None: self.dlg.Destroy() self.dlg = None else: if self.dlg is None: self.dlg = wx.ProgressDialog("Updating data", text, maximum = 100, parent = self.parent, style = wx.PD_CAN_ABORT | wx.PD_APP_MODAL | wx.PD_ELAPSED_TIME | wx.PD_ESTIMATED_TIME | wx.PD_REMAINING_TIME) if not self.dlg.Update(perc, text): self.model.cancelUpdate() wx.Yield() dballe-5.18/provami/provami/QueryChoice.py0000644000175000017500000000400411173330007015530 00000000000000import wx from provami.Model import ModelListener class QueryChoice(wx.Choice, ModelListener): def __init__(self, parent, model, filterTag, dataTag): wx.Choice.__init__(self, parent) self.model = model self.model.registerUpdateListener(self) # tag to identify the model filter changes to which we react self.filterTag = filterTag # tag to identify the data updates to which we react self.dataTag = dataTag self.Bind(wx.EVT_CHOICE, self.selected, self) self.updating = False self.invalidate() def readFilterFromRecord(self, record): """ Read a record with query parameters and return its userdata equivalent for what concernes this field. """ return None def readOptions(self): """ Get an array of (label, data) tuples corresponding to the options for the Choice """ return [] def selected(self, event): pass def filterChanged(self, what): if what == self.filterTag: self.updating = True sel = self.readFilterFromRecord(self.model.filter) for i in range(self.GetCount()): if self.GetClientData(i) == sel: self.Select(i) break self.updating = False def invalidate(self): self.Enable(False) def hasData(self, what): if what == self.dataTag: current = self.readFilterFromRecord(self.model.filter) active = self.readFilterFromRecord(self.model.activeFilter) options = self.readOptions() selected = 0 count = 0 self.Clear() for label, data in options: if data == active: label = label + " (*)" if current == data: selected = count self.Append(label, data) count = count + 1 self.Select(selected) self.Enable(True) dballe-5.18/provami/provami/Paths.py.in0000644000175000017500000000002411173330007014772 00000000000000DATADIR="@DATADIR@" dballe-5.18/provami/provami/TimeRangeChoice.py0000644000175000017500000000164211450144610016304 00000000000000import wx import dballe from provami.QueryChoice import QueryChoice def intormiss(x): if x == dballe.MISSING_INT: return "-" else: return "%d" % x class TimeRangeChoice(QueryChoice): def __init__(self, parent, model): QueryChoice.__init__(self, parent, model, "trange", "tranges") self.hasData("tranges") def readFilterFromRecord(self, rec): return self.model.getTimeRangeFilter(rec) def readOptions(self): res = [] res.append(("All time ranges", None)) for tr in self.model.timeranges(): res.append((",".join([intormiss(x) for x in tr]), tr)) return res def selected(self, event): if self.updating: return sel = self.GetSelection() tr = self.GetClientData(sel) if tr is None: self.model.setTimeRangeFilter(None) else: self.model.setTimeRangeFilter(tr) dballe-5.18/provami/provami/__init__.py0000644000175000017500000000000011173330007015037 00000000000000dballe-5.18/provami/provami/ReportChoice.py0000644000175000017500000000110011450141266015675 00000000000000import wx from provami.QueryChoice import QueryChoice class ReportChoice(QueryChoice): def __init__(self, parent, model): QueryChoice.__init__(self, parent, model, "repinfo", "repinfo") self.hasData("repinfo") def readFilterFromRecord(self, record): return record.get("rep_cod", None) def readOptions(self): res = [] res.append(("All reports", None)) for (cod, memo) in self.model.reports(): res.append((memo, cod)) return res def selected(self, event): if self.updating: return self.model.setReportFilter(self.GetClientData(self.GetSelection())) dballe-5.18/provami/provami/QueryButton.py0000644000175000017500000000100711173330007015611 00000000000000import wx from provami.Model import ModelListener class QueryButton(wx.Button, ModelListener): def __init__(self, parent, model, id=-1): wx.Button.__init__(self, parent, id, "Query") self.model = model self.model.registerUpdateListener(self) self.Enable(model.filterDirty) self.Bind(wx.EVT_BUTTON, self.onClick) def filterDirty(self, isDirty): self.Enable(isDirty) def hasData(self, what): self.Enable(self.model.filterDirty) def onClick(self, event): self.Enable(False) self.model.update() dballe-5.18/provami/provami/AnaDetails.py0000644000175000017500000002101311450145171015320 00000000000000import dballe import wx import wx.grid from provami.Model import ModelListener from provami.ResultGrid import ResultTable, ResultGrid from provami.DataMenu import DataMenu def val_compare(a, b): vara = a.getvar(a["var"]) varb = b.getvar(b["var"]) isstra = vara.info().is_string() isstrb = varb.info().is_string() if isstra and isstrb: return cmp(vara.enqc(), varb.enqc()) elif isstra and not isstrb: return 1 elif not isstra and isstrb: return -1 else: return cmp(vara.enqd(), varb.enqd()) class AnaTable(ResultTable): def __init__(self, model): ResultTable.__init__(self) self.model = model self.appendColumn("Network", \ renderer = lambda x: x["rep_memo"], \ sorter = lambda x, y: cmp(x["rep_memo"], y["rep_memo"])) self.appendColumn("Variable", \ renderer = lambda x: x["var"], \ sorter = lambda x, y: cmp(x["var"], y["var"])) self.appendColumn("Value", \ renderer = lambda x: x.getvar(x["var"]).format(), \ sorter = val_compare, editable = True) self.appendColumn("Unit", \ renderer = lambda x: x.getvar(x["var"]).info().unit, \ sorter = val_compare) self.appendColumn("Description", \ renderer = lambda x: x.getvar(x["var"]).info().desc, \ sorter = val_compare) def SetValue(self, row, col, value): if row >= len(self.items): return if col != 2: return try : record = self.items[row] varcode = record["var"] var = record.getvar(varcode) if var.info().is_string(): record[varcode] = str(value) else: record[varcode] = float(value) self.model.writeRecord(record) except ValueError: pass def display (self, id): count = len(self.items) self.items = [] if id is not None: query = dballe.Record() query["ana_id"] = id query.set_ana_context() del query["rep_cod"] for record in self.model.db.query_data(query): self.items.append(record.copy()) self.sort() view = self.GetView() if view is not None: view.ProcessTableMessage( wx.grid.GridTableMessage(self, wx.grid.GRIDTABLE_NOTIFY_ROWS_DELETED, 0, count)) view.ProcessTableMessage( wx.grid.GridTableMessage(self, wx.grid.GRIDTABLE_NOTIFY_ROWS_APPENDED, len(self.items))) # FIXME: wxwidgets bug workaround to have the # scrollbars to resize # See: http://wiki.wxpython.org/index.cgi/Frequently_Asked_Questions#head-43f3f79f739a4c503584c4fb9620d40bf273e418 view.FitInside() def getRow(self, data): if data is None: return None ana_id = data["ana_id"] rep_cod = data["rep_cod"] for row, d in enumerate(self.items): if d["ana_id"] == ana_id and d["rep_cod"] == rep_cod: return row return None class AnaResults(wx.Frame, ModelListener): def __init__(self, parent, model): wx.Frame.__init__(self, parent, title = "Pseudoana details", size = (400, 400), style=wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE) self.SetSizeHints(500, 300) self.parent = parent self.model = model self.model.registerUpdateListener(self) self.currentID = None self.statusBar = self.CreateStatusBar() self.dataMenu = DataMenu() self.dataMenu.Bind(wx.EVT_MENU, self.onDataMenu) self.data = ResultGrid(self) self.data.SetTable(AnaTable(model)) self.data.setPopupMenu(self.dataMenu) self.data.Bind(ResultGrid.EVT_FLYOVER, self.onFlyOver) detailsPanel = wx.Panel(self) sizer = wx.GridBagSizer() self.st_lat = wx.StaticText(detailsPanel) self.st_lon = wx.StaticText(detailsPanel) self.st_type = wx.StaticText(detailsPanel) sizer.Add(wx.StaticText(detailsPanel, -1, "Latitude: "), (0, 0), (1, 1), flag=wx.ALIGN_CENTER_VERTICAL) sizer.Add(self.st_lat, (0, 1), (1, 1), flag = wx.ALIGN_CENTER_VERTICAL) sizer.Add(wx.StaticText(detailsPanel, -1, "Longitude: "), (1, 0), (1, 1), flag=wx.ALIGN_CENTER_VERTICAL) sizer.Add(self.st_lon, (1, 1), (1, 1), flag = wx.ALIGN_CENTER_VERTICAL) sizer.Add(wx.StaticText(detailsPanel, -1, "Type: "), (2, 0), (1, 1), flag=wx.ALIGN_CENTER_VERTICAL) sizer.Add(self.st_type, (2, 1), (1, 1), flag = wx.ALIGN_CENTER_VERTICAL) detailsPanel.SetSizer(sizer) box = wx.BoxSizer(wx.VERTICAL) box.Add(detailsPanel, 1, wx.EXPAND) box.Add(self.data, 3, wx.EXPAND) self.SetSizerAndFit(box) self.Bind(wx.EVT_CLOSE, self.onClose) def invalidate (self): self.current = self.data.saveCurrent() #self.data.GetTable().clear() def filterChanged(self, what): if what == "station": id = self.model.filter.get("ana_id", None) if id is not None: self.displayID(id); def hasData (self, what): if what == "all": self.data.updating = True if self.model.hasStation(self.currentID): self.displayID(self.currentID) else: self.displayID(None) self.data.restoreCurrent(self.current) self.data.updating = False def onFlyOver(self, event): row, col = event.GetCell() record = event.GetData() if record is not None: info = record.getvar(record["var"]).info() info = "%s (%s)" % (info.desc, info.unit) self.statusBar.SetStatusText(info, 0) def displayID(self, id): current = self.data.saveCurrent() if id is None: self.data.GetTable().display(None) self.st_lat.SetLabel("") self.st_lon.SetLabel("") self.st_type.SetLabel("") else: self.data.GetTable().display(id) id, lat, lon, ident = self.model.stationByID(id) self.st_lat.SetLabel(str(lat)) self.st_lon.SetLabel(str(lon)) if ident is None: self.st_type.SetLabel("fixed station") else: self.st_type.SetLabel("mobile station " + ident) self.currentID = id #self.data.restoreCurrent(current) def displayRecord(self, record): current = self.data.saveCurrent() if record is None: self.data.GetTable().display(None) self.st_lat.SetLabel("") self.st_lon.SetLabel("") self.st_type.SetLabel("") self.currentID = None else: self.currentID = record["ana_id"] self.data.GetTable().display(self.currentID) self.st_lat.SetLabel(str(record["lat"])) self.st_lon.SetLabel(str(record["lon"])) ident = record.get("ident", None) if ident is None: self.st_type.SetLabel("fixed station") else: self.st_type.SetLabel("mobile station " + ident) self.data.restoreCurrent(current) def onClose(self, event): # Hide the window self.Hide() # Don't destroy the window event.Veto() # Notify parent that we've been closed self.parent.anaHasClosed() def onDataMenu(self, event): if event.GetId() == DataMenu.ACTION_SELECT_SAME_ANA_ID: record = self.dataMenu.getData() self.model.setStationFilter(record["ana_id"]) elif event.GetId() == DataMenu.ACTION_SELECT_SAME_IDENT: record = self.dataMenu.getData() ident = record["ident"] self.model.setIdentFilter(ident is not None, ident) elif event.GetId() == DataMenu.ACTION_SELECT_SAME_REPCOD: record = self.dataMenu.getData() self.model.setReportFilter(record["rep_cod"]) elif event.GetId() == DataMenu.ACTION_DELETE_CURRENT: record = self.dataMenu.getData() context, id = record["context_id"], record["var"] self.model.deleteValues(((context, id),)) elif event.GetId() == DataMenu.ACTION_DELETE_SELECTED: grid = self.dataMenu.getGrid() self.model.deleteValues([(r["context_id"], r["var"]) for r in grid.getSelectedData()]) else: event.Skip() dballe-5.18/provami/provami/MapCanvas.py0000644000175000017500000004663511450143257015210 00000000000000import string import wx from provami.Model import Model, ModelListener, TTracer class MapCanvasListener: def modeChanged (self, oldMode, mode): pass class MapCanvas(wx.Window, ModelListener): class MapCanvasEvent(wx.PyCommandEvent): def __init__(self, eventType, id): wx.PyCommandEvent.__init__(self, eventType, id) self.modeChange = None self.station = None def SetStation(self, id): self.station = id def GetStation(self): return self.station def SetModeChange(self, oldmode, newmode): self.modeChange = (oldmode, newmode) def GetModeChange(self): if self.modeChange is None: return None, None else: return self.modeChange MODE_MOVE = 0 MODE_SELECT_AREA = 1 MODE_SELECT_STATION = 2 MODE_SELECT_IDENT = 3 # Create custom events wxEVT_MODE_CHANGED = wx.NewEventType() EVT_MODE_CHANGED = wx.PyEventBinder(wxEVT_MODE_CHANGED, 0) wxEVT_CURRENT_STATION_CHANGED = wx.NewEventType() EVT_CURRENT_STATION_CHANGED = wx.PyEventBinder(wxEVT_CURRENT_STATION_CHANGED, 0) def __init__(self, parent, model): wx.Window.__init__(self, parent, style=wx.FULL_REPAINT_ON_RESIZE) # Hook with the model self.model = model self.model.registerUpdateListener(self) # Initialize handling of listeners self.listeners = [] # Initialize cached bitmaps self.shoreLines = [] self.shoreLinesImage = None self.stationsImage = None # Initialize the map displacement (in lat/lon values) self.latcentre = 0 self.loncentre = 0 # Initialize bounding box of visible area (in lat/lon values) self.latwidth = 180.0 self.lonwidth = 360.0 # Initialize mouse tracking structures self.mouseDown = False # Interaction mode: # 0: move # 1: select area # 2: select station self.mode = None self.setMode(MapCanvas.MODE_MOVE) # Initialize focus management structures self.previousFocus = None # Currently selected station, if only one station is selected self.selectedID = None # Bind events self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_SIZE, self.OnResize) self.Bind(wx.EVT_MOTION, self.OnMouseMoved) self.Bind(wx.EVT_MOUSEWHEEL, self.OnMouseWheel) self.Bind(wx.EVT_LEFT_DOWN, self.OnMouseDown) self.Bind(wx.EVT_LEFT_UP, self.OnMouseUp) self.Bind(wx.EVT_CHAR, self.OnKeyChar) self.Bind(wx.EVT_ENTER_WINDOW, self.OnEnterWindow) self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveWindow) # Zoom the empty map to show the whole world self.showArea(-180, -90, 180, 90) # Schedule a zoom to fit all stations on the next model update self.neverZoomed = True #self.zoomToFit() def distanceToWorld (self, p): "Map distances from pixel units to world units" return (p[0] / self.xscale, -p[1] / self.yscale) def coordsToWorld (self, p): "Map coordinates from pixel space to world space" return ((p[0] - self.xoffset) / self.xscale - 180, -((p[1] - self.yoffset) / self.yscale) + 90) def distanceToPixels (self, p): "Map distances from world units to pixel units" return (p[0] * self.xscale, -p[1] * self.yscale) def coordsToPixels (self, p): "Map coordinates from world space to pixel space" return ((p[0] + 180) * self.xscale + self.xoffset, (-(p[1]-90)) * self.yscale + self.yoffset) def segmentToPixels (self, seg): "Convert a segment in world space to a segment in pixel space" res = [] for i in seg: res.append(self.coordsToPixels(i)) return res def zoom (self, factor): """ Zoom in or out according to the given factor. The resulting size of the displayed world is the previous size multiplied by the factor. For example, a factor of 1.2 zooms out 20%, while a factor of 0.8 zooms in 20%. """ if factor == 1: return self.latwidth = self.latwidth * factor self.lonwidth = self.lonwidth * factor # Maintain the map magnification within reasonable values if self.latwidth < 1 or self.lonwidth < 1: self.latwidth, self.lonwidth = 1, 2 if self.latwidth > 180 or self.lonwidth > 360: self.latwidth, self.lonwidth = 180, 360 self.resize() self.Refresh() def showArea (self, lonmin, latmin, lonmax, latmax): "Zoom to fit the given area and recentre in the middle of it" self.latwidth = (latmax - latmin) * 1.2 self.lonwidth = (lonmax - lonmin) * 1.2 if self.latwidth < 1: self.latwidth = 1 if self.lonwidth < 1: self.lonwidth = 1 if self.latwidth * 2 > self.lonwidth: self.lonwidth = self.latwidth * 2 else: self.latwidth = self.lonwidth / 2 self.recentre((lonmax + lonmin) / 2, (latmax + latmin) / 2) self.resize() self.Refresh() def zoomToFit (self): "Zoom the image to fit all the stations" lonmin, latmin, lonmax, latmax = self.stationsBoundingBox() self.showArea(lonmin, latmin, lonmax, latmax) def zoomToFitSelection (self): "Zoom the image to fit all the stations" sel_id = self.model.filter.get("ana_id", None) latmin = self.model.filter.get("latmin", None) latmax = self.model.filter.get("latmax", None) lonmin = self.model.filter.get("lonmin", None) lonmax = self.model.filter.get("lonmax", None) if sel_id is not None: id, lat, lon, ident = self.model.stationByID(sel_id) if id is not None: self.showArea(lon - 2, lat - 2, lon + 2, lat + 2) elif latmin is not None and lonmin is not None and latmax is not None and lonmax is not None: self.showArea(lonmin, latmin, lonmax, latmax) def recentre (self, lon, lat): "Centre the map on the given coordinates" if self.loncentre == lon and self.latcentre == lat: return self.loncentre = lon self.latcentre = lat self.resize() self.Refresh() def centreOnSelection (self): sel_id = self.model.filter.get("ana_id", None) sel_latmin = self.model.filter.get("latmin", None) sel_latmax = self.model.filter.get("latmax", None) sel_lonmin = self.model.filter.get("lonmin", None) sel_lonmax = self.model.filter.get("lonmax", None) if sel_id is not None: id, lat, lon, ident = self.model.stationByID(sel_id) if id is not None: self.recentre(lon, lat) elif sel_latmin is not None and sel_lonmin is not None and sel_latmax is not None and sel_lonmax is not None: self.recentre((sel_lonmax + sel_lonmin) /2, (sel_latmax + sel_latmin) / 2) else: lonmin, latmin, lonmax, latmax = self.stationBoundingBox() self.recentre((lonmax + lonmin) /2, (latmax + latmin) / 2) def pan (self, xfac, yfac): """ Pan the image of an amount proportional to the given factors. For example, pan(0, -0.2) moves the image up of 20% its size. """ (width, height) = self.GetClientSizeTuple() worldStride = self.distanceToWorld((width * xfac, height * yfac)) self.recentre(self.loncentre + worldStride[0], self.latcentre + worldStride[1]) def panTowards (self, lon, lat, maxfactor = 0.1): dlon = lon - self.loncentre dlat = lat - self.latcentre if abs(dlon) > self.lonwidth * maxfactor: newlon = self.loncentre + self.lonwidth * maxfactor * dlon/abs(dlon) else: newlon = lon if abs(dlat) > self.latwidth * maxfactor: newlat = self.latcentre + self.latwidth * maxfactor * dlat/abs(dlat) else: newlat = lat self.recentre(newlon, newlat) #print "panTowards", lon, lat, "->", newlon, newlat def nearestPoint(self, plon, plat): mindist = 500000.0; cand = None for (id, lat, lon, ident) in self.model.stations(): x = lon - plon y = lat - plat dist = x*x + y*y if mindist > dist: mindist = dist cand = (id, lat, lon, ident) return cand def selectNearest(self, lon, lat): id, lat, lon, ident = self.nearestPoint(lon, lat) self.model.setStationFilter(id) return id, lat, lon, ident def selectClosedArea(self, lon1, lat1, lon2, lat2): #print "selectarea", lon1, lat1, lon2, lat2 #print "filter", min(lat1, lat2), max(lat1, lat2), min(lon1, lon2), max(lon1, lon2) self.model.setAreaFilter(min(lat1, lat2), max(lat1, lat2), min(lon1, lon2), max(lon1, lon2)) def getCurrentStation(self): """ Return the ID of the currently selected station. If there are no stations currently selected, or if there is more than one station currently selected, returns None """ return self.selectedID def getMode(self): "Return the current interaction mode" return self.mode def setMode(self, mode): if mode == self.mode: return oldMode = self.mode self.mode = mode if self.mode == MapCanvas.MODE_MOVE: # Pan mode self.SetCursor(wx.StockCursor(wx.CURSOR_SIZENESW)) elif self.mode == MapCanvas.MODE_SELECT_AREA: # Select area mode self.SetCursor(wx.StockCursor(wx.CURSOR_CROSS)) elif self.mode == MapCanvas.MODE_SELECT_STATION: # Select station mode self.SetCursor(wx.StockCursor(wx.CURSOR_HAND)) elif self.mode == MapCanvas.MODE_SELECT_IDENT: # Select ident mode self.SetCursor(wx.StockCursor(wx.CURSOR_HAND)) # Notify mode change to listeners e = MapCanvas.MapCanvasEvent(MapCanvas.wxEVT_MODE_CHANGED, self.GetId()) e.SetEventObject(self) e.SetModeChange(oldMode, self.mode) self.GetEventHandler().ProcessEvent(e) def stationsBoundingBox (self): latmin = 360 lonmin = 360 latmax = -360 lonmax = -360 for (id, lat, lon, ident) in self.model.stations(): if lat < latmin: latmin = lat if lat > latmax: latmax = lat if lon < lonmin: lonmin = lon if lon > lonmax: lonmax = lon return (lonmin, latmin, lonmax, latmax) def OnEnterWindow (self, event): self.previousFocus = wx.Window_FindFocus() self.SetFocus() def OnLeaveWindow (self, event): if self.previousFocus is not None: self.previousFocus.SetFocus() self.previousFocus = None def OnKeyChar (self, event): "Handle panning and zooming in response to key events" c = event.GetKeyCode() if c == ord('+'): # Zoom in self.zoom(0.8) elif c == ord('-'): # Zoom out self.zoom(1.2) elif c == ord('c'): # Centre on selection self.centreOnSelection() elif c == ord('Z'): # Zoom to fit stations self.zoomToFit() elif c == ord('z'): # Zoom to fit selection self.zoomToFitSelection() elif c == wx.WXK_F1: # Switch to move mode self.setMode(MapCanvas.MODE_MOVE) elif c == wx.WXK_F2: # Switch to select area mode self.setMode(MapCanvas.MODE_SELECT_AREA) elif c == wx.WXK_F3: # Switch to select station mode self.setMode(MapCanvas.MODE_SELECT_STATION) elif c == wx.WXK_F4: # Switch to select ident mode self.setMode(MapCanvas.MODE_SELECT_IDENT) elif c == wx.WXK_UP: # Pan up self.pan(0, -0.1) elif c == wx.WXK_DOWN: # Pan down self.pan(0, 0.1) elif c == wx.WXK_LEFT: # Pan left self.pan(-0.1, 0) elif c == wx.WXK_RIGHT: # Pan right self.pan(0.1, 0) def OnMouseWheel (self, event): "Handle zooming in response to mouse wheel events" fac = event.GetWheelRotation() / event.GetWheelDelta() # Pan towards the wheel point # (disabled because it was confusing) #wplon, wplat = self.coordsToWorld(tuple(event.GetPosition())) #self.panTowards(wplon, wplat, 0.05) #self.loncentre, self.latcentre = if fac > 0: self.zoom(0.8 / abs(fac)) elif fac < 0: self.zoom(1.2 * abs(fac)) def OnMouseDown (self, event): self.mouseDown = True self.mouseDownCoords = tuple(event.GetPosition()) self.mouseDownCentre = (self.loncentre, self.latcentre) lon, lat = self.coordsToWorld(event.GetPosition()) if self.mode == MapCanvas.MODE_SELECT_AREA: self.selectClosedArea(lon, lat, lon, lat) pass elif self.mode == MapCanvas.MODE_SELECT_STATION: lon, lat = self.coordsToWorld(event.GetPosition()) self.selectNearest(lon, lat) elif self.mode == MapCanvas.MODE_SELECT_IDENT: lon, lat = self.coordsToWorld(event.GetPosition()) id, lat, lon, ident = self.nearestPoint(lon, lat) self.model.setIdentFilter(ident is not None, ident) def OnMouseUp (self, event): self.mouseDown = False if self.mode == MapCanvas.MODE_SELECT_AREA: lon1, lat1 = self.coordsToWorld(self.mouseDownCoords) lon2, lat2 = self.coordsToWorld(event.GetPosition()) self.selectClosedArea(lon1, lat1, lon2, lat2) # #self.canvas.RemoveObject(self.selectRectangle) # #self.canvas.Draw() # #self.mode = 0 # #self.selectButton.SetValue(False) # coords = tuple(event.GetCoords()) # stride = (coords[0] - self.mouseDownCoords[0], coords[1] - self.mouseDownCoords[1]) # self.select(self.mouseDownCoords, stride) elif self.mode == MapCanvas.MODE_SELECT_STATION: lon, lat = self.coordsToWorld(event.GetPosition()) id, lat, lon, ident = self.selectNearest(lon, lat) if id is not None: self.recentre(lon, lat) elif self.mode == MapCanvas.MODE_SELECT_IDENT: lon, lat = self.coordsToWorld(event.GetPosition()) id, lat, lon, ident = self.nearestPoint(lon, lat) self.model.setIdentFilter(ident is not None, ident) def OnMouseMoved (self, event): #print "Move: ", event.GetPosition() if self.mouseDown: coords = tuple(event.GetPosition()) stride = (coords[0] - self.mouseDownCoords[0], coords[1] - self.mouseDownCoords[1]) worldStride = self.distanceToWorld(stride) if self.mode == MapCanvas.MODE_MOVE: self.recentre( \ self.mouseDownCentre[0] - worldStride[0], \ self.mouseDownCentre[1] - worldStride[1]) elif self.mode == MapCanvas.MODE_SELECT_AREA: lon1, lat1 = self.coordsToWorld(self.mouseDownCoords) lon2, lat2 = self.coordsToWorld(event.GetPosition()) self.selectClosedArea(lon1, lat1, lon2, lat2) elif self.mode == MapCanvas.MODE_SELECT_STATION: lon, lat = self.coordsToWorld(event.GetPosition()) id, lat, lon, ident = self.selectNearest(lon, lat) elif self.mode == MapCanvas.MODE_SELECT_IDENT: lon, lat = self.coordsToWorld(event.GetPosition()) id, lat, lon, ident = self.nearestPoint(lon, lat) self.model.setIdentFilter(ident is not None, ident) def OnResize (self, event): self.resize() def resize (self): (width, height) = self.GetClientSizeTuple() owidth, oheight = (width, height) if width > height*2: width = height*2 else: height = width/2 self.xscale = float(width)/self.lonwidth self.yscale = float(height)/self.latwidth self.xoffset = 0 self.yoffset = 0 self.xoffset, self.yoffset = self.coordsToPixels((self.loncentre - self.lonwidth / 2, self.latcentre + self.latwidth / 2)) self.xoffset = - self.xoffset + (owidth - width)/2 self.yoffset = - self.yoffset + (oheight - height)/2 # Invalidate the pre-rendered shorelines image when the size # changes self.shoreLinesImage = None self.stationsImage = None def OnPaint (self, event): if self.stationsImage is None: self.renderStations() wx.BufferedPaintDC(self, self.stationsImage, wx.BUFFER_VIRTUAL_AREA) def filterChanged(self, what): if what == "stations": self.stationsImage = None self.Refresh() def invalidate(self): self.stationsImage = None def hasData(self, what): if what == "stations": if self.neverZoomed: self.zoomToFit() self.neverZoomed = False else: self.zoomToFitSelection() self.renderStations() def renderStations (self): tracer = TTracer("regenerate station map") if self.shoreLinesImage is None: self.renderShoreLines() sel_id = self.model.filter.get("ana_id", None) sel_mobile = self.model.filter.get("mobile", None) sel_ident = self.model.filter.get("ident", None) sel_latmin = self.model.filter.get("latmin", None) sel_latmax = self.model.filter.get("latmax", None) sel_lonmin = self.model.filter.get("lonmin", None) sel_lonmax = self.model.filter.get("lonmax", None) has_id = sel_id is not None has_area = sel_latmin is not None and sel_latmax is not None and \ sel_lonmin is not None and sel_lonmax is not None (width, height) = self.GetClientSizeTuple() self.stationsImage = wx.EmptyBitmap(width, height) # Use the coastlines as background dc = wx.BufferedDC(None, self.stationsImage) coasts = wx.MemoryDC() coasts.SelectObject(self.shoreLinesImage) dc.BeginDrawing() dc.Blit(0, 0, width, height, coasts, 0, 0) normalPen = wx.Pen("#FF0000") selectedPen = wx.Pen("#00FF00") normalBrush = wx.Brush("#FFBBBB") selectedBrush = wx.Brush("#BBFFBB") # Add the points countSelected = 0 lastSelectedID = None for (id, lat, lon, ident) in self.model.stations(): selected = False if has_id and id == sel_id: # Try selecting by ID selected = True elif sel_latmin is not None and sel_latmax is not None and \ sel_lonmin is not None and sel_lonmax is not None: # Try selecting by area, intersected with ident if sel_lonmin <= sel_lonmax: if sel_latmin <= lat <= sel_latmax and \ sel_lonmin <= lon <= sel_lonmax: selected = sel_mobile is None or sel_ident == ident else: if sel_latmin <= lat <= sel_latmax and \ (-180 <= lon <= sel_lonmax or \ sel_lonmin <= lon <= 180): selected = sel_mobile is None or sel_ident == ident else: # Try selecting by ident selected = not has_area and sel_mobile is not None and sel_ident == ident # Set the brush according to selection state if selected: dc.SetPen(selectedPen) dc.SetBrush(selectedBrush) countSelected = countSelected + 1 lastSelectedID = id else: dc.SetPen(normalPen) dc.SetBrush(normalBrush) x, y = self.coordsToPixels((lon, lat)) if ident is None: dc.DrawCircle(x, y, 2) else: # Draw a triangle dc.DrawPolygon( ( (x-3, y+3), (x, y-3), (x+3, y+3) ) ) # Draw a cross #dc.DrawLine(x-1, y, x+1, y) #dc.DrawLine(x, y-1, x, y+1) if sel_latmin is not None and sel_lonmin is not None and sel_latmax is not None and sel_lonmax is not None: dc.SetPen(wx.Pen("BLACK")) dc.SetBrush(wx.Brush("WHITE", wx.TRANSPARENT)) ly = min(sel_latmin, sel_latmax) lh = max(sel_latmin, sel_latmax) - ly if sel_lonmin <= sel_lonmax: lx = sel_lonmin lw = sel_lonmax - sel_lonmin x, y = self.coordsToPixels((lx, ly)) w, h = self.distanceToPixels((lw, lh)) dc.DrawRectangle(x, y, w, h) else: lx1 = -180 lw1 = sel_lonmax - lx1 lx2 = sel_lonmin lw2 = 180 - lx2 x, y = self.coordsToPixels((lx1, ly)) w, h = self.distanceToPixels((lw1, lh)) dc.DrawRectangle(x, y, w, h) x, y = self.coordsToPixels((lx2, ly)) w, h = self.distanceToPixels((lw2, lh)) dc.DrawRectangle(x, y, w, h) dc.EndDrawing() oldSID = self.selectedID if countSelected == 1: self.selectedID = lastSelectedID else: self.selectedID = None if self.selectedID != oldSID: # Notify change of currently selected station to listeners e = MapCanvas.MapCanvasEvent(MapCanvas.wxEVT_CURRENT_STATION_CHANGED, self.GetId()) e.SetEventObject(self) e.SetStation(self.selectedID) self.GetEventHandler().ProcessEvent(e) def renderShoreLines (self): tracer = TTracer("regenerate shore lines") (width, height) = self.GetClientSizeTuple() #print "Repaint", width, height self.shoreLinesImage = wx.EmptyBitmap(width, height) dc = wx.BufferedDC(None, self.shoreLinesImage) #dc.SetBackground(wx.Brush(self.GetBackgroundColour())) dc.SetBackground(wx.Brush("WHITE")) dc.Clear() dc.BeginDrawing() dc.SetPen(wx.Pen("BLACK")) for i in self.shoreLines: dc.DrawLines(self.segmentToPixels(i)) #dc.DrawRectangle(0, 0, width, height) #dc.DrawLine(0, 0, width, height) dc.EndDrawing() #wx.BufferedPaintDC(self, buffer, wx.BUFFER_VIRTUAL_AREA) def loadShoreLines (self, file): """ This function reads a MapGen Format file, and builds the self.shoreLines array with it. The self.shoreLines array is a list of floats with the line segments in them. """ file = open(file, 'rt') segment = [] for line in map(string.strip, file.readlines()): if line: if line == "# -b": #New segment beginning if segment: self.shoreLines.append(segment) segment = [] else: segment.append(map(float,string.split(line))) if segment: self.shoreLines.append(segment) self.shoreLinesImage = None dballe-5.18/provami/icon-ana-window.png0000644000175000017500000000041011173330007014756 00000000000000PNG  IHDRa pHYs  tIME'ˊ[tEXtCommentCreated with The GIMPd%n~IDAT8͒K0 CGs5Nuz)gOBBd[8vϑMD`{o9DDR nV`@53f@/ru9e; hs &v;hH:e0j}_:]IENDB`dballe-5.18/provami/icon-attr-window.png0000644000175000017500000000037711173330007015205 00000000000000PNG  IHDRa pHYs  tIME ߉tEXtCommentCreated with The GIMPd%nuIDAT8͑K0D[wM/Í FRM C<(0) $@ dist_bin_SCRIPTS = provami.py man_MANS = provami.1 install-exec-hook: mv $(DESTDIR)$(bindir)/provami.py $(DESTDIR)$(bindir)/provami uninstall-hook: rm -f $(DESTDIR)$(bindir)/provami EXTRA_DIST = dballe-print-stations populate.py provami/Paths.py.in \ $(dballedata_DATA) $(provamiModules) \ provami.1 dballecsv notes regenerate-provami-manpage CLEANFILES = provami/*.pyc provami/Paths.py dballe-5.18/provami/icon-provami.png0000644000175000017500000000063611173330007014401 00000000000000PNG  IHDRZbKGD{^ pHYs  tIME ::B+IDAT8ˍT1N@}56&\F7beA V6T~Aņk,95y6.YᯛL؝ٙy3[-]]$Z<]6Q(vжm(H(yǕ5 TGet2wH*@e6 9evP?-@ۺPq8[ bl+_C&DDvF_@!ϥ|e+IG\ZQCn{O*eY>}" IHNk]h!Fp6 덛 P|Fiz44M.q_˲ޣomJ0IENDB`dballe-5.18/provami/dballe-print-stations0000755000175000017500000000354511173330007015437 00000000000000#!/usr/bin/python import sys import Dballe import string import os from optparse import OptionParser VERSION="0.1" class Parser(OptionParser): def __init__(self, *args, **kwargs): OptionParser.__init__(self, *args, **kwargs) def error(self, msg): sys.stderr.write("%s: error: %s\n\n" % (self._get_prog_name(), msg)) self.print_help(sys.stderr) sys.exit(2) def print_help (self, file=None): OptionParser.print_help(self, file) file.write(""" Supported commands: stations output the list of stations in the database """) class DB: def __init__(self, dsn, user, password): self.db = Dballe.DB(dsn, user, password) def stations(self): for result in self.db.queryAnaSummary(Dballe.Record()): print "%d %f %f" % \ (result.enqi("ana_id"), result.enqd("lat"), result.enqd("lon")), name = result.enqc("ident") if name: print " ", name, print parser = Parser(usage="usage: %prog [options] command [args...]", version="%prog "+ VERSION, description="perform common operations on a DB-ALLe database") parser.add_option("--dsn", default="test", help="DSN to use to connect to the database (default: %default)") parser.add_option("--user", default=os.environ['USER'], help="User name to use to connect to the database (default: %default)") parser.add_option("--pass", default="", dest="password", help="Password to use to connect to the database (default: none)") (options, args) = parser.parse_args() if len(args) == 0: parser.print_help() else: cmd = args.pop(0) if cmd == "stations": db = DB(options.dsn, options.user, options.password) db.stations() else: parser.error("I do not know how to handle the function " + cmd) # vim:set ts=4 sw=4 expandtab: dballe-5.18/provami/icon-map-select-station.png0000644000175000017500000000035611173330007016434 00000000000000PNG  IHDRa pHYs  tIME0SWtEXtCommentCreated with The GIMPd%ndIDAT8˵10QW8:R@D hJ*bUo BG(Z9U |7h%pDx"Eg-飍<:o C IENDB`dballe-5.18/provami/icon-filters-window.png0000644000175000017500000000040211173330007015670 00000000000000PNG  IHDRabKGD pHYs  tIME  %3ѷtEXtCommentCreated with The GIMPd%nfIDAT8c`0]`ddu,$׮]Wspp0h$$f psݻ\]IwQf/ !93Ǔh OoBIENDB`dballe-5.18/provami/world.dat0000644000175000017500000164116211173330007013117 00000000000000# -b 0.192440 5.669954 -0.657114 5.195893 -1.417488 5.008146 -1.936139 4.686630 -2.595600 4.930701 -3.003949 4.975290 -3.832382 5.184159 -5.198240 5.041002 -5.585468 4.984678 -6.223807 4.754688 -6.787047 4.543473 -7.293964 4.278280 -7.735169 4.334604 -8.835834 4.808665 -9.807424 5.681688 -10.412907 6.078303 -10.800135 6.364617 -11.095836 6.496040 -11.196750 6.594607 -11.163895 6.672052 -11.461943 6.892655 -12.299763 7.256414 -12.562608 7.641295 -12.794945 8.035563 -13.069525 8.265553 -12.982692 8.495543 -13.092993 8.802979 -13.179826 9.011847 -13.325330 9.262958 -13.555320 9.612637 -13.919079 9.938847 -14.029380 9.971702 # -b -12.431186 7.498138 -12.651788 7.486404 -12.586077 7.366715 -12.431186 7.498138 # -b -49.917183 -0.018775 -49.863206 0.225296 -49.863206 0.225296 # -b -50.027484 0.957509 -49.961773 1.300147 -49.863206 1.731964 # -b -59.708179 8.277287 -59.773891 8.310143 -59.905313 8.462687 # -b -57.060949 5.791989 -57.272164 6.266050 -57.657045 6.585219 -58.208552 6.871533 -58.518334 6.803475 -58.462010 7.155500 -58.649757 7.606093 -59.168407 8.023829 -59.642468 8.375855 -59.696445 8.298409 -59.708179 8.277287 # -b -54.028838 5.482207 -53.986595 5.791989 -55.000428 5.968002 -55.307863 5.890556 -55.903960 5.801376 -56.500056 5.902290 -56.929527 5.956268 -57.060949 5.791989 # -b -51.592823 4.069412 -51.759449 4.531739 -52.165451 4.841521 -52.740426 5.261604 -53.512535 5.538531 -53.798848 5.723931 -54.028838 5.482207 # -b -50.194110 0.457633 -50.337267 0.204175 -50.048606 0.037549 # -b -49.863206 0.225296 -50.194110 0.457633 -50.194110 0.457633 # -b -50.931016 -0.007041 -50.435834 0.525691 -50.027484 0.957509 -50.027484 0.957509 # -b -49.863206 1.731964 -50.445221 1.910324 -50.665824 2.619068 -50.963872 3.625860 -51.196208 4.135123 -51.383955 4.290015 -51.592823 4.069412 -51.592823 4.069412 # -b -59.905313 8.462687 -60.280807 8.584723 -60.778336 8.486156 -60.820579 8.584723 -60.733746 8.758389 -60.921493 9.415503 -61.395554 9.600903 -61.649012 9.765181 -61.792169 9.852014 -62.022159 9.875482 -62.409387 9.896604 -62.409387 9.896604 # -b -80.038812 9.065824 -79.851065 9.239490 -79.487306 9.612637 -79.111812 9.546925 -78.527450 9.415503 -77.954822 9.131535 -77.569942 8.781857 -77.569942 8.781857 # -b -77.900845 7.244680 -78.363172 7.904141 -78.196546 8.375855 -78.440617 8.429832 -79.078957 8.922667 -79.740764 8.683290 -79.907389 8.429832 # -b -77.900845 7.244680 -77.745954 6.937245 -77.480762 6.672052 -77.424438 6.266050 -77.370461 5.791989 -77.525352 5.526797 -77.447906 5.008146 -77.370461 4.477761 -77.459640 3.935643 -77.084147 3.902787 -77.138124 3.682184 -77.480762 3.294957 -77.680243 2.907729 -78.032268 2.607334 -78.461739 2.562744 -78.682341 2.121539 -78.628364 1.800023 -78.968655 1.633397 -78.924065 1.412795 -78.881822 1.377592 # -b -78.870088 1.377592 -79.189258 1.112400 -79.642197 0.812005 -79.829944 0.823739 # -b -75.671352 10.016292 -75.683086 9.666614 -75.981134 9.415503 -76.344894 8.988379 -76.884666 8.650434 -76.764977 8.420444 -76.753243 8.056685 -76.962111 7.981586 -77.138124 8.342999 -77.415050 8.650434 -77.569942 8.781857 # -b -71.317973 10.114859 -71.064515 9.481214 -71.261649 9.065824 -71.669998 9.251224 -71.979780 9.720591 -72.012636 9.875482 # -b -81.803632 7.707007 -81.878731 7.584971 -81.726187 7.486404 -81.803632 7.707007 # -b -83.235202 10.114859 -82.718898 9.678348 -82.376260 9.328670 -82.155657 9.328670 -81.935055 9.000113 -81.284982 8.835834 -80.733475 9.044703 -80.092789 9.328670 -80.038812 9.065824 # -b -79.907389 8.429832 -80.435427 8.166986 -80.259415 7.728128 -80.203091 7.432427 -80.766331 7.211824 -80.954078 7.420693 -81.064379 7.772718 -81.228657 7.596705 -81.592417 7.871285 -81.693331 8.035563 -82.188513 8.265553 -82.617984 8.319531 -82.916032 8.232698 -83.026333 8.310143 -83.157756 8.605844 -83.390093 8.561255 -83.720996 8.638700 -83.986189 9.295814 -84.558817 9.579781 -84.791153 9.938847 -84.791153 9.938847 # -b -85.176034 10.016292 -85.021143 9.753447 -85.396637 9.863748 -85.694685 9.962315 # -b -79.829944 0.823739 -80.071668 0.359066 -80.059934 0.171319 # -b -91.383413 0.147851 -91.371679 0.103261 # -b -91.526570 -0.051630 -91.383413 0.147851 -91.383413 0.147851 # -b -157.343561 2.013585 -157.254381 1.968995 -157.144080 1.769514 -156.989189 1.591154 -157.364683 1.680334 -157.421007 1.778901 -157.275503 1.868081 -157.343561 1.990116 -157.343561 2.013585 # -b -162.079475 5.937493 -162.079475 5.892903 -162.079475 5.937493 # -b -176.564141 0.227643 -176.564141 0.227643 -176.564141 0.227643 -176.564141 0.227643 # -b 170.884800 8.861649 170.962245 8.807672 171.117137 8.718493 171.149992 8.511971 170.995101 8.554214 170.861332 8.718493 170.828476 8.849915 170.884800 8.861649 # -b 172.860835 1.891549 172.926546 1.835225 172.971136 1.501974 173.048582 1.281372 172.905425 1.447997 172.881957 1.769514 172.860835 1.891549 # -b 163.112082 5.364865 163.058105 5.308541 163.013515 5.364865 163.112082 5.364865 # -b 166.909261 9.288773 167.031297 9.277039 167.240165 9.255918 167.439646 9.300508 167.639127 8.993072 167.627393 8.697371 167.505357 8.939095 167.240165 9.157351 166.998441 9.190206 166.909261 9.288773 166.909261 9.288773 # -b 169.549451 5.993817 169.493127 6.014938 169.549451 5.993817 # -b 152.126547 7.115604 152.138281 7.115604 152.126547 7.115604 # -b 153.661377 5.606589 153.717701 5.606589 153.661377 5.606589 153.661377 5.606589 # -b 158.286989 7.005303 158.397290 6.873880 158.277602 6.873880 158.286989 7.005303 158.286989 7.005303 # -b 134.729458 7.664764 134.738845 7.512219 134.595688 7.455895 134.694255 7.655376 134.729458 7.664764 # -b 138.240323 9.584475 138.282566 9.528151 138.240323 9.584475 138.240323 9.584475 # -b 123.368429 10.215773 123.180682 9.725285 123.237006 9.342751 122.903756 9.190206 122.539996 9.528151 122.563465 9.964662 122.563465 9.964662 # -b 125.687102 10.161796 125.687102 9.812118 125.654246 9.943540 # -b 126.018006 9.997518 126.116573 9.790996 126.018006 9.997518 126.018006 9.997518 # -b 123.699333 10.020986 123.490464 9.518763 123.368429 9.856708 123.368429 9.856708 # -b 123.833102 9.844973 123.985647 9.955275 123.985647 9.955275 # -b 124.572355 10.020986 124.548887 9.737019 124.250839 9.593862 123.908201 9.683042 123.833102 9.844973 # -b 125.421910 9.713551 125.499355 9.746406 125.719958 9.561006 126.029740 9.277039 126.316054 8.894505 126.161163 8.587070 126.348910 8.258513 126.447477 7.852510 126.581246 7.324472 126.370031 6.963060 126.271464 6.366964 126.071983 6.995916 125.818525 7.357328 125.576801 7.038159 125.543945 6.488999 125.698836 5.970349 125.344464 5.672301 125.123862 5.904637 124.572355 6.014938 124.131150 6.444409 124.009115 7.017037 124.217983 7.446508 123.699333 7.852510 123.424753 7.566196 123.290983 7.533341 123.082115 7.566196 122.915490 7.336207 122.662032 7.709353 122.385105 7.303351 122.119913 6.906736 122.000224 7.282229 122.152768 7.840776 122.673766 8.127090 123.091503 8.488503 123.478730 8.676249 123.743923 8.061379 124.131150 8.192801 124.593477 8.533093 124.814079 8.960217 125.112128 8.939095 125.466500 9.025928 125.475887 9.333363 125.421910 9.671308 125.421910 9.713551 # -b 121.833599 6.632156 122.253682 6.643890 122.000224 6.432675 121.833599 6.632156 # -b 120.951189 5.871781 121.106080 6.036060 121.425250 5.949227 121.049756 5.860047 120.951189 5.871781 # -b 119.967865 5.186506 120.254179 5.144263 120.134490 5.099673 # -b 121.115467 1.325962 121.446371 1.302493 121.735032 1.081891 122.152768 1.103013 122.584586 1.025567 122.861513 0.882410 123.246394 0.980977 123.788513 0.903532 124.274307 1.058423 124.692044 1.436263 125.135596 1.713190 125.189573 1.370552 124.804692 0.882410 124.262573 0.361413 123.556176 0.305089 122.903756 0.492835 122.363984 0.483448 121.767887 0.492835 121.368926 0.516304 120.906599 0.427124 120.331624 0.272233 120.188467 0.028162 # -b 119.956131 0.471714 120.265913 0.903532 120.608551 0.816699 120.927721 1.302493 121.115467 1.325962 # -b 125.433644 3.717387 125.576801 3.541374 125.543945 3.541374 125.433644 3.717387 # -b 126.768993 4.536432 126.867560 4.348685 126.822970 4.027169 126.768993 4.536432 126.768993 4.536432 # -b 128.557282 2.654271 128.667583 2.433668 128.611259 2.201331 128.303823 2.189597 128.381269 2.555703 128.500957 2.654271 # -b 127.937717 2.222453 128.026897 2.112152 127.862618 1.846959 128.026897 1.415142 127.785173 1.025567 127.794560 0.849554 128.148932 1.248516 128.601871 1.525443 128.723907 1.093625 128.324945 0.804964 128.634727 0.549159 128.834208 0.260499 128.226378 0.406002 127.928330 0.061018 127.928330 0.061018 # -b 127.749970 -0.269886 127.597426 0.537425 127.475391 0.992711 127.419066 1.347083 127.651403 1.957260 127.937717 2.222453 # -b 109.965654 1.835225 110.329413 1.769514 110.660317 1.680334 111.080400 1.602888 111.157846 1.736658 111.223557 1.957260 111.268147 2.245921 111.455894 2.356222 111.479362 2.588559 111.643641 2.842017 111.920567 2.919463 112.084846 2.964053 112.185760 2.987521 112.526051 3.020377 112.868689 3.086088 113.145615 3.395870 113.321628 3.595351 113.509375 3.884012 113.729977 4.060025 113.905990 4.280627 113.974048 4.480108 114.006904 4.590410 114.105471 4.634999 114.382397 4.691323 114.725035 4.888458 114.955025 5.076204 115.055939 4.933047 115.175628 4.944782 115.276542 4.933047 115.530000 5.144263 115.419698 5.353131 115.661422 5.496288 116.004060 5.782602 116.114362 6.092384 116.367820 6.390432 116.567301 6.599300 116.743313 6.951326 116.799638 6.829290 116.766782 6.542976 116.963916 6.787047 117.207987 6.873880 117.351144 6.575832 117.571746 6.533589 117.705516 6.324721 117.660926 6.026673 117.771227 5.925759 118.036420 5.970349 118.003564 5.716890 118.245288 5.773214 118.609047 5.585468 119.019744 5.409455 119.273202 5.209974 118.930564 4.977637 118.543336 4.867336 118.245288 4.757035 118.400179 4.545820 118.599660 4.390929 118.245288 4.292361 117.926118 4.238384 117.705516 4.336951 117.660926 4.160939 117.449711 4.048291 117.825204 3.851156 117.595215 3.672797 117.318288 3.607086 117.383999 3.353627 117.407468 3.187002 117.649192 2.919463 117.958974 2.412547 117.970708 2.112152 117.947240 1.891549 118.477625 1.424529 118.975154 0.992711 118.587926 0.837820 118.191311 0.894144 118.003564 0.980977 117.848673 0.704051 117.583480 0.215909 117.583480 0.007041 # -b 119.130045 10.009252 118.754551 9.593862 118.146721 9.037662 117.604602 8.643394 117.240843 8.434525 117.562359 9.025928 118.102131 9.420196 118.510480 9.844973 # -b 119.878685 4.989371 119.967865 5.186506 119.967865 5.186506 # -b 120.134490 5.099673 119.979599 5.043349 119.878685 4.989371 # -b 119.791852 -0.049284 119.956131 0.471714 119.956131 0.471714 # -b 104.049282 1.436263 104.037548 1.525443 104.016427 1.546564 103.816946 1.501974 103.870923 1.325962 104.049282 1.436263 # -b 100.207513 6.444409 100.073744 6.676746 # -b 102.216404 6.190951 102.678731 5.925759 103.087080 5.618323 103.495429 4.977637 103.507163 4.193794 103.507163 3.496784 103.760622 2.799774 104.213561 2.055828 104.201827 1.447997 103.805211 1.647478 103.572875 1.403407 103.650320 1.391673 103.507163 1.501974 102.988513 1.802369 102.293850 2.189597 101.608574 2.731716 101.298792 3.374749 100.803609 4.006048 100.693308 4.602144 100.470359 5.120794 100.371792 5.949227 100.207513 6.444409 100.207513 6.444409 # -b 99.909465 9.244184 100.130068 8.500237 100.470359 7.819655 100.625250 7.315085 101.265936 6.930204 102.061513 6.432675 102.216404 6.190951 # -b 106.630801 10.086697 106.609679 9.988130 # -b 106.499378 10.009252 106.478257 9.572740 106.013583 9.943540 106.145006 9.429584 105.903282 9.288773 105.340042 8.784204 104.887102 8.676249 104.842513 9.190206 104.865981 9.692429 104.997404 9.868442 # -b 99.885997 3.130678 100.228635 2.731716 100.604128 2.323367 100.923298 2.091030 101.155635 2.255309 101.399705 1.912671 101.519394 1.736658 101.796321 1.647478 102.094369 1.492587 102.282115 1.203926 102.371295 1.358818 102.669343 1.081891 103.164525 1.025567 103.176260 0.870676 103.065958 0.682929 103.131670 0.560894 102.911067 0.305089 103.042490 0.293354 103.408596 0.492835 103.739500 0.328557 103.838067 0.072752 # -b 101.817442 1.790635 101.697753 1.835225 101.552250 1.968995 101.620308 2.067562 101.840910 2.079296 101.894888 1.879815 101.817442 1.790635 101.817442 1.790635 # -b 102.160080 1.668600 102.303237 1.624010 102.523839 1.614623 102.580163 1.347083 102.371295 1.480853 102.160080 1.668600 102.160080 1.668600 # -b 104.666500 1.171071 104.732211 0.894144 104.544464 1.070157 104.445897 1.213314 104.666500 1.171071 104.666500 1.171071 # -b 109.623016 2.055828 109.745051 2.055828 109.965654 1.835225 109.965654 1.835225 # -b 109.202932 -0.082139 109.026920 0.382534 108.994064 0.816699 109.059775 1.225048 109.336702 1.724924 109.623016 2.055828 109.623016 2.055828 # -b 100.073744 6.676746 99.686516 7.225905 99.212455 7.807920 98.738394 8.258513 98.330045 8.389936 98.440346 9.255918 98.639827 9.964662 98.639827 9.964662 # -b 99.191334 10.009252 99.322756 9.244184 99.909465 9.244184 99.909465 9.244184 # -b 98.384022 8.115356 98.384022 7.840776 98.419225 8.148212 98.384022 8.115356 # -b 93.847590 7.282229 93.680965 7.028771 93.892180 7.181315 93.758410 7.303351 # -b 95.326096 5.606589 95.436397 5.606589 95.525577 5.630057 95.614757 5.630057 95.933926 5.552612 96.210853 5.332009 96.562878 5.263951 96.982962 5.287420 97.534468 5.198240 97.975673 4.933047 98.130564 4.590410 98.395756 4.292361 98.672683 3.982579 99.090420 3.661063 99.644273 3.330159 99.885997 3.130678 # -b 99.963442 -0.147851 99.543359 0.251111 99.355612 0.293354 99.212455 0.849554 98.937875 1.501974 98.604625 2.046440 98.076587 2.299898 97.755070 2.710595 97.557936 2.987521 97.334987 3.297303 96.884395 3.740855 96.354010 4.104615 95.901071 4.491842 95.546699 4.900192 95.370686 5.332009 95.326096 5.606589 95.326096 5.606589 # -b 95.868215 2.809162 95.922192 2.919463 96.342276 2.644883 96.551144 2.377344 96.231974 2.532235 95.868215 2.809162 95.868215 2.809162 # -b 97.302131 1.403407 97.424167 1.513709 97.755070 1.257904 98.041384 0.971590 98.053119 0.694663 97.820782 0.793230 97.534468 1.081891 97.334987 1.370552 97.302131 1.403407 # -b 80.024731 9.812118 80.024731 9.812118 # -b 79.926164 9.746406 80.278189 9.462439 80.048199 9.112761 80.048199 9.112761 # -b 79.893308 6.510121 80.510526 5.958614 81.240392 6.223807 81.791898 7.160194 81.658128 7.732822 81.371814 8.455647 81.195802 8.697371 81.040911 8.894505 80.665417 9.408462 80.179622 9.802730 80.024731 9.812118 # -b 79.186911 10.096085 78.900597 9.617330 78.900597 9.265305 78.391334 9.136229 78.126141 8.849915 78.027574 8.479115 77.795238 8.303103 77.330564 8.105969 76.603045 8.981338 76.337853 9.746406 # -b 80.024731 9.812118 79.926164 9.746406 # -b 80.048199 9.112761 79.869840 8.544827 79.726683 8.148212 79.726683 7.413652 79.893308 6.510121 79.893308 6.510121 # -b 50.832449 10.159449 50.722148 9.403768 50.402978 8.856956 50.072074 8.211576 49.806882 7.880672 49.553424 7.244680 49.168543 6.606341 49.067629 6.341149 48.804783 5.613630 48.142976 4.984678 47.767482 4.266546 47.194854 3.637594 46.819361 3.205777 46.422746 2.917116 46.047252 2.452443 45.507480 2.032359 44.845672 1.743699 44.416202 1.412795 44.007852 1.067810 43.500936 0.570281 43.137177 0.192440 43.137177 0.192440 # -b 36.101365 4.522351 36.300846 4.179713 36.289112 3.637594 36.521448 2.863139 36.742051 2.508767 36.631750 2.520501 36.211666 2.985174 35.969942 3.593005 35.958208 4.388582 35.991064 4.522351 # -b 34.029109 0.237030 34.019722 0.114995 # -b 34.073699 0.237030 33.665350 0.192440 33.203023 0.237030 32.740697 0.147851 32.529482 0.058671 32.419180 0.103261 # -b 5.001106 5.824845 4.592756 6.221460 4.074106 6.364617 3.248020 6.352883 2.795081 6.320027 2.332754 6.275437 1.825838 6.221460 1.274331 6.054835 1.009139 5.747399 0.621911 5.747399 0.192440 5.669954 # -b 5.001106 5.824845 5.186506 5.637098 5.451698 5.404761 5.451698 4.796931 5.761480 4.421437 6.212073 4.212569 6.566445 4.343992 6.787047 4.379194 6.963060 4.498883 7.249374 4.599797 7.932303 4.498883 8.242085 4.864989 8.396976 4.742954 # -b 9.232449 -0.194787 9.420196 0.147851 9.840280 0.136116 9.476520 0.314476 9.342751 0.603137 9.521110 0.880063 9.575087 1.023220 9.342751 1.290759 9.553966 1.755433 9.685389 2.231840 9.762834 2.795081 9.884870 3.238632 9.631411 3.560149 9.607943 3.769017 9.575087 4.045944 9.342751 3.947377 8.892158 4.266546 8.725533 4.543473 8.439219 4.566941 8.396976 4.742954 8.396976 4.742954 # -b 8.605844 3.813607 8.814713 3.703306 8.793591 3.337200 8.418098 3.393524 8.582376 3.747896 8.605844 3.813607 # -b 6.488999 0.314476 6.444409 0.082139 6.632156 0.302742 6.488999 0.314476 # -b -14.029380 9.971702 -14.437730 10.311994 -14.491707 10.659325 -14.670066 10.746158 -14.747512 10.952680 -14.968114 10.746158 -15.054947 11.051247 -15.275550 11.095836 -15.352995 11.431434 -15.430441 11.703667 -15.043213 11.844477 -15.043213 11.919576 -15.672165 11.736522 -15.892767 11.877333 -16.256527 11.985287 -16.432540 12.191808 -16.718853 12.548527 -16.697732 13.013201 -16.676610 13.391041 -16.444274 13.261965 -16.378562 13.358186 -16.500598 13.691436 -16.763443 14.186618 -17.183527 14.679454 -17.150671 14.841385 -16.521719 15.686246 -16.399684 15.942051 -16.333972 16.939456 -15.991335 18.122261 -16.101636 19.016405 -16.444274 19.413020 -16.345707 19.528015 -16.202550 19.934018 # -b -15.881033 11.095836 -16.092248 10.943292 -15.881033 11.095836 # -b -24.989100 17.141284 -25.275414 16.951190 -24.967979 17.035676 -24.989100 17.141284 # -b -23.930678 16.556922 -24.249847 16.610899 -24.282703 16.472436 -24.029245 16.535800 -23.930678 16.556922 # -b -22.893377 16.887826 -22.926232 16.632021 -22.883989 16.866704 -22.893377 16.887826 # -b -22.872255 16.122757 -22.639918 15.984294 -22.883989 15.972560 -22.872255 16.122757 # -b -23.698341 15.247388 -23.721809 14.883628 -23.390906 15.000970 -23.698341 15.247388 -23.698341 15.247388 # -b -24.339027 14.916484 -24.458716 14.820264 -24.273316 14.829651 -24.339027 14.916484 # -b -70.060069 18.385106 -69.532031 18.439084 -68.924201 18.385106 -68.527586 18.354598 -68.506464 18.744172 -68.825634 19.004671 -69.201127 19.058648 -69.597743 19.161909 -69.233983 19.255782 -69.839467 19.464651 -69.949768 19.643010 # -b -66.046981 18.502448 -65.760667 18.385106 -65.981270 18.007266 -66.621956 17.995532 -67.203971 18.007266 -67.248561 18.439084 -66.697054 18.532957 -66.046981 18.502448 -66.046981 18.502448 # -b -64.934581 18.406228 -64.934581 18.312355 -64.934581 18.406228 # -b -64.845401 17.765542 -64.735100 17.786663 -64.845401 17.765542 # -b -62.409387 9.896604 -62.597133 10.222814 -62.871713 10.365971 -62.716822 10.551371 -62.353063 10.527902 -61.979916 10.680447 -62.287351 10.746158 -62.618255 10.713302 -63.125171 10.757892 -63.831569 10.692181 -64.228184 10.671059 -64.139004 10.572492 -63.721267 10.539637 -64.183594 10.473925 -64.547353 10.246282 -65.274872 10.147715 -65.540065 10.168837 -66.025860 10.464538 -66.046981 10.518515 -66.366151 10.671059 -67.293150 10.572492 -67.889247 10.485659 -68.264740 10.800135 -68.241272 10.889315 -68.560441 11.302358 -68.992259 11.431434 -69.189393 11.508879 -69.266839 11.518267 -69.487441 11.530001 -69.630598 11.595712 -69.729165 11.757644 -69.940381 12.245786 -69.940381 12.245786 # -b -70.017826 11.637955 -69.818345 11.551123 -69.982624 11.431434 # -b -69.046236 12.299763 -69.111948 12.288029 -68.804512 12.093241 -69.046236 12.299763 -69.046236 12.299763 # -b -68.375041 12.288029 -68.318717 12.180074 -68.220150 12.224664 -68.375041 12.288029 # -b -63.897280 11.170935 -63.897280 10.943292 -64.162472 10.943292 -64.293895 11.095836 -63.974726 11.126345 -63.897280 11.170935 # -b -61.548098 12.180074 -61.702989 11.985287 -61.548098 12.180074 # -b -61.031794 13.304208 -61.074037 13.067178 -61.031794 13.304208 -61.031794 13.304208 # -b -60.921493 14.036421 -60.998939 13.736026 -60.853435 13.841634 -60.921493 14.036421 # -b -61.196073 14.904750 -60.930880 14.627823 -60.998939 14.433036 -61.184339 14.754552 -61.196073 14.904750 # -b -61.318108 15.620535 -61.372085 15.355342 -61.207807 15.343608 -61.318108 15.620535 -61.318108 15.620535 # -b -61.416675 16.505291 -61.548098 16.345707 -61.803903 16.186122 -61.583301 16.186122 -61.252397 16.282342 -61.416675 16.505291 -61.416675 16.505291 # -b -61.825025 17.153018 -61.869615 17.002821 -61.702989 17.087307 -61.825025 17.153018 # -b -62.784880 17.427598 -62.794268 17.289134 -62.784880 17.427598 -62.784880 17.427598 # -b -60.513144 11.344601 -60.722012 11.224912 -60.590589 11.248381 -60.513144 11.344601 # -b -60.942615 10.832991 -61.693602 10.671059 -61.759313 10.093738 -61.031794 10.159449 -60.987204 10.647591 -60.942615 10.832991 -60.942615 10.832991 # -b -74.955567 20.006769 -75.781653 19.945752 -76.598352 19.976261 -77.337605 19.861266 -77.656774 19.840144 # -b -77.149858 18.469592 -76.908134 18.375719 -76.422339 18.248990 -76.466929 17.892271 -77.095881 17.892271 -77.469028 17.871150 -78.020534 18.155117 -78.306848 18.427349 -77.900845 18.565813 -77.447906 18.502448 -77.149858 18.469592 # -b -73.047590 18.962428 -72.862190 18.732438 -73.324517 18.941306 -73.047590 18.962428 # -b -71.803768 19.797901 -72.364661 19.758005 -73.202481 19.945752 -73.258805 19.652397 -72.794132 19.382511 -72.761276 18.995284 -72.453841 18.575200 -73.258805 18.481327 -73.819699 18.584587 -74.427529 18.439084 -73.908879 18.058896 -73.378494 18.260724 -72.784745 18.143382 -72.320071 18.270111 -71.768565 18.049509 -71.616021 17.765542 -71.252261 17.943901 -70.876768 18.363985 -70.524742 18.206747 -70.060069 18.385106 # -b -69.949768 19.643010 -70.667899 19.830757 -71.306239 19.873000 -71.803768 19.797901 -71.803768 19.797901 # -b -71.306239 11.823355 -71.195937 12.147219 -71.362563 12.374862 -71.693466 12.503938 -71.911722 12.365474 -72.066613 12.212930 -72.287216 11.877333 -72.728421 11.649690 -72.960757 11.518267 -73.235337 11.365723 -73.753988 11.278890 -74.007446 11.323479 -74.371205 10.997269 -74.800676 10.985535 -75.187904 10.877581 -75.629109 10.518515 -75.671352 10.016292 -75.671352 10.016292 # -b -69.940381 12.245786 -70.280672 11.886720 -70.017826 11.637955 -70.017826 11.637955 # -b -69.982624 11.431434 -70.623310 11.278890 -71.350828 10.952680 -71.461130 10.527902 -71.317973 10.114859 # -b -72.012636 9.875482 -71.714588 10.387092 -71.550309 10.692181 -71.625408 11.018391 -71.890601 11.530001 -71.493985 11.670811 -71.306239 11.823355 -71.306239 11.823355 # -b -87.492360 20.018504 -87.546338 19.643010 -87.602662 19.361390 -87.689495 18.859167 -87.832652 18.291233 -87.987543 18.206747 -88.086110 18.532957 -88.064988 18.816924 -88.395892 18.575200 -88.285591 18.396841 -88.264469 17.774929 -88.318446 16.845583 -88.560170 16.387950 -88.923930 15.909195 -88.804241 15.812975 -88.517927 15.834097 -88.616494 15.834097 -88.339568 15.728489 # -b -88.285591 15.728489 -88.020398 15.782466 -87.337469 15.791854 -86.544239 15.845831 -85.992733 15.993681 -85.539794 15.876340 -85.000022 15.942051 -84.460249 15.834097 -84.096490 15.632269 -83.699875 15.355342 -83.303260 15.076069 -83.268057 14.369671 -83.577839 13.046056 -83.655285 12.482816 -83.699875 11.832743 -83.864153 11.344601 -83.655285 10.769626 -83.235202 10.114859 -83.235202 10.114859 # -b -84.791153 9.938847 -85.154913 10.159449 -85.176034 10.016292 # -b -85.694685 9.962315 -85.894166 10.527902 -85.804986 10.856459 -85.793252 11.051247 -86.079566 11.464290 -86.696783 12.060386 -87.248290 12.560262 -87.623783 12.938102 -87.403181 12.959224 -87.501748 13.238497 -87.668373 13.400429 -87.975808 13.238497 -88.848831 13.261965 -89.585737 13.520117 -89.806340 13.562360 # -b -85.551528 11.248381 -85.816720 11.595712 -85.849576 12.158953 -85.396637 11.865598 -85.077467 11.595712 -84.856865 11.126345 -84.856865 11.126345 # -b -96.457271 20.002076 -96.325848 19.720456 -96.170957 19.377818 -96.138101 19.220580 -96.070043 19.199458 -95.905764 19.032833 -95.739139 18.863861 -95.375380 18.706623 -94.999886 18.647952 -94.999886 18.647952 # -b -100.045582 16.944150 -99.681822 16.775178 -99.273473 16.648448 -98.829921 16.488864 -98.632787 16.488864 -98.355860 16.265914 -97.992101 16.073474 -97.780886 16.000722 -97.473450 15.892767 -97.065101 15.862259 -96.865620 15.787160 -96.600428 15.700327 -96.192078 15.615841 -95.882296 15.744917 -95.518537 15.862259 -95.143043 16.115717 -95.044476 16.148573 # -b -94.999886 18.647952 -94.725306 18.375719 -94.063499 18.312355 -93.312512 18.523570 -92.718762 18.669073 -91.967775 18.711316 -91.791762 18.502448 -91.296580 18.690195 -91.075978 19.131400 -90.745074 19.746271 -90.634773 19.891775 # -b -89.806340 13.562360 -90.435292 13.895611 -91.031388 13.940201 -91.845740 14.303960 -92.244702 14.594968 -92.695294 14.970461 -93.202210 15.460950 -93.765451 15.888074 -94.370934 16.132145 -94.922440 16.195509 -94.999886 16.186122 # -b -105.356469 20.044319 -105.279024 19.753311 -104.924652 19.450570 -104.614870 19.178337 -104.197133 19.072729 -103.899085 18.833352 -103.601037 18.654992 -103.565834 18.528263 -103.434411 18.413268 -103.180953 18.244296 -102.936882 18.171544 -102.749136 18.087058 -102.408845 17.990838 -101.965293 17.896965 -101.702447 17.842987 -101.479498 17.643506 -101.336341 17.516777 -100.951460 17.326684 -100.829424 17.167099 -100.641678 17.115469 -100.355364 17.019248 -100.045582 16.944150 # -b -113.150309 18.150423 -113.150309 18.129301 -113.150309 18.150423 # -b -155.752407 20.044319 -155.477827 19.950445 -155.189167 19.826063 -155.069478 19.659438 -154.923974 19.544443 -154.780817 19.323840 -154.959177 19.157215 -155.376913 19.051608 -155.520070 18.842739 -155.818118 18.978856 -155.940154 19.492813 -155.829853 19.919937 -155.829853 19.919937 # -b 166.489178 19.366083 166.500912 19.323840 166.500912 19.323840 166.489178 19.366083 # -b 166.888140 11.415006 167.019562 11.447862 166.965585 11.316439 166.754370 11.154507 166.721514 11.361029 166.888140 11.415006 166.888140 11.415006 # -b 145.360621 20.013810 145.292563 19.992688 145.292563 19.992688 # -b 145.888659 18.138689 145.900393 18.087058 145.855803 18.096446 145.879272 18.129301 145.888659 18.138689 # -b 145.790092 15.017398 145.768970 14.975155 145.757236 15.050254 145.790092 15.017398 # -b 144.952272 13.513077 144.907682 13.405122 144.806768 13.254925 144.818502 13.437978 144.952272 13.513077 144.952272 13.513077 # -b 119.946743 11.891414 120.045311 11.741216 120.000721 11.696626 # -b 119.967865 12.227011 120.176733 12.163646 120.200202 12.032224 120.012455 12.086201 # -b 120.376214 13.416856 120.542840 13.480221 120.927721 13.480221 121.347804 13.287780 121.514429 12.963917 121.556672 12.574343 121.392394 12.292722 121.005166 12.445267 120.796298 13.039016 120.519371 13.395735 120.376214 13.416856 # -b 122.253682 18.422656 122.263070 18.213787 122.152768 17.622385 122.340515 17.284441 122.474285 16.913641 122.230214 16.298770 122.009612 16.073474 121.612996 15.712061 121.404128 15.296671 121.591875 14.792102 121.634118 14.416608 121.845333 14.019993 122.241948 13.933160 122.286538 14.149069 122.716009 14.332122 123.058647 13.977750 123.279249 13.836940 123.413019 13.954282 123.842490 13.794697 123.589032 13.567054 123.854224 13.297168 123.908201 13.092993 123.931669 13.039016 124.107682 12.790251 123.887080 12.628320 123.964525 12.865350 123.478730 13.017894 123.168948 13.416856 122.838044 13.675008 122.507141 13.663274 122.694887 13.200948 122.319394 13.545932 121.922779 13.879183 121.490961 13.707864 121.094346 13.707864 120.730586 13.782963 120.697731 14.266411 120.918333 14.653639 120.608551 14.491707 120.322237 14.749859 120.057045 15.306059 120.057045 15.306059 # -b 119.967865 16.211937 120.343359 16.392643 120.432538 17.157712 120.432538 17.906352 120.596817 18.464899 121.038022 18.579894 121.666974 18.307661 122.042467 18.528263 122.253682 18.422656 122.253682 18.422656 # -b 121.889923 14.996276 122.009612 14.921178 121.932166 14.663026 121.889923 14.996276 122.000224 15.038520 # -b 121.866455 13.320636 121.833599 13.503689 122.087057 13.470834 122.077670 13.200948 121.866455 13.320636 121.866455 13.320636 # -b 121.988490 12.445267 122.098791 12.607198 122.021346 12.130791 121.988490 12.445267 # -b 122.441429 12.445267 122.551730 12.466388 122.662032 12.304457 122.441429 12.445267 122.441429 12.445267 # -b 123.004670 13.114115 123.103237 13.027282 123.290983 12.855963 123.302718 12.780864 123.058647 12.996773 123.004670 13.114115 # -b 123.654743 12.628320 123.743923 12.508631 123.678211 12.520365 123.654743 12.628320 # -b 123.258128 12.562608 123.389551 12.466388 123.743923 12.250479 124.030237 11.924269 123.985647 11.783459 123.600766 12.109669 123.269862 11.968859 123.258128 12.238745 123.246394 12.508631 123.258128 12.562608 # -b 124.318897 12.520365 124.372874 12.532100 124.593477 12.508631 125.001826 12.586077 125.323343 12.337312 125.487621 12.022836 125.553333 11.415006 125.731692 11.055940 125.255284 11.109918 124.947849 11.447862 124.957236 11.729482 124.548887 12.065079 124.318897 12.478122 124.318897 12.520365 # -b 121.932166 11.870292 122.143381 11.849171 122.417961 11.576938 122.826310 11.544082 123.091503 11.511226 122.894368 11.001963 122.518875 10.664019 122.009612 10.391786 122.009612 11.067674 122.033080 11.675505 121.932166 11.870292 # -b 122.650298 10.664019 122.683153 10.490353 122.551730 10.556064 122.650298 10.664019 # -b 122.960080 10.828297 123.213538 10.924518 123.511586 10.717996 123.368429 10.215773 123.368429 10.215773 # -b 122.563465 9.964662 122.826310 10.499740 122.960080 10.828297 122.960080 10.828297 # -b 124.405730 11.654383 124.527766 11.654383 124.516031 11.490105 124.405730 11.654383 124.405730 11.654383 # -b 124.318897 11.490105 124.429199 11.337561 124.748368 11.349295 125.001826 10.957373 125.177839 10.337809 125.013560 10.227507 124.769490 10.260363 124.670923 10.924518 124.417464 11.077062 124.318897 11.480717 124.318897 11.490105 # -b 125.553333 10.161796 125.621391 10.466885 125.687102 10.161796 # -b 125.654246 9.943540 125.586188 10.042108 125.553333 10.161796 # -b 123.997381 11.217872 124.030237 11.055940 124.020849 10.391786 123.699333 10.020986 123.699333 10.020986 # -b 123.368429 9.856708 123.589032 10.337809 123.833102 10.858806 123.997381 11.217872 123.997381 11.217872 # -b 123.985647 9.955275 124.307163 10.119553 124.572355 10.020986 124.572355 10.020986 # -b 110.883266 20.034931 110.782352 19.523321 110.496038 18.915491 110.141666 18.537651 110.064221 18.455511 # -b 119.449214 11.337561 119.526660 11.217872 119.514926 10.947986 119.604106 10.544330 119.282589 10.152409 119.130045 10.009252 # -b 118.510480 9.844973 118.874240 10.260363 119.216878 10.532596 119.273202 10.849419 119.360035 10.882274 119.383503 11.142773 119.449214 11.337561 # -b 119.878685 11.924269 119.890419 11.924269 119.946743 11.891414 # -b 120.000721 11.696626 119.878685 11.882026 119.878685 11.924269 # -b 119.913888 12.292722 119.890419 12.283335 119.967865 12.227011 # -b 120.012455 12.086201 119.946743 12.250479 119.913888 12.292722 # -b 120.057045 15.306059 119.857564 15.892767 119.967865 16.211937 119.967865 16.211937 # -b 102.988513 11.642649 102.690465 12.065079 102.469862 12.151912 102.082634 12.466388 101.531128 12.649441 101.000743 12.670563 100.923298 12.748008 100.967888 13.384001 100.526683 13.557667 100.008032 13.449712 100.029154 12.769130 100.029154 12.769130 # -b 104.490487 10.466885 104.237029 10.598307 103.784090 10.556064 103.694910 10.882274 103.462573 11.077062 103.131670 11.109918 103.122282 11.337561 102.955657 11.609793 102.988513 11.642649 102.988513 11.642649 # -b 107.050884 17.030983 107.426378 16.681304 107.912173 16.308157 108.123388 16.148573 108.243077 16.073474 108.254811 16.085208 108.564593 15.573598 108.872028 15.092497 109.104365 14.407221 109.202932 13.836940 109.238135 13.534198 109.247522 13.179826 109.336702 12.834841 109.348436 12.703419 109.214666 12.499244 109.127833 12.412411 109.202932 11.914882 109.181811 11.795193 109.059775 11.598059 108.827439 11.316439 108.275932 11.001963 107.891051 10.717996 107.438112 10.478619 107.050884 10.466885 106.741102 10.281485 106.630801 10.086697 106.630801 10.086697 # -b 106.609679 9.988130 106.499378 10.009252 # -b 104.997404 9.868442 104.809657 10.194652 104.490487 10.466885 # -b 106.168474 20.053706 105.760125 19.417714 105.626355 18.800496 106.091029 18.234909 106.433667 17.634119 106.961705 17.167099 107.050884 17.030983 # -b 110.064221 18.455511 109.712195 18.192666 109.369558 18.317048 108.684282 18.676114 108.651426 19.302719 109.170077 19.741577 109.536183 19.980954 109.932798 19.992688 # -b 104.004692 10.445763 104.082138 10.107819 103.927247 10.391786 104.004692 10.445763 # -b 98.571769 10.173530 98.628093 10.783707 98.848696 11.576938 98.672683 11.837436 98.717273 12.032224 98.682070 12.694031 98.428612 13.416856 98.229131 13.611644 97.942817 14.587927 97.733949 15.754304 97.710481 16.413765 97.710481 16.509985 97.182443 16.796299 96.828071 17.242198 96.652058 16.702426 95.922192 16.254180 95.358952 15.766038 95.060904 15.925623 94.575109 15.904502 94.377975 16.010109 94.267673 16.031231 94.387362 16.606205 94.553987 17.537899 94.387362 18.202053 94.145638 18.727744 93.880446 18.906104 93.615253 19.387205 93.648109 19.492813 93.472096 19.804942 93.472096 19.804942 # -b 98.639827 9.964662 98.571769 10.173530 # -b 100.029154 12.769130 99.808551 11.914882 99.522237 11.175629 99.346225 10.717996 99.191334 10.260363 99.191334 10.009252 # -b 98.527179 11.804581 98.339432 11.588672 98.595237 11.717748 98.527179 11.804581 # -b 98.339432 11.762338 98.273721 11.490105 98.339432 11.762338 98.339432 11.762338 # -b 98.374635 12.670563 98.384022 12.358434 98.374635 12.670563 # -b 92.929977 13.524811 92.843145 13.287780 92.699988 12.487510 92.667132 12.097935 92.566218 11.708360 92.753965 11.567550 92.777433 12.076814 92.897122 12.541487 92.897122 13.027282 93.007423 13.362879 92.929977 13.524811 # -b 86.572401 20.199210 85.732234 19.762699 84.939004 19.283944 84.298318 18.528263 84.021391 18.286539 83.326728 17.727993 82.322283 17.009861 82.101680 16.500598 81.428138 16.308157 81.073766 16.010109 80.620827 15.817669 80.125645 15.465643 80.125645 15.465643 # -b 79.980141 14.888322 80.069321 14.587927 80.092789 14.374365 80.069321 14.019993 80.167888 13.621031 80.113911 13.578788 80.268802 13.233803 80.224212 12.963917 80.003610 12.271601 80.003610 12.271601 # -b 73.577975 15.754304 73.411350 16.031231 73.247071 16.362135 73.169626 16.880785 73.103914 17.314950 72.916167 17.824213 72.859843 18.033081 72.826988 18.286539 72.794132 18.748866 72.859843 18.969468 72.749542 19.105585 72.695565 19.199458 72.627507 19.513934 72.585264 19.887081 72.594651 19.950445 # -b 73.610831 15.744917 73.709398 15.486765 73.899491 15.498499 73.819699 15.317793 73.920613 15.005664 73.941734 14.954033 # -b 80.125645 15.465643 79.980141 14.888322 79.980141 14.888322 # -b 80.003610 12.271601 79.750151 11.630915 79.750151 10.957373 79.783007 10.466885 79.783007 10.272097 79.529549 10.337809 79.186911 10.096085 79.186911 10.096085 # -b 76.337853 9.746406 75.819203 11.142773 75.377998 11.882026 75.035360 12.292722 74.814757 13.050750 74.594155 13.846327 74.317228 14.470585 73.941734 14.954033 73.941734 14.954033 # -b 49.905449 11.497145 50.480424 11.931310 50.665824 11.964165 50.975606 11.877333 51.053051 11.530001 51.085907 11.018391 51.064786 10.485659 51.118763 10.387092 50.832449 10.159449 # -b 54.404332 12.569649 54.359742 12.374862 53.819970 12.288029 53.479679 12.656482 53.730790 12.569649 54.040573 12.635360 54.404332 12.569649 # -b 57.689901 20.070134 57.668780 19.736883 57.678167 19.518628 57.788468 19.140787 57.448177 18.995284 57.051562 18.901410 56.619744 18.532957 56.389754 17.995532 55.882838 17.901658 55.451020 17.744420 55.242152 17.448719 54.976960 17.002821 54.646056 16.993433 54.096897 17.002821 53.489066 16.770484 52.806137 16.526413 52.308608 16.165000 52.254631 15.770732 52.034028 15.590026 51.649148 15.460950 51.020196 15.172289 50.391244 14.958727 50.048606 14.820264 # -b 39.994764 15.301365 40.379645 15.000970 40.701162 14.766287 41.262055 14.552725 41.592959 14.090398 42.067020 13.691436 42.386189 13.325330 42.740561 12.980345 43.059731 12.797292 43.334311 12.386596 43.181766 11.898454 42.740561 11.605100 42.782804 11.485411 43.224009 11.452555 43.390635 11.356335 43.831840 10.769626 44.690781 10.333115 45.462890 10.671059 46.014396 10.779014 46.941396 10.877581 47.722892 11.149814 48.208687 10.779014 49.001917 11.248381 49.708315 11.464290 49.905449 11.497145 # -b 42.684237 16.409071 42.639647 16.622633 42.541080 16.854970 42.419045 17.066185 42.275888 17.216383 42.233645 17.385355 42.034164 17.669322 41.625815 17.995532 41.428681 18.270111 41.229200 18.659686 41.118898 18.762947 41.064921 18.962428 40.919417 19.413020 40.743405 19.612501 40.546271 19.882387 40.457091 19.997382 # -b 43.468080 12.698725 43.411756 12.905246 43.346045 13.001467 43.214622 13.283087 43.214622 13.649193 43.038609 14.036421 42.961164 14.444770 42.937696 14.658332 42.827394 14.883628 42.782804 15.097190 42.618526 15.289631 42.707706 15.385851 42.639647 15.716755 42.773417 15.888074 42.717093 16.366828 42.684237 16.409071 # -b 50.048606 14.820264 49.598014 14.754552 49.067629 14.498747 48.760193 14.090398 48.220421 13.961322 47.668915 13.832246 47.457700 13.628072 46.896806 13.433284 46.422746 13.412163 45.981541 13.391041 45.484012 13.046056 44.890262 12.743315 44.183865 12.656482 43.730926 12.710459 43.468080 12.698725 # -b 37.183256 20.152273 37.227846 19.455263 37.448448 18.784068 37.821595 18.605709 38.131377 18.302967 38.307390 18.248990 38.450547 18.091752 38.715739 17.765542 39.013787 16.981699 39.234390 16.122757 39.487848 15.536049 39.807017 15.226266 39.994764 15.301365 39.994764 15.301365 # -b 13.611644 14.411915 13.886223 14.123254 14.062236 13.595216 14.592621 13.574094 14.977502 13.520117 15.066682 13.175132 14.580887 12.818413 14.580887 12.818413 # -b 13.611644 14.411915 13.215029 14.327428 13.015548 14.024687 13.236150 13.649193 13.632765 13.207988 13.874489 12.668216 14.139682 12.536793 14.449464 12.806679 14.569152 12.806679 # -b -10.039761 29.387069 -9.894257 29.638181 -9.729978 29.849396 # -b -16.179081 28.553943 -16.599165 28.368543 -16.599165 28.009477 -16.169694 28.417827 -16.179081 28.553943 -16.179081 28.553943 # -b -15.606454 28.145594 -15.737876 27.852239 -15.496152 27.725510 -15.320140 27.892136 -15.517274 28.124472 -15.606454 28.145594 # -b -13.808778 28.690059 -13.996525 28.572718 -14.196006 28.241814 -14.196006 28.115085 -13.808778 28.436601 -13.808778 28.690059 # -b -13.379307 29.185242 -13.578788 29.086675 -13.775922 28.863725 -13.501342 28.962292 -13.379307 29.185242 # -b -16.202550 19.934018 -16.146226 20.236759 -16.322238 20.588785 -16.500598 20.579397 -16.709466 21.004174 -16.775178 21.116822 -16.930069 21.198962 -16.840889 21.827914 -16.423152 22.372379 -16.047659 23.045921 -15.737876 23.677220 -15.618188 23.979961 -15.209838 24.435247 -14.724044 25.068893 -14.404874 26.106194 -13.754801 26.601376 -13.203294 27.380525 -12.905246 27.821730 -12.452307 27.969581 -11.560510 28.232427 -10.898702 28.758118 -10.314340 29.135958 -10.039761 29.387069 -10.039761 29.387069 # -b -78.076858 26.819632 -78.053390 26.779736 -78.011147 26.650660 -78.473473 26.631885 -79.001511 26.699943 -78.506329 26.800857 -78.076858 26.819632 -78.076858 26.819632 # -b -77.128737 26.345571 -77.095881 26.404242 -77.248425 25.916100 -77.304749 26.195374 -77.239038 26.561480 -77.128737 26.345571 -77.128737 26.345571 # -b -77.382195 25.038384 -77.403316 25.108789 -77.382195 25.038384 -77.382195 25.038384 # -b -78.109714 25.078280 -77.943088 24.857678 -77.844521 24.505652 -78.086245 24.362495 -78.374906 24.594832 -78.318582 24.967979 -78.229402 25.197969 -78.109714 25.078280 # -b -77.790544 24.313212 -77.921967 24.151280 -77.701364 24.282703 -77.790544 24.313212 # -b -77.832787 24.010470 -77.612185 23.869660 -77.832787 24.010470 -77.832787 24.010470 # -b -76.246327 25.197969 -76.201737 25.127564 -76.213471 24.806047 -76.368362 24.906961 -76.246327 25.197969 -76.246327 25.197969 # -b -75.441362 24.343721 -75.342795 24.172402 -75.485952 24.313212 -75.748797 24.686359 -75.638496 24.665237 -75.441362 24.343721 -75.441362 24.343721 # -b -74.526096 24.163014 -74.481506 24.010470 -74.514362 24.163014 # -b -75.298205 23.595080 -75.176170 23.289992 -74.922711 22.994291 -75.131580 23.116326 -75.220760 23.463658 -75.298205 23.595080 # -b -74.096626 22.658693 -74.096626 22.729098 -74.174071 22.729098 -74.404061 22.790116 -74.272638 22.832359 -73.953469 22.689202 -74.260904 22.229222 -74.063770 22.576554 -74.096626 22.658693 # -b -72.773011 22.341870 -73.148504 22.372379 -72.773011 22.341870 -72.773011 22.341870 # -b -72.221504 21.971070 -71.890601 21.910053 -71.583165 21.724653 -72.057226 21.931174 -72.331806 21.888931 -72.221504 21.971070 # -b -73.047590 21.396096 -73.103914 21.086314 -73.655421 20.961931 -73.291661 21.198962 -73.047590 21.396096 # -b -80.071668 22.933273 -79.663318 22.637572 -79.200992 22.402888 -78.780908 22.341870 -78.771521 22.360645 -78.374906 22.186979 -78.011147 21.879544 -77.656774 21.827914 -77.403316 21.755162 -77.084147 21.539253 -76.764977 21.332731 -76.598352 21.271714 -76.091435 21.126210 -75.706554 21.055805 -75.748797 20.764797 -75.319327 20.755410 -74.791289 20.567663 -74.371205 20.349407 -74.228048 20.152273 -74.955567 20.006769 -74.955567 20.006769 # -b -77.656774 19.840144 -77.149858 20.494911 -77.778810 20.703780 -78.450005 20.961931 -78.715197 21.569762 -79.475572 21.612005 -79.928511 21.694144 # -b -78.053390 22.290240 -78.285726 22.391154 -77.975944 22.043822 -77.689630 21.919440 -77.921967 22.217488 -78.053390 22.290240 # -b -81.449260 30.107548 -81.273247 29.579510 -81.019789 29.077287 -80.700620 28.563330 -80.644296 27.969581 -80.381450 27.439196 -80.181969 26.850141 -80.170235 26.195374 -80.346247 25.587543 -80.390837 25.418571 -80.864898 25.179194 -81.252126 25.308270 -81.416404 25.808146 -81.693331 25.927835 -82.000766 26.462913 -81.979645 26.690556 -82.143923 26.958095 -82.319936 26.927586 -82.573394 27.244409 -82.662574 27.734898 -82.740019 28.018865 -82.883176 28.096310 -82.784609 28.748730 -83.026333 29.213404 -83.446417 29.579510 -83.479272 29.722667 -83.742118 29.964391 # -b -84.415660 30.079386 -84.624528 29.955004 -84.955432 29.809500 -85.342659 29.743788 -85.495204 29.964391 # -b -89.862664 30.001940 -89.752363 29.992553 # -b -89.388603 30.020715 -89.585737 29.790725 -89.609206 29.464515 -89.212591 29.222791 -89.421459 29.049125 -89.818074 29.387069 -89.961231 29.483290 # -b -82.310548 23.177344 -81.935055 23.177344 -81.472728 23.128060 -81.052645 23.076430 -80.578584 22.994291 -80.071668 22.933273 -80.071668 22.933273 # -b -79.928511 21.694144 -80.489404 22.053210 -80.810921 22.074331 -81.219270 22.208101 -81.615885 22.186979 -82.167392 22.320749 -81.726187 22.515536 -82.319936 22.668081 -82.993477 22.607063 -83.488660 22.229222 -84.040166 22.053210 -84.448515 21.818526 -84.579938 21.806792 -85.000022 21.867810 -84.460249 22.013314 -84.272503 22.607063 -83.643551 22.881643 -83.047455 23.015412 -82.474827 23.198465 -82.310548 23.177344 # -b -83.014599 21.900665 -82.683695 21.539253 -83.148369 21.581496 -83.014599 21.900665 -83.014599 21.900665 # -b -86.797697 20.609906 -87.051155 20.328286 -86.797697 20.609906 # -b -90.017555 21.302222 -89.355748 21.417217 -88.715062 21.560374 -88.121312 21.684757 -87.569806 21.600271 -86.896264 21.396096 -86.929120 20.858671 -87.304614 20.516033 -87.492360 20.018504 -87.492360 20.018504 # -b -94.999886 29.241566 -95.077332 29.037391 -95.121921 28.920049 -95.387114 28.736996 -95.628838 28.579758 -95.849440 28.492925 -96.114633 28.424867 -96.060655 28.492925 -95.739139 28.629042 -95.706283 28.687713 -95.917499 28.629042 -96.037187 28.579758 -96.081777 28.736996 -96.126367 28.697100 -96.170957 28.638429 -96.224934 28.697100 -96.325848 28.610267 -96.445536 28.687713 -96.501860 28.542209 -96.400947 28.424867 -96.579306 28.375584 -96.701341 28.260589 -96.811643 28.152634 -96.975921 28.122125 -97.065101 28.025905 -96.954800 28.035292 -97.032245 27.819384 -97.241114 27.800609 -97.273969 27.760713 -97.196524 27.554191 -97.229379 27.288999 -97.351415 27.251450 -97.494572 27.279612 -97.449982 27.190432 -97.339681 27.063703 -97.363149 26.915852 -97.407739 26.756267 -97.351415 26.500462 -97.339681 26.439445 -97.285703 26.282207 -97.163668 25.974771 -97.086222 25.913753 -97.086222 25.883245 -97.184790 25.664989 -97.142546 25.585197 -97.032245 25.735394 -97.086222 25.474895 -97.262235 25.324698 -97.494572 25.373981 -97.550896 25.174500 -97.628341 24.944511 -97.748030 24.763804 -97.792620 24.601873 -97.748030 24.289744 -97.738643 23.944759 -97.661197 23.773440 -97.604873 23.245402 -97.595486 22.776035 -97.694053 22.285546 -97.637729 22.081372 -97.482838 21.813833 -97.273969 21.597924 -97.175402 21.339772 -97.285703 21.154372 -97.196524 20.947850 -97.130812 20.832855 -96.877354 20.438587 -96.546450 20.138192 -96.457271 20.002076 # -b -97.318559 25.275414 -97.262235 25.183888 -97.330293 25.033690 -97.407739 25.143992 -97.318559 25.275414 -97.318559 25.275414 # -b -96.865620 27.936725 -96.811643 28.014171 -96.666139 28.131513 -96.490126 28.239467 -96.412681 28.180796 -96.666139 27.955500 -96.931331 27.683267 -96.964187 27.760713 -96.865620 27.899176 -96.865620 27.936725 # -b -89.961231 29.483290 -90.137244 29.290849 -90.501003 29.232178 -90.822519 29.194629 -91.219135 29.272075 -91.582894 29.570123 -91.956041 29.818887 -92.200112 29.675730 -92.364390 29.598285 -92.927631 29.703892 -93.544848 29.809500 -94.293489 29.675730 -94.692451 29.520839 -94.701838 29.551348 -94.812139 29.809500 -94.988152 29.598285 -94.999886 29.396457 -94.999886 29.396457 # -b -90.634773 19.891775 -90.491616 20.652149 -90.271013 21.210696 -90.017555 21.302222 # -b -110.113504 24.238113 -109.716889 23.944759 -109.561998 23.693647 -109.341395 23.367437 -109.540876 23.010718 -109.892902 22.848787 -109.991469 22.970822 # -b -110.036059 27.054315 -109.827190 26.875956 -109.672299 26.678822 -109.461084 26.638926 -109.219360 26.439445 -109.064469 26.261085 -109.231094 26.063951 -109.296806 25.744781 -109.043347 25.545300 -108.843866 25.625093 -108.811011 25.514792 -108.688975 25.303576 -108.268892 25.143992 -108.038902 25.054812 -107.818299 24.773192 -107.783097 24.522080 -107.409950 24.228726 -107.076700 23.965880 -106.867831 23.834458 -106.769264 23.742931 -106.680084 23.510594 -106.447748 23.346316 -106.349181 23.144488 -106.062867 22.898070 -105.708495 22.571860 -105.565338 22.367686 -105.443302 21.947602 -105.311880 21.701184 -105.112399 21.360893 -105.112399 20.966625 -105.300145 20.760104 -105.145254 20.595825 -105.398712 20.429200 -105.455037 20.253187 -105.356469 20.044319 # -b -114.375357 30.027755 -114.208732 29.710933 -114.011597 29.663996 -113.779261 29.443394 -113.514068 29.192282 -113.436623 28.997495 -113.260610 28.873113 -113.072863 28.793320 -112.896851 28.424867 -112.763081 28.384971 -112.685636 28.220692 -112.598803 27.859280 -112.354732 27.594087 -112.089539 27.141148 -112.012094 27.082477 -111.880671 26.944014 -111.737514 26.608417 -111.681190 26.568520 -111.681190 26.777389 -111.448853 26.629538 -111.317431 26.371386 -111.228251 26.113234 -111.150805 25.735394 -111.007648 25.545300 -110.852757 25.315311 -110.831636 25.153379 -110.622767 24.822475 -110.611033 24.451675 -110.378697 24.158321 -110.113504 24.238113 -110.113504 24.238113 # -b -109.991469 22.970822 -110.280130 23.519982 -110.599299 23.742931 -110.974793 24.066794 -111.329165 24.249847 -111.516912 24.461063 -111.615479 24.491571 -111.758636 24.672278 -111.979238 24.702787 -112.113008 24.693399 -112.002707 25.064199 -111.979238 25.404490 -112.113008 25.883245 -112.366466 26.162518 -112.709104 26.340877 -112.929706 26.608417 -112.983684 26.826672 -113.150309 26.768001 -113.448357 26.737493 -113.657225 26.904118 -113.877828 26.993298 -114.053840 27.141148 -114.297911 27.190432 -114.396478 27.446237 -114.617081 27.535417 -114.771972 27.673880 -114.872886 27.770100 -114.286177 27.779487 -114.032719 27.819384 -114.011597 27.976622 -113.910683 28.143247 -113.934152 28.307525 -114.110164 28.600880 -114.330767 28.833216 -114.518514 28.997495 -114.717995 29.180548 -114.861152 29.375335 -115.093488 29.480943 -115.346947 29.626447 -115.612139 29.797766 -115.656729 29.971431 # -b -112.685636 30.152138 -112.554213 29.788378 -112.420443 29.645221 -112.321876 29.335439 -112.101274 29.142999 -111.934648 28.861378 -111.779757 28.619654 -111.526299 28.406092 -111.415998 28.366196 -111.174274 28.063454 -110.897347 27.917951 -110.566443 27.859280 -110.500732 27.683267 -110.533588 27.516642 -110.456142 27.328895 -110.324719 27.190432 -110.036059 27.054315 -110.036059 27.054315 # -b -118.228860 28.959945 -118.238247 29.006882 -118.172536 29.093715 -118.139680 28.901275 -118.160802 28.823829 -118.228860 28.959945 -118.228860 28.959945 # -b -115.081754 27.976622 -115.159200 28.014171 -115.159200 28.131513 -115.060633 28.307525 -115.048899 28.103351 -115.048899 27.995396 -115.081754 27.976622 # -b -112.983684 28.969333 -113.105719 28.997495 -113.269997 29.201670 -113.424889 29.412885 -113.382646 29.452781 -113.183165 29.220444 -113.040008 29.037391 -112.983684 28.969333 -112.983684 28.969333 # -b -112.366466 28.978720 -112.342998 29.142999 -112.188106 29.065553 -112.145863 28.861378 -112.188106 28.736996 -112.375853 28.774546 -112.411056 28.901275 -112.366466 28.978720 # -b -159.617644 22.090759 -159.528465 22.081372 -159.352452 22.100146 -159.373574 21.802098 -159.617644 21.802098 -159.695090 21.978111 -159.617644 22.090759 # -b -158.115670 21.379668 -157.906802 21.421911 -157.728442 21.206002 -158.059346 21.236511 -158.115670 21.379668 -158.115670 21.379668 # -b -157.242647 21.081620 -157.155814 21.051111 -156.747465 21.060498 -156.846032 20.914995 -157.165202 20.936116 -157.242647 21.081620 -157.242647 21.081620 # -b -156.404827 20.790612 -156.315647 20.823468 -156.005865 20.626334 -156.238202 20.417466 -156.482273 20.687352 -156.646551 20.823468 -156.458804 20.823468 -156.404827 20.790612 # -b -155.874442 20.044319 -155.829853 20.053706 -155.752407 20.044319 # -b -155.829853 19.919937 -155.874442 20.044319 -155.874442 20.044319 # -b -156.977455 20.750716 -156.968068 20.781225 -156.801442 20.677964 -156.935212 20.647455 -156.935212 20.647455 -156.977455 20.750716 # -b -177.434817 28.162022 -177.434817 28.162022 # -b 153.950038 24.350761 153.881979 24.329640 153.872592 24.339027 153.938303 24.390657 153.938303 24.390657 # -b 145.316031 20.002076 145.360621 20.013810 # -b 145.292563 19.992688 145.304297 20.002076 145.316031 20.002076 # -b 119.913888 26.519237 120.078166 26.857181 120.355093 27.082477 120.542840 27.387566 120.662528 27.711429 120.951189 28.035292 121.270358 28.171409 121.469839 28.366196 121.535551 28.715875 121.556672 28.997495 121.490961 29.152386 121.833599 29.201670 121.854720 29.431659 121.756153 29.549001 121.657586 29.549001 122.021346 29.856437 121.666974 29.931535 121.568407 29.980819 # -b 121.446371 25.275414 121.657586 25.143992 121.854720 25.043078 121.779622 24.742683 121.657586 24.259235 121.547285 23.834458 121.458105 23.376825 121.326682 23.071736 121.016900 22.623491 120.850275 22.069638 120.674262 22.233916 120.188467 22.806544 120.078166 23.449577 120.254179 24.017511 120.685997 24.611260 121.127202 25.104095 121.404128 25.263680 121.404128 25.263680 # -b 123.732188 24.421166 123.865958 24.310865 123.711067 24.339027 123.732188 24.421166 # -b 124.107682 24.400045 124.185128 24.470450 124.217983 24.369536 124.107682 24.400045 # -b 127.794560 26.519237 127.883740 26.706984 128.193522 26.866569 128.005775 26.528624 127.862618 26.350265 127.740583 26.141397 127.717115 26.430057 127.794560 26.519237 127.794560 26.519237 # -b 128.932775 27.791222 128.953897 27.720817 128.867064 27.840505 128.899919 27.878054 128.921041 27.800609 128.932775 27.791222 # -b 129.395102 28.415480 129.618051 28.483538 129.463160 28.279363 129.320003 28.190184 129.296535 28.366196 129.395102 28.415480 # -b 125.311609 24.822475 125.278753 24.834209 125.433644 24.723908 125.311609 24.822475 125.311609 24.822475 # -b 109.911676 20.386957 110.397471 20.595825 110.284823 21.142638 110.826942 21.400790 111.202436 21.515784 111.831388 21.762202 112.075458 21.752815 112.361772 21.813833 112.671555 21.874850 112.969603 21.978111 112.957868 22.337177 113.112760 22.520230 113.399073 22.255038 113.530496 22.327789 113.509375 22.632878 113.542230 22.818278 113.873134 22.592982 113.962314 22.428703 114.204038 22.377073 114.227506 22.470946 114.204038 22.541351 114.281483 22.553086 114.525554 22.553086 114.570144 22.623491 114.734423 22.776035 114.912782 22.614103 115.321131 22.797156 115.551121 22.705630 115.738868 22.806544 116.104974 22.879296 116.313843 22.949701 116.567301 23.083470 116.787903 23.397946 117.053096 23.611508 117.306554 23.712422 117.449711 23.703035 117.604602 23.752318 117.747759 23.956493 118.069275 24.329640 118.024685 24.491571 118.423647 24.561976 118.599660 24.601873 118.709961 24.763804 118.853118 24.932776 119.061987 25.205009 119.205144 25.254293 119.350647 25.453774 119.437480 25.594584 119.547781 25.763556 119.625227 25.993546 119.615840 26.052217 119.726141 26.310369 119.615840 26.540358 119.702673 26.756267 119.878685 26.549746 119.913888 26.519237 # -b 110.496038 20.065440 110.683785 20.065440 110.883266 20.034931 # -b 109.932798 19.992688 110.329413 20.074828 110.496038 20.065440 # -b 113.950580 22.264425 113.863747 22.233916 113.950580 22.264425 # -b 107.945029 21.473541 108.254811 21.421911 108.496535 21.710572 109.059775 21.576802 109.357823 21.421911 109.733317 21.452420 109.590160 21.029990 109.911676 20.386957 109.911676 20.386957 # -b 107.945029 21.473541 107.724426 21.433645 107.348932 21.102741 106.830282 20.832855 106.553355 20.377569 106.168474 20.053706 # -b 92.268170 20.884486 92.026446 21.391402 91.871555 22.233916 91.439737 22.776035 90.867109 22.766648 90.623039 22.724405 90.545593 22.276159 90.280401 21.917093 90.116122 21.844341 # -b 93.472096 19.804942 92.786820 20.271962 92.521628 20.471443 92.268170 20.884486 92.268170 20.884486 # -b 90.613651 22.684508 90.623039 22.327789 90.855375 22.541351 90.613651 22.684508 90.613651 22.684508 # -b 88.891074 21.628433 88.691593 21.649554 88.581292 21.607311 88.262122 21.534559 88.095497 21.680063 88.083763 21.865463 88.116619 22.081372 88.116619 22.121268 87.928872 21.917093 87.543991 21.628433 86.846981 21.091007 86.771882 20.490218 86.572401 20.199210 # -b 90.116122 21.844341 89.818074 21.853729 89.585737 21.844341 89.287689 21.783324 89.144532 21.719959 88.891074 21.628433 88.891074 21.628433 # -b 72.594651 19.950445 72.728421 20.356448 72.627507 20.914995 72.585264 21.029990 72.496084 21.154372 72.496084 21.400790 72.484350 21.680063 72.463228 21.895972 72.430373 21.987498 72.573530 22.163511 72.794132 22.264425 72.507818 22.306668 72.186302 22.337177 72.132325 22.306668 72.054879 21.935868 72.031411 21.482929 71.679385 21.072233 71.357869 20.936116 71.226446 20.853977 70.686674 20.802347 70.344036 20.823468 70.132821 20.987747 70.132821 20.987747 # -b 69.825386 22.428703 70.266591 22.879296 70.200879 23.113979 70.013132 22.940313 # -b 68.025363 23.773440 67.858738 23.803949 67.551302 23.843845 67.340087 24.127812 67.140606 24.611260 66.866026 24.773192 66.678280 25.125217 66.478799 25.355207 65.993004 25.404490 65.429763 25.373981 65.000293 25.315311 65.000293 25.315311 # -b 70.132821 20.987747 69.262145 21.813833 68.919507 22.346564 69.151844 22.316055 69.503869 22.388807 69.825386 22.428703 # -b 70.013132 22.940313 69.679882 22.848787 69.128376 22.827665 68.565135 23.123367 68.234231 23.571612 68.102809 23.580999 68.025363 23.773440 68.025363 23.773440 # -b 61.616156 25.158073 61.174951 25.136951 60.501410 25.409184 60.015615 25.338779 # -b 65.000293 25.315311 64.591943 25.148685 64.117883 25.366941 63.479543 25.237865 62.716822 25.268374 62.242761 25.136951 61.825025 25.087668 61.616156 25.158073 61.616156 25.158073 # -b 49.938305 26.810245 50.006363 26.533318 50.158907 26.176599 50.083808 25.848042 50.480424 25.418571 50.743269 25.467855 50.975606 25.995893 51.273654 26.075685 51.470788 25.667336 51.527112 25.298883 51.416811 24.726255 51.405077 24.524427 51.482522 24.334333 51.703125 24.132506 51.968317 24.031592 52.463499 24.132506 53.047861 24.202911 53.467945 24.090263 54.073428 24.212298 54.261175 24.282703 54.514633 24.735642 55.209296 25.308270 55.749068 25.737741 56.145684 26.254045 56.378020 26.275166 56.300575 26.085072 56.246598 25.737741 56.267719 25.418571 56.366286 24.695746 56.819225 24.221685 57.161863 24.040979 57.060949 24.080875 57.502154 23.888435 57.889382 23.787521 58.307119 23.656098 58.659144 23.543450 58.914949 23.259483 59.144939 22.994291 59.365541 22.677468 59.619000 22.597675 59.719914 22.330136 59.487577 21.797405 59.079228 21.313957 58.715468 20.837549 58.417420 20.422159 58.187430 20.619293 57.767347 20.152273 57.689901 20.070134 # -b 50.555522 26.235270 50.424100 26.106194 50.555522 26.235270 50.555522 26.235270 # -b 60.015615 25.338779 59.210650 25.477242 58.870359 25.507751 57.931625 25.627440 57.260430 25.927835 57.028094 26.641272 56.896671 26.908812 56.300575 27.134108 55.727947 26.948708 55.307863 26.699943 54.624934 26.493422 53.963127 26.699943 53.411621 26.838407 53.334175 26.958095 52.597269 27.331242 52.165451 27.685614 51.461401 27.852239 51.261920 28.096310 50.942750 28.884847 50.501545 29.387069 50.170641 29.753176 50.048606 29.983166 # -b 56.169152 26.927586 55.760803 26.918199 55.253886 26.582602 55.760803 26.631885 56.169152 26.927586 # -b 40.457091 19.997382 40.182511 20.203904 40.083944 20.267268 # -b 48.495001 28.300485 48.584181 28.086923 48.879882 27.821730 49.234254 27.500214 49.255376 27.342976 49.443122 27.145842 49.806882 26.927586 49.938305 26.810245 # -b 48.262664 28.807401 48.318988 28.572718 48.495001 28.300485 48.495001 28.300485 # -b 48.372966 29.955004 48.372966 29.924495 # -b 48.065530 30.079386 48.208687 29.809500 47.910639 29.551348 47.767482 29.337786 48.098386 29.117183 48.220421 28.816789 # -b 48.551325 30.098161 48.473880 29.973778 # -b 49.663725 30.069999 49.532302 29.945616 49.487712 29.992553 # -b 32.365203 30.163872 32.353469 29.722667 32.529482 29.173507 32.794674 28.631389 33.292203 28.056414 33.477603 27.880401 33.522193 27.518989 33.853097 26.997991 34.085433 26.324450 34.493783 25.667336 34.812952 25.017262 35.120388 24.484531 35.561593 24.080875 35.728218 23.909556 35.662507 23.909556 35.474760 23.726503 35.552205 23.189078 35.552205 23.189078 # -b 36.831231 22.001579 36.896942 21.518131 37.204377 21.107435 37.183256 20.422159 37.183256 20.152273 # -b 35.552205 23.189078 35.793929 22.790116 36.467471 22.360645 36.831231 22.001579 # -b 34.890398 29.492677 34.801218 29.368295 34.735507 29.232178 34.592350 28.826176 34.392869 28.309872 34.360013 27.929685 33.942276 27.842852 33.477603 28.330994 33.191289 28.875459 32.827530 29.377682 32.663251 29.753176 32.574072 29.915107 32.552950 29.992553 # -b 37.910775 24.172402 37.821595 24.221685 37.657316 24.343721 37.403858 24.353108 37.159787 24.735642 37.126932 25.078280 36.906329 25.547647 36.577772 25.887938 36.333701 26.244657 36.059122 26.770348 35.695362 27.134108 35.540471 27.371138 35.409048 27.636330 35.197833 27.969581 34.899785 28.124472 34.625205 28.145594 34.702651 28.321606 34.801218 28.884847 34.911519 29.185242 34.890398 29.492677 # -b 40.083944 20.267268 39.938440 20.328286 39.684982 20.422159 39.321223 20.703780 39.145210 21.107435 39.091233 21.447726 39.058377 21.621392 38.990319 21.849035 38.990319 22.053210 39.058377 22.402888 38.924607 22.759607 38.748595 23.097551 38.593704 23.442536 38.220557 23.928331 37.910775 24.172402 37.910775 24.172402 # -b 0.072752 39.816405 -0.215909 39.389281 -0.159585 39.253164 -0.082139 39.013787 # -b 0.225296 38.652375 -0.302742 38.314430 -0.523344 37.938937 -0.621911 37.617420 -1.196886 37.547015 -1.626357 37.150400 -1.868081 36.798375 -2.508767 36.725623 -3.323119 36.753785 -4.052984 36.725623 -4.658468 36.514408 -5.076204 36.221053 -5.242830 36.113099 -5.618323 36.129527 -6.036060 36.505020 -6.202685 36.868780 -6.575832 37.159787 -6.984181 37.239580 -7.237640 37.220805 # -b -8.725533 40.086291 -8.880424 39.687329 -9.211328 39.269592 -9.255918 38.901139 -9.124495 38.685230 -8.814713 38.504524 -8.561255 38.478709 -8.605844 38.192395 -8.626966 37.800473 -8.615232 37.598646 -8.760736 37.124585 -8.286675 37.115198 -7.690579 37.063567 -7.270495 37.204377 -7.237640 37.220805 # -b -1.945526 35.096919 -1.283719 35.312828 -0.755681 35.772808 -0.347332 35.845560 -0.061018 35.845560 # -b -9.729978 29.849396 -9.607943 30.231930 -9.807424 30.670788 -9.751100 31.266884 -9.509376 31.691662 -9.166738 32.027259 -9.190206 32.046034 -9.068171 32.534175 -8.495543 33.146699 -7.735169 33.498725 -7.007650 33.810854 -6.477265 34.378788 -6.080650 35.096919 -5.782602 35.754033 -5.296807 35.915965 -5.010493 35.538124 -4.634999 35.305788 -4.074106 35.223648 -3.567189 35.268238 -3.081395 35.277626 -2.663658 35.169671 -1.945526 35.096919 -1.945526 35.096919 # -b -16.775178 32.804061 -17.007514 32.813449 -16.754056 32.606927 -16.775178 32.804061 -16.775178 32.804061 # -b -16.190816 33.118537 -16.301117 32.989461 -16.223671 33.109150 # -b -28.572718 38.617172 -28.560984 38.539726 -28.572718 38.617172 # -b -28.042333 38.401263 -28.208958 38.520952 -28.396705 38.452894 -28.042333 38.401263 -28.042333 38.401263 # -b -27.723163 38.572582 -27.734898 38.626559 -28.065801 38.720433 -27.899176 38.581970 -27.723163 38.572582 # -b -27.051969 38.772063 -27.260837 38.704005 -26.983910 38.685230 -27.051969 38.772063 # -b -25.054812 37.835676 -25.573462 37.842716 -25.528873 37.739456 -25.054812 37.835676 -25.054812 37.835676 # -b -24.932776 36.974387 -25.033690 36.974387 -24.932776 36.974387 # -b -31.053322 39.440911 -31.163624 39.415096 -31.053322 39.440911 # -b -64.613065 32.365203 -64.624799 32.374591 -64.735100 32.271330 -64.648267 32.271330 -64.613065 32.365203 # -b -74.019180 40.001805 -74.040301 39.985377 # -b -74.073157 40.001805 -74.174071 39.799977 -74.206927 39.680288 -74.338350 39.518357 -74.460385 39.389281 -74.690375 39.166331 -74.878122 39.013787 -74.910977 39.243777 -75.143314 39.321223 -75.417894 39.457339 -75.495339 39.569987 -75.518808 39.466726 -75.363916 39.098273 -75.122192 38.788491 -75.054134 38.495137 -75.110458 38.356673 -75.286471 38.166580 -75.352182 38.028116 -75.518808 37.755884 -75.638496 37.502425 -75.739410 37.239580 -75.927157 37.204377 -75.992868 37.415592 -75.891954 37.659663 -75.760532 37.877919 -75.683086 37.906081 -75.805121 38.035157 -75.837977 38.192395 -76.002256 38.305043 -76.213471 38.401263 -76.258061 38.520952 -76.112557 38.668802 -76.124291 38.875324 -76.201737 38.917567 -76.213471 39.013787 -76.136025 39.140516 -76.168881 39.262552 -75.981134 39.415096 -75.992868 39.586415 -76.112557 39.440911 -76.300304 39.356425 -76.443461 39.262552 -76.455195 39.149904 -76.499785 38.943382 -76.511519 38.626559 -76.443461 38.443506 -76.499785 38.417691 -76.368362 38.166580 -76.389483 38.166580 -76.544375 38.279228 -76.696919 38.288615 -76.818954 38.349633 -76.863544 38.201782 -76.553762 38.114949 -76.368362 37.992914 -76.312038 37.748843 -76.410605 37.624461 -76.312038 37.502425 -76.290916 37.371003 -76.377749 37.274782 -76.234592 37.124585 -76.389483 37.063567 -76.466929 36.965000 -76.300304 36.920410 -76.180615 36.957960 -75.992868 36.885208 -75.915423 36.620015 -75.936544 36.486246 -75.927157 36.441656 -75.915423 36.352476 -75.793387 36.129527 -75.849711 36.202279 -76.070314 36.167076 -76.290916 36.113099 -76.553762 36.068509 -76.654676 36.272684 -76.499785 35.915965 -76.070314 35.969942 -75.903689 35.880762 -75.715942 35.718831 -75.936544 35.474760 -76.290916 35.350378 -76.422339 35.493534 -76.577230 35.439557 -76.520906 35.350378 -76.532640 35.186099 -76.642942 35.078145 -76.642942 34.998352 -76.401218 34.815299 -76.840076 34.669795 -77.424438 34.505517 -77.602797 34.350626 -77.832787 34.085433 -78.306848 33.930542 -78.804377 33.747489 -79.057835 33.508112 -79.222113 33.350874 -79.332415 33.099763 -79.543630 32.951912 -79.675053 32.895588 -80.050546 32.625702 -80.313392 32.571725 -80.599706 32.597540 -80.745209 32.559991 -80.623174 32.299492 -80.810921 32.215006 -80.897754 32.046034 -81.019789 32.022565 -81.186414 31.778494 -81.395283 31.344330 -81.460994 31.126074 -81.604151 30.764662 -81.550174 30.403249 -81.449260 30.107548 # -b -83.742118 29.964391 -84.251381 30.135710 -84.415660 30.079386 # -b -85.495204 29.964391 -85.804986 30.163872 -86.356492 30.384474 -86.323637 30.518244 -86.961976 30.471307 -87.072277 30.593343 -87.281145 30.537019 -87.799796 30.297642 -87.966421 30.480695 -88.064988 30.945368 -88.219879 30.422024 -88.649350 30.403249 -89.266568 30.337538 -89.585737 30.278867 -89.862664 30.297642 -89.862664 30.297642 # -b -90.137244 30.107548 -89.883785 30.088773 -89.862664 30.001940 # -b -89.752363 29.992553 -89.365135 30.116935 -89.388603 30.020715 # -b -89.862664 30.297642 -90.402436 30.375087 -90.137244 30.107548 -90.137244 30.107548 # -b -117.057789 32.449689 -117.135235 32.700801 -117.224415 33.083335 -117.487260 33.341487 -117.862754 33.609026 -118.205392 33.728714 -118.360283 33.930542 -118.670065 34.059618 -118.780366 34.040844 -119.078414 34.141757 -119.277895 34.298995 -119.585331 34.416337 -119.895113 34.435112 -119.895113 34.435112 # -b -114.861152 31.963894 -114.717995 31.663500 -114.750850 31.407695 -114.661671 30.992305 -114.530248 30.581609 -114.452802 30.105201 -114.375357 30.027755 # -b -115.656729 29.971431 -115.755296 30.372740 -115.898453 30.382128 -116.020488 30.802211 -116.163645 30.943021 -116.262212 31.219948 -116.518017 31.529730 -116.539139 31.785535 -116.682296 31.935732 -116.816065 32.104705 -116.926367 32.320613 -117.057789 32.449689 # -b -114.861152 31.963894 -114.872886 31.945120 -114.673405 31.794922 -114.462190 31.672887 -114.319033 31.625950 -114.121899 31.473406 -113.823851 31.473406 -113.591514 31.398307 -113.370911 31.248110 -113.072863 31.123727 -113.007152 30.849148 -112.896851 30.544059 -112.751347 30.257745 -112.685636 30.152138 # -b -120.071126 33.996254 -119.916235 33.958704 -119.927969 33.895340 # -b -119.784812 34.069006 -119.740222 34.040844 -119.531354 34.005641 -119.519619 33.968092 -119.740222 33.958704 -119.784812 34.069006 # -b -118.393139 33.425973 -118.393139 33.416585 -118.271103 33.360261 -118.306306 33.278122 -118.372017 33.379036 -118.393139 33.425973 # -b -118.503440 33.017623 -118.437728 32.951912 -118.271103 32.813449 -118.339161 32.766512 -118.482318 32.951912 -118.503440 33.017623 # -b -119.895113 34.435112 -120.193161 34.507864 -120.491209 34.590003 -120.535799 34.817646 -120.547533 34.944375 -120.512331 35.000699 -120.524065 35.017127 -120.535799 35.118041 -120.690690 35.244770 -120.777523 35.289360 -120.866703 35.460679 -121.087305 35.631998 -121.418209 36.000451 -121.826558 36.392372 -121.727991 36.650524 -121.993184 36.995509 -122.279498 37.232539 -122.422654 37.603339 -122.312353 37.777005 -122.014305 37.504772 -122.267763 37.943630 -121.904004 38.091481 -122.345209 38.178314 -122.434389 37.934243 -122.610401 37.953018 -122.798148 38.011689 -122.887328 38.152499 -122.941305 38.335552 -123.251087 38.593704 -123.537401 38.861243 -123.647702 39.239083 -123.682905 39.513663 -123.758004 39.792936 -123.912895 39.980683 # -b -120.115716 33.968092 -120.071126 33.996254 -120.071126 33.996254 # -b -119.927969 33.895340 -120.115716 33.968092 -120.115716 33.968092 -120.115716 33.968092 # -b 141.960057 40.022926 142.157191 39.469073 142.046890 39.074805 141.727720 38.765023 141.629153 38.316777 141.054179 37.934243 141.143358 37.143360 140.854698 36.603588 140.744396 35.944127 140.767865 35.603836 140.237480 35.007740 140.237480 35.007740 # -b 139.984022 35.233036 140.192890 35.622610 140.192890 35.622610 # -b 139.972288 39.161638 140.148300 39.750693 140.016877 39.844567 # -b 140.237480 35.007740 139.984022 35.233036 139.984022 35.233036 # -b 140.192890 35.622610 139.805662 35.305788 139.409047 35.261198 139.209566 34.726119 138.911518 34.871623 138.625204 34.925600 138.315422 34.554800 137.731060 34.618165 137.212409 34.554800 137.266387 34.726119 137.057518 34.709692 136.836916 34.981924 136.771204 34.536026 136.836916 34.270833 136.449688 34.134717 136.229086 33.813201 135.701048 33.498725 135.290352 33.803813 135.248108 34.261446 135.522688 34.636940 135.147195 34.608778 134.464266 34.716732 133.978471 34.435112 133.835314 34.489089 133.403496 34.371747 133.016268 34.280221 132.530473 34.298995 132.244160 33.885952 131.758365 34.005641 131.338281 33.914114 130.974522 34.207469 131.460317 34.416337 132.122124 34.827033 132.718220 35.387927 133.304929 35.521697 134.077038 35.495881 134.795169 35.631998 135.325554 35.702403 135.733903 35.477107 136.031951 35.631998 136.151640 36.176464 136.836916 36.932144 137.233531 37.469570 137.212409 37.248967 137.113842 36.915717 137.433012 36.756132 138.151144 37.091729 138.836419 37.654970 139.244769 37.969446 139.507614 38.152499 139.695361 38.628906 139.972288 39.161638 139.972288 39.161638 # -b 140.016877 39.844567 139.805662 39.912625 139.906576 39.980683 # -b 138.604083 38.272187 138.514903 37.812208 138.449192 38.204129 138.604083 38.272187 # -b 134.276519 33.268735 133.570121 33.397811 133.105448 32.879160 132.751076 32.804061 132.575063 33.167821 132.223038 33.360261 132.896580 33.977479 133.436352 33.932889 133.823580 34.226244 134.264785 34.289608 134.661400 33.996254 134.771701 33.794426 134.551098 33.618413 134.276519 33.268735 134.276519 33.268735 # -b 135.060362 34.571228 134.762314 34.207469 135.004038 34.390522 135.060362 34.571228 # -b 130.864220 33.876565 130.676474 33.848403 130.279859 33.564436 130.035788 33.416585 # -b 129.916099 32.656211 130.411281 32.759472 130.235269 33.083335 130.577907 32.766512 130.631884 32.581112 130.401894 32.095317 130.345570 31.464019 130.655352 31.123727 130.688208 31.663500 130.753919 31.445244 130.941666 31.048629 131.251448 31.435857 131.549496 31.879408 131.835810 32.552950 132.035291 32.841611 131.924990 33.174861 131.746630 33.517499 131.239714 33.573823 130.962788 33.857790 130.864220 33.876565 # -b 130.146089 32.477851 130.113233 32.142254 130.146089 32.477851 # -b 131.117679 30.630892 130.962788 30.410290 131.117679 30.630892 # -b 130.545051 30.353966 130.512195 30.210809 130.545051 30.353966 130.545051 30.353966 # -b 130.897076 37.539975 130.885342 37.453142 130.897076 37.539975 # -b 130.035788 33.416585 129.770595 33.306284 129.838654 33.055173 129.958342 32.813449 129.782329 32.766512 129.916099 32.656211 # -b 128.855330 32.721922 128.867064 32.581112 128.855330 32.721922 # -b 129.219089 32.954259 129.054811 32.888547 129.219089 32.954259 129.219089 32.954259 # -b 129.749474 33.839016 129.815185 33.756876 129.749474 33.839016 # -b 129.284800 34.289608 129.320003 34.134717 129.284800 34.289608 # -b 129.406836 34.636940 129.484281 34.425725 129.385714 34.390522 129.406836 34.636940 # -b 128.435246 38.506871 128.810740 37.995261 129.308269 37.460182 129.484281 36.612975 129.618051 36.026266 129.329390 35.352724 128.756763 35.108654 128.536160 35.071104 128.479836 34.953762 128.280355 34.918560 127.994041 34.998352 127.674872 34.899785 127.606813 34.653368 127.451922 34.726119 127.254788 34.498476 127.341621 34.735507 126.989596 34.526638 126.900416 34.453887 126.724403 34.479702 126.360644 34.435112 126.316054 34.489089 126.536656 34.590003 126.492067 34.852848 126.393500 35.007740 126.524922 35.413742 126.736137 35.702403 126.712669 35.988717 126.515535 36.436962 126.426355 36.497980 126.140041 36.596547 126.447477 36.861739 126.855826 36.826537 126.834705 37.072955 126.834705 37.267742 126.602368 37.417939 126.614102 37.530587 126.503801 37.751190 126.503801 37.767618 # -b 126.327788 33.360261 126.426355 33.149046 126.900416 33.463522 126.327788 33.360261 # -b 128.005775 40.022926 127.552836 39.776509 127.564570 39.417443 127.451922 39.264899 127.928330 38.922261 128.435246 38.506871 128.435246 38.506871 # -b 126.569512 37.723028 126.161163 37.723028 125.785669 37.960058 125.654246 37.777005 125.332730 37.662010 125.112128 37.812208 125.255284 37.985873 124.870404 38.021076 125.034682 38.445853 125.344464 38.610132 125.267019 38.765023 125.511090 39.504276 125.135596 39.579374 124.670923 39.546519 124.361140 39.835179 124.393996 39.903238 # -b 121.568407 29.980819 121.347804 30.201421 120.817419 30.095814 120.211936 30.123976 120.850275 30.335191 121.148323 30.544059 121.657586 30.830373 121.800743 31.123727 121.204647 31.597788 120.718852 31.870021 120.155612 31.841859 120.641407 32.020218 121.314948 31.813697 121.911044 31.616563 121.711563 31.945120 121.392394 32.198578 120.960576 32.656211 120.707118 33.325059 120.465394 33.885952 120.078166 34.362360 120.078166 34.362360 # -b 119.845830 35.578021 120.254179 35.927699 120.420804 36.185851 120.796298 36.293805 120.906599 36.516755 121.326682 36.657565 121.845333 36.835924 122.197358 36.950919 122.340515 36.756132 122.605708 37.126932 122.584586 37.347534 122.119913 37.460182 121.591875 37.373349 121.106080 37.591605 120.772829 37.741803 120.233057 37.434367 120.024189 37.312332 # -b 119.803586 39.870382 120.012455 39.980683 # -b 121.955634 40.046395 121.523817 39.553559 121.624731 39.358772 121.624731 38.997359 121.303214 38.696964 121.922779 38.922261 122.241948 39.213268 123.046913 39.546519 123.511586 39.666207 124.107682 39.767121 124.393996 39.903238 124.393996 39.903238 # -b 120.078166 34.362360 119.482070 34.643980 119.392890 35.052329 119.726141 35.514656 119.845830 35.578021 # -b 120.024189 37.312332 119.559516 37.047139 118.918830 37.363962 118.796794 37.767618 118.355589 38.002301 117.991830 38.185354 117.726637 38.706352 118.233554 39.110007 118.763939 39.110007 119.350647 39.358772 119.681551 39.792936 119.803586 39.870382 # -b 49.973507 37.464876 50.435834 37.148053 51.372221 36.723276 52.045763 36.678686 52.674714 36.819496 53.489066 36.979081 53.334175 36.899289 53.885681 36.908676 53.951393 37.436714 53.885681 37.823942 53.876294 38.854202 53.655692 39.241430 53.378765 39.454992 53.876294 39.649780 53.390499 39.853954 53.885681 39.863341 53.885681 39.863341 # -b 53.092451 40.083944 52.961028 39.957215 52.850727 39.957215 # -b 48.879882 38.570235 49.001917 37.866185 49.520568 37.507119 49.973507 37.464876 # -b 49.508834 40.067516 49.332821 39.471420 49.112219 39.215615 48.891616 39.225002 48.858761 38.673496 48.879882 38.570235 # -b 48.372966 29.924495 48.253277 30.001940 48.065530 30.079386 # -b 48.560712 30.116935 48.551325 30.098161 # -b 50.048606 29.983166 49.663725 30.069999 49.663725 30.069999 # -b 49.487712 29.992553 49.201398 30.175606 49.001917 30.537019 48.804783 30.412636 48.626424 30.213155 48.593568 30.079386 # -b 29.861130 31.257497 30.457226 31.466365 30.468960 31.410041 30.612117 31.353717 30.987611 31.503915 31.548505 31.485140 32.100011 31.288006 32.111745 31.288006 # -b 31.724517 31.541464 31.715130 31.372492 31.682274 31.182398 31.780841 31.032201 32.088277 30.860882 32.198578 30.452533 32.198578 30.328150 32.365203 30.163872 # -b 35.937086 35.815051 35.915965 36.296152 36.246869 36.758479 35.761074 36.777253 35.340990 36.608281 34.801218 36.819496 34.756628 36.828884 34.216856 36.500327 33.808507 36.242175 33.423626 36.197585 32.904975 36.063815 32.386325 36.305539 32.022565 36.589506 31.560239 36.767866 31.173011 36.899289 30.698950 36.892248 30.579262 36.519101 30.192034 36.279724 30.192034 36.279724 # -b 34.040844 35.472413 34.404603 35.634345 34.604084 35.589755 34.216856 35.282319 34.040844 34.949069 33.325059 34.702651 32.815796 34.620512 32.353469 35.028861 32.750084 35.164978 33.059866 35.336297 33.235879 35.326909 33.688818 35.390274 34.040844 35.472413 # -b 35.991064 34.740200 35.991064 35.364459 35.883109 35.669547 35.937086 35.815051 # -b 35.474760 33.970438 35.474760 33.923502 35.385580 33.850750 35.287013 33.639535 35.164978 33.454135 35.087532 33.306284 35.000699 33.186596 35.474760 33.970438 35.721177 34.374094 35.991064 34.740200 35.991064 34.740200 # -b 32.144601 31.278619 32.332348 31.201173 32.496626 31.022814 32.937831 31.088525 33.104456 31.013426 33.522193 31.060363 34.029109 31.297393 34.162879 31.391267 34.437459 31.625950 34.514904 31.750332 34.604084 32.003791 34.679183 32.245515 34.747241 32.470811 34.801218 32.665598 34.934988 32.890894 34.956109 33.066907 34.956109 33.066907 # -b 32.552950 29.992553 32.463770 30.060611 32.341735 30.260092 32.198578 30.633239 32.189191 31.004039 32.165722 31.229335 32.165722 31.229335 # -b 25.364594 39.922012 25.320004 39.983030 25.021956 39.830486 25.188581 39.837526 25.364594 39.922012 25.364594 39.922012 # -b 26.533318 39.079499 26.455872 39.361119 26.080379 39.351731 25.991199 39.147557 26.157824 39.070111 26.465260 39.128782 26.533318 39.079499 # -b 25.970078 38.241678 26.124969 38.448200 25.880898 38.638294 25.904366 38.319124 25.970078 38.241678 # -b 28.098657 36.073203 28.274670 36.286765 28.054067 36.368904 27.767753 36.101365 28.098657 36.073203 28.098657 36.073203 # -b 25.066546 35.373846 24.569017 35.373846 24.151280 35.437210 24.008123 35.517003 23.698341 35.500575 23.545797 35.193140 23.975268 35.218955 24.470450 35.155590 24.813088 34.892745 25.463161 34.956109 25.970078 35.028861 26.289247 35.256504 25.937222 35.148550 25.496017 35.291707 25.066546 35.326909 25.066546 35.373846 # -b 24.944511 37.657316 24.967979 37.875572 24.702787 37.901387 24.890533 37.666704 24.944511 37.657316 # -b 25.430305 36.918063 25.585197 37.155094 25.385716 37.058874 25.430305 36.918063 # -b 22.034435 38.309737 21.527519 38.145458 21.130904 37.788739 21.658941 37.305291 21.715265 36.784294 22.022701 37.023671 22.332483 36.580119 22.475640 36.500327 22.794810 36.617669 23.069389 36.669299 22.926232 37.199684 22.815931 37.507119 23.104592 37.279476 23.468351 37.401511 23.214893 37.622114 23.092858 37.953018 22.255038 38.197089 22.034435 38.309737 22.034435 38.309737 # -b 20.731942 38.068013 20.600519 38.405957 20.358795 38.248719 20.633374 38.110256 20.731942 38.068013 # -b 24.569017 38.075053 24.416473 38.190048 24.205258 38.553807 23.644364 38.750942 23.325194 39.025521 22.961435 38.837775 23.268870 38.750942 23.566918 38.466975 23.996389 38.335552 24.238113 38.039851 24.536161 37.945977 24.569017 38.075053 24.569017 38.075053 # -b 20.049013 39.393974 20.060747 39.454992 # -b 19.938711 39.386934 20.049013 39.393974 # -b 23.942412 40.142615 23.963534 39.964255 # -b 23.501207 40.100372 23.665485 39.999458 23.566918 39.940787 # -b 22.607063 40.152002 22.839399 39.659167 23.247749 39.274286 23.125713 39.138169 22.916845 39.335304 22.970822 39.018481 22.717364 38.966850 22.827665 38.769716 23.289992 38.664109 23.632630 38.387182 24.008123 38.222904 24.017511 37.779352 23.599774 37.988220 22.926232 38.023423 22.937967 38.206476 22.574207 38.319124 21.945255 38.380142 21.306916 38.422385 21.086314 38.441159 20.755410 38.889405 21.053458 39.018481 20.645109 39.102967 20.260228 39.539478 20.159314 39.701410 20.159314 39.701410 # -b 20.081868 39.684982 20.081868 39.684982 # -b 19.938711 32.172763 20.379916 32.527135 21.152025 32.815796 21.935868 32.900282 22.595329 32.693760 22.926232 32.452036 22.893377 32.320613 23.247749 32.189191 23.864966 32.050727 24.559630 31.956854 25.000835 31.663500 25.021956 31.672887 # -b 25.066546 31.560239 25.782331 31.607176 26.488728 31.513302 27.359404 31.238722 27.932032 31.069750 28.727609 30.935981 29.487983 31.032201 29.861130 31.257497 # -b 30.192034 36.279724 29.553695 36.235134 29.178201 36.589506 29.023310 36.777253 28.924743 36.662258 28.626695 36.857046 28.307525 36.749091 28.152634 36.758479 27.678574 36.704501 27.779487 36.864086 28.176103 36.953266 28.241814 37.103463 27.669186 37.033058 27.490827 37.173868 27.481439 37.385084 27.338282 37.551709 27.347670 37.666704 27.127067 37.727722 27.195125 38.049238 26.840753 38.154846 26.542705 38.206476 26.345571 38.380142 26.465260 38.621866 26.685862 38.457587 27.117680 38.457587 26.929933 38.560848 27.016766 38.889405 26.873609 39.147557 26.951055 39.539478 26.620151 39.548866 26.178946 39.548866 26.223536 39.905585 26.223536 39.905585 # -b 20.060747 39.454992 19.786167 39.778855 19.819023 39.487848 19.938711 39.386934 # -b 20.081868 39.684982 19.995035 39.762428 19.962180 39.914972 # -b 15.331874 40.100372 15.418707 39.999458 # -b 15.683899 40.025273 15.803588 39.684982 16.035924 39.309488 16.179081 38.931648 15.827056 38.682883 15.695633 38.232291 15.770732 37.978833 16.035924 37.953018 16.179081 38.145458 16.411418 38.380142 16.587431 38.664109 16.643755 38.880018 17.061491 38.992666 17.094347 39.250818 17.061491 39.464380 16.718853 39.701410 16.533453 39.914972 16.533453 39.914972 # -b 17.997879 40.126187 18.328782 39.879769 18.328782 39.914972 # -b 15.618188 38.319124 15.540742 38.136071 15.165249 37.596299 15.165249 37.305291 15.263816 37.058874 15.132393 36.713889 14.646598 36.758479 14.041115 37.112851 13.599910 37.288863 12.949836 37.577524 12.541487 37.734762 12.553221 38.110256 12.738621 38.171273 13.081259 38.180661 13.412163 38.171273 13.698477 37.997608 14.139682 38.058625 14.393140 38.075053 14.822611 38.190048 15.263816 38.267494 15.618188 38.319124 15.618188 38.319124 # -b 14.372018 35.948821 14.491707 35.939433 14.559765 35.815051 14.372018 35.948821 14.372018 35.948821 # -b 9.873135 37.331106 10.171183 37.209071 10.281485 36.892248 10.546677 36.838271 10.886968 37.068261 11.020738 36.749091 10.546677 36.385332 10.645244 35.850253 11.030125 35.634345 11.131039 35.265891 10.854112 34.784790 10.490353 34.503170 10.126594 34.329504 10.082004 34.092474 10.082004 34.092474 # -b 9.929459 33.794426 10.236895 33.648922 10.502087 33.583211 10.832991 33.592598 10.964414 33.261694 11.217872 33.214758 11.316439 33.158434 # -b 10.776667 33.878912 10.821257 33.794426 10.612388 33.702899 10.710956 33.904727 10.776667 33.878912 # -b 11.316439 33.158434 12.046305 32.900282 12.994426 32.890894 13.721945 32.778246 14.569152 32.461424 15.153514 32.245515 15.406973 31.616563 16.333972 31.229335 17.293828 31.050976 17.800744 30.823333 18.209094 30.623852 18.638565 30.337538 19.222927 30.346925 19.750964 30.670788 19.983301 31.126074 19.774433 31.625950 19.795554 32.003791 19.938711 32.172763 # -b 0.403656 40.180164 0.258152 39.985377 0.072752 39.816405 # -b -0.082139 39.013787 0.248765 38.865937 0.225296 38.652375 # -b 1.593501 39.107661 1.680334 39.004400 1.361164 38.926954 1.593501 39.107661 # -b 3.290263 39.959562 3.248020 39.832833 3.501478 39.663861 3.093129 39.356425 2.717635 39.534785 2.684779 39.755387 3.280876 39.985377 3.290263 39.959562 # -b 4.327564 40.027620 4.348685 39.858648 4.085840 39.910278 # -b 9.673654 40.142615 9.664267 39.626311 9.598556 39.309488 9.377953 39.189800 9.068171 39.018481 8.770123 38.898792 8.626966 39.034909 8.450953 39.309488 8.429832 39.616924 8.462687 39.795283 8.495543 39.973643 8.495543 39.973643 # -b -0.061018 35.845560 0.380187 36.174117 0.776802 36.345436 1.328309 36.530836 2.243574 36.620015 2.917116 36.718582 3.290263 36.798375 3.489744 36.798375 3.865237 36.885208 4.282974 36.920410 4.703058 36.920410 5.001106 36.899289 5.165384 36.777253 5.728625 36.838271 6.378698 37.129279 6.852759 36.988468 7.326819 37.112851 7.854857 36.899289 8.340652 36.953266 8.716146 36.979081 9.002460 37.155094 9.673654 37.340494 9.873135 37.331106 # -b 10.082004 34.092474 9.861401 34.071352 9.929459 33.794426 9.929459 33.794426 # -b -5.508022 50.043912 -5.508022 49.994629 # -b -5.099673 50.029831 -5.043349 49.987588 # -b -8.638700 41.822949 -8.483809 41.210425 -8.549520 40.809116 -8.704411 40.297506 -8.725533 40.086291 # -b -1.692068 43.376554 -2.452443 43.409409 -3.346587 43.432878 -4.151551 43.416450 -5.076204 43.529098 -5.848313 43.632359 -6.787047 43.552566 -7.601399 43.728579 -8.141171 43.519711 -8.615232 43.310842 -9.124495 42.972898 -8.859303 42.681890 -8.770123 42.454247 -8.507277 42.299356 -8.683290 41.888660 -8.638700 41.822949 # -b -1.703802 43.367166 -1.250863 43.601850 -1.053729 44.388040 -1.009139 44.742412 -0.943428 45.202391 -0.722825 45.404219 -0.612524 45.420647 -1.009139 45.760938 -0.985671 46.173981 -1.030261 46.298363 -1.647478 46.509579 -1.912671 46.957824 -1.757780 47.220670 -2.121539 47.279341 -2.309286 47.497596 -2.607334 47.563308 -3.060273 47.563308 -3.280876 47.713505 -3.841769 47.854315 -4.306442 47.891864 -4.414397 48.067877 -4.437865 48.157057 -4.294708 48.295520 -4.634999 48.326029 -4.360420 48.581834 -3.865237 48.671014 -3.445154 48.720297 -3.248020 48.800090 -2.816202 48.764887 -2.299898 48.605302 -1.990116 48.612343 -1.638091 48.654586 -1.283719 48.671014 -1.459731 49.011305 -1.680334 49.351596 -1.769514 49.694234 -1.206273 49.673112 -1.164030 49.544036 -0.842514 49.365677 -0.105608 49.292925 -0.105608 49.292925 # -b -60.071939 45.859505 -59.773891 45.997969 -59.839602 46.159900 -59.949903 46.265508 # -b -56.288841 47.138530 -56.300575 46.957824 -56.213742 46.852217 -56.288841 47.138530 -56.288841 47.138530 # -b -57.635924 50.036872 -57.844792 49.745864 -57.823671 49.529955 -58.196818 49.292925 -58.020805 49.192011 -58.086516 49.062935 -58.450276 48.931512 -58.814035 48.685095 -59.123817 48.509082 -58.518334 48.516123 -58.980660 48.112467 -59.222384 47.593816 -58.274263 47.652487 -57.657045 47.645447 -57.016359 47.586776 -56.324043 47.631366 -55.882838 47.802685 -55.781924 47.631366 -55.892225 47.497596 -55.662236 47.474128 -55.275008 47.668915 -54.779826 47.586776 -55.331332 47.220670 -55.826514 47.039963 -55.408777 46.920275 -55.045018 47.166692 -54.613200 47.415457 -54.437188 47.422497 -54.183729 47.927067 -53.930271 47.563308 -54.085162 46.873338 -53.587633 47.183120 -53.554778 46.852217 -53.280198 46.730181 -52.827259 47.220670 -52.794403 47.751054 -53.125307 47.535146 -52.961028 48.032675 -53.047861 48.105426 -53.500800 47.661875 -53.765993 47.786257 -53.688547 48.046756 -53.709669 48.253277 -53.181631 48.464492 -53.280198 48.605302 -53.688547 48.523163 -53.885681 48.605302 -53.942005 48.830599 -53.489066 49.299966 -53.423355 49.285885 -54.294031 49.407920 -54.812681 49.379758 -55.155319 49.494753 -55.364188 49.436082 -55.859370 49.501793 -56.035382 49.694234 -55.629380 49.966467 -56.079972 49.987588 # -b -56.169152 50.128398 -56.720658 49.637910 -56.720658 49.914836 -56.720658 49.914836 # -b -66.732257 50.072074 -67.117138 49.616788 -67.314272 49.358636 -68.008935 49.328128 -68.241272 49.133340 -68.670743 48.917431 -69.046236 48.654586 -69.564887 48.215728 -69.740900 48.002166 -69.895791 47.786257 # -b -70.116393 47.445966 -69.630598 47.847275 -69.135416 48.229809 -68.771657 48.429290 -68.339839 48.619383 -67.722621 48.851720 -67.072548 49.039467 -66.312173 49.236601 -65.551799 49.299966 -64.833667 49.220173 -64.207062 48.889269 -64.305629 48.872842 -64.228184 48.560712 -64.878257 48.194606 -65.793523 48.201647 -66.455330 48.084305 -65.981270 47.995125 -65.596389 47.727586 -64.988558 47.898905 -64.746834 47.772176 -64.922847 47.340358 -65.220895 47.115062 -64.800812 47.100981 -64.800812 46.746609 -64.570822 46.418052 -64.371341 46.281936 -63.775245 46.159900 -63.885546 45.967460 -63.235473 45.838384 -62.728556 45.784407 -62.531422 45.699920 -61.902470 45.906442 -61.735845 45.683493 -61.252397 45.582579 -61.294640 45.467584 -61.031794 45.380751 -61.240663 45.289224 -61.670134 45.188310 -62.155928 45.024032 -62.453976 44.866794 -62.806002 44.772921 -63.038338 44.779961 -63.214351 44.709556 -63.533521 44.742412 -63.500665 44.505381 -63.852690 44.679047 -64.063905 44.615683 -64.183594 44.378652 -64.392462 44.204986 -64.681123 43.921019 -64.988558 43.695723 -65.232629 43.705111 -65.364052 43.505630 -65.716077 43.728579 -66.058715 44.014893 -65.924946 44.498341 -66.103305 44.442017 -65.650366 44.686088 -65.298341 44.913731 -64.636533 45.232900 -64.272774 45.171883 -63.930136 45.242288 -63.324652 45.350242 -63.843303 45.397179 -64.537966 45.380751 -64.526232 45.636556 -64.448786 45.828996 -64.669389 45.706961 -64.889991 45.660024 -65.462619 45.350242 -65.960148 45.296265 -66.401353 45.131986 -66.741644 45.117905 -67.027958 45.195351 -67.027958 45.195351 # -b -63.974726 49.959426 -63.533521 49.844431 -62.761412 49.694234 -62.233374 49.443122 -61.979916 49.393839 -61.803903 49.292925 -61.836759 49.112219 -62.531422 49.156809 -63.169761 49.278844 -63.610966 49.595667 -64.063905 49.752905 -64.415931 49.879634 -63.974726 49.959426 -63.974726 49.959426 # -b -63.953604 46.988333 -63.941870 47.100981 -63.995847 46.859257 -63.885546 46.648042 -63.610966 46.570596 -63.092316 46.481417 -62.597133 46.464989 -62.022159 46.481417 -62.266230 46.328872 -62.421121 46.122351 -62.597133 46.007356 -62.883447 46.220918 -63.092316 46.197450 -63.655556 46.312444 -63.918402 46.434480 -64.162472 46.648042 -64.106148 46.957824 -63.953604 46.988333 # -b -60.545999 46.995373 -60.778336 46.784158 -61.074037 46.389890 -61.327496 46.082455 -61.318108 45.737470 -60.987204 45.613088 -60.599977 45.652984 -60.247951 45.737470 -60.071939 45.859505 # -b -59.949903 46.265508 -60.137650 46.136432 -60.313663 46.204490 -60.599977 46.143472 -60.435698 46.335913 -60.325397 46.737222 -60.346519 46.978946 -60.545999 46.995373 -60.545999 46.995373 # -b -67.027958 45.195351 -67.027958 45.078009 -67.072548 44.937199 -67.051426 44.890262 -66.962247 44.772921 -67.215705 44.686088 -67.480897 44.585174 -67.713234 44.568746 -67.922102 44.442017 -68.065259 44.427936 -68.220150 44.291819 -68.384429 44.331716 -68.637887 44.355184 -68.715333 44.528850 -68.935935 44.324675 -69.057971 44.087645 -69.177659 44.031321 -69.409996 43.888164 -69.564887 43.895204 -69.651720 43.848268 -69.752634 43.735619 -69.839467 43.871736 -69.907525 43.871736 # -b -70.027213 41.764278 -69.982624 41.865192 -69.982624 41.996615 -69.872322 41.740810 -69.982624 41.691526 # -b -69.895791 47.786257 -70.402707 47.363827 -70.954213 46.978946 -70.865034 46.903847 -70.656165 47.032923 -70.292406 47.272300 -70.116393 47.445966 # -b -69.907525 43.871736 -70.203226 43.672255 -70.268937 43.529098 -70.325261 43.496242 -70.489540 43.310842 -70.611575 43.118402 -70.766466 42.794539 -70.778201 42.731174 -70.710142 42.656075 -70.799322 42.510572 -70.942479 42.381496 -70.778201 42.257113 -70.689021 42.144465 -70.611575 42.003655 -70.524742 41.839377 -70.226694 41.747850 -70.027213 41.764278 # -b -69.982624 41.691526 -70.226694 41.642243 -70.557598 41.583572 -70.599841 41.682139 -70.843912 41.609387 -71.019925 41.557756 -71.141960 41.625815 -71.273383 41.698567 -71.383684 41.485005 -71.726322 41.377050 -71.846011 41.351235 -72.540674 41.301951 -73.014735 41.259708 -73.324517 41.135326 -73.622565 41.010944 -73.810312 40.902989 -73.897145 40.910030 -74.084891 40.743405 -74.216314 40.558005 -74.063770 40.457091 -73.986324 40.086291 -74.019180 40.001805 # -b -74.040301 39.985377 -74.073157 40.001805 # -b -75.694820 44.552318 -75.781653 44.498341 -76.443461 44.268351 -76.908134 44.101726 -76.985580 44.174478 -77.248425 44.118154 -77.039557 43.967956 -77.260159 43.944488 -77.722486 43.984384 -78.130835 43.984384 -78.804377 43.848268 -79.278437 43.705111 -79.543630 43.536138 -79.752498 43.336657 -79.663318 43.247478 -79.233848 43.224009 -78.694076 43.327270 -78.109714 43.400022 -77.755341 43.360126 -77.569942 43.263906 -77.370461 43.310842 -76.940990 43.303802 -76.478663 43.512670 -76.168881 43.552566 -76.201737 43.791944 -76.246327 43.921019 -76.103170 43.951528 -76.201737 44.038361 -76.246327 44.174478 -75.870833 44.355184 -75.694820 44.552318 # -b -78.881822 42.867290 -79.078957 42.850863 -79.707908 42.876678 # -b -80.160847 42.174974 -79.686787 42.332212 -79.233848 42.566896 -79.102425 42.681890 -78.924065 42.787498 -78.881822 42.867290 -78.881822 42.867290 # -b -80.038812 44.873834 -79.785354 44.796389 -79.761886 44.923118 -79.928511 44.977095 # -b -72.200383 41.193997 -72.573530 40.994516 -73.059324 40.961660 -73.378494 40.910030 -73.599096 40.860746 -73.753988 40.818503 -73.831433 40.743405 -73.930000 40.668306 -73.920613 40.642491 -73.753988 40.593207 -73.467674 40.694121 -73.225950 40.726977 -72.883312 40.792688 -72.573530 40.827891 -72.385783 40.902989 -72.045492 41.001557 -71.979780 41.043800 -72.233238 41.027372 -72.507818 40.935845 -72.331806 41.086043 -72.200383 41.193997 -72.200383 41.193997 # -b -82.132189 45.892361 -82.519417 45.899401 -82.960622 45.906442 -83.136634 45.821956 -82.662574 45.714001 -82.242490 45.591966 -81.824754 45.568498 -81.702718 45.730429 -81.759042 45.852465 -81.845875 45.613088 -81.869343 45.791447 -82.045356 45.946338 -82.132189 45.892361 # -b -79.707908 42.876678 -80.381450 42.681890 -81.130090 42.672503 -81.648741 42.503531 -81.845875 42.322825 -82.352792 42.102222 -82.552272 41.980187 -83.103779 42.003655 -83.378358 41.806521 -83.059189 41.557756 -82.793997 41.492045 -82.265959 41.492045 -81.813019 41.534288 -81.338959 41.757237 -80.820308 41.947331 -80.313392 42.078754 -80.160847 42.174974 # -b -82.573394 42.625566 -82.904298 42.543427 -82.904298 42.332212 -82.718898 42.299356 -82.486561 42.339253 -82.463093 42.487103 -82.573394 42.592711 -82.573394 42.625566 # -b -82.463093 43.062078 -82.397381 43.101974 -82.132189 43.224009 -81.747308 43.576035 -81.791898 44.158050 -81.472728 44.528850 -81.395283 44.826898 -81.505584 45.054541 -81.625273 45.188310 -81.538440 45.265756 -81.338959 45.164842 -81.219270 44.930159 -81.151212 44.899650 -81.031523 44.984136 -81.064379 44.819857 -80.986933 44.796389 -80.930609 44.639151 -80.766331 44.742412 -80.578584 44.592214 -80.092789 44.538237 -80.038812 44.725984 -80.038812 44.873834 -80.038812 44.873834 # -b -79.928511 44.977095 -80.017691 45.171883 -80.170235 45.380751 -80.557463 45.613088 -80.710007 45.875933 -81.186414 45.976847 -81.583030 45.960419 -81.660475 46.082455 -82.099333 46.082455 -82.519417 46.159900 -82.793997 46.213877 -83.059189 46.159900 -83.378358 46.220918 -83.798442 46.335913 -84.105877 46.298363 -84.195057 46.441520 -84.251381 46.533047 -84.371070 46.587024 -84.382804 46.549475 -84.338214 46.441520 -84.284237 46.265508 -84.227913 46.152860 -84.096490 46.061333 -83.995576 45.976847 -84.162201 45.967460 -84.448515 45.913482 -84.657384 45.967460 -84.901454 45.946338 -85.143178 46.037865 -85.706419 45.936951 -86.356492 45.791447 -86.663928 45.613088 -86.785963 45.784407 -87.170844 45.599007 -87.590928 45.085050 -87.865507 44.812817 -87.999277 44.545278 -87.579193 44.819857 -87.391447 45.054541 -87.095745 45.141374 -87.316348 44.789348 -87.546338 44.355184 -87.656639 43.991424 -87.799796 43.529098 -87.910097 42.998713 -87.832652 42.649035 -87.844386 42.282929 -87.623783 41.806521 -87.358591 41.665711 -86.851674 41.829989 -86.675662 42.013042 -86.368226 42.503531 -86.279047 42.860250 -86.433938 43.353085 -86.565361 43.665214 -86.422204 44.197946 -86.323637 44.465485 -86.290781 44.585174 -86.189867 44.772921 -85.915287 45.000564 -85.682951 45.047500 -85.638361 44.836285 -85.452961 45.078009 -85.274601 45.279837 -85.089201 45.474624 -85.044611 45.667065 -84.800541 45.714001 -84.558817 45.643596 -84.239647 45.575538 -83.908743 45.413607 -83.786708 45.390138 -83.434683 45.164842 -83.479272 45.024032 -83.368971 44.695475 -83.378358 44.348143 -83.676407 44.064176 -83.953333 43.735619 -83.676407 43.681642 -83.422948 43.951528 -83.092045 44.064176 -82.718898 43.824799 -82.608597 43.383594 -82.463093 43.062078 -82.463093 43.062078 # -b -84.525961 46.488457 -84.537695 46.526006 -84.547082 46.706713 -84.460249 46.873338 -84.680852 47.333318 -84.978900 47.861356 -85.176034 47.964616 -85.748662 47.936454 -86.234457 48.436330 -86.466793 48.727338 -86.818819 48.786009 -87.447771 48.851720 -88.175289 48.959674 -88.175289 48.685095 -88.363036 48.574793 -88.560170 48.523163 -88.440482 48.816518 -88.703327 48.422249 -88.902808 48.450411 -89.144532 48.384700 -89.365135 48.098386 -89.609206 48.016247 -89.752363 47.981044 -89.928375 47.875437 # -b -90.071532 46.662123 -89.365135 46.866298 -88.747917 47.220670 -88.064988 47.467087 -87.823264 47.445966 -88.130700 47.227710 -88.506193 46.957824 -88.374770 46.852217 -87.999277 46.873338 -87.668373 46.746609 -87.349203 46.481417 -86.851674 46.457948 -86.642806 46.464989 -86.180480 46.678551 -85.617239 46.669163 -85.131444 46.753649 -84.967166 46.502538 -84.680852 46.481417 -84.525961 46.488457 -84.525961 46.488457 # -b -89.928375 47.875437 -90.843641 47.474128 -91.472593 47.100981 -92.110932 46.699672 -91.648605 46.638655 -91.097099 46.873338 -90.855375 46.737222 -90.810785 46.617533 -90.214689 46.601105 -90.071532 46.662123 # -b -113.082251 41.745503 -112.971949 41.710301 -112.840527 41.745503 -112.641046 41.670405 -112.697370 41.414600 -112.387587 41.346541 -112.342998 41.529594 -112.178719 41.571837 -112.012094 41.487351 -112.077805 41.372356 -112.077805 41.097777 -111.913527 40.964007 -112.012094 40.764526 -112.289020 40.780954 -112.387587 40.905336 -112.631658 41.006250 -112.784203 41.323073 -112.995418 41.529594 -113.082251 41.719688 -113.082251 41.745503 # -b -125.304568 50.041565 -124.907953 49.757598 -124.875097 49.593320 -124.586436 49.433735 -124.166353 49.318740 -123.858918 49.175583 -123.725148 49.015999 -123.581991 48.783662 -123.450568 48.631118 -123.316799 48.520816 -123.516280 48.358885 -123.847183 48.410515 -124.255533 48.551325 -124.377568 48.617037 -124.753062 48.659280 -124.654495 48.842333 -124.863363 48.732031 -125.072231 48.936206 -124.973664 49.030080 -125.316302 49.023039 -125.647206 49.081710 -125.626084 49.231907 -125.924133 49.318740 -126.222181 49.433735 -126.508494 49.562811 -126.198712 49.621482 -126.341869 49.705968 -126.529616 49.750558 -126.783074 49.942998 -127.027145 49.898409 -127.158568 49.971160 # -b -122.786414 49.044161 -122.908449 49.088750 -122.997629 49.147421 -122.687847 49.203745 -122.654991 49.248335 -122.765292 49.276497 -123.042219 49.248335 -123.161908 49.318740 -123.206497 49.412614 -123.152520 49.562811 -123.251087 49.670766 -123.459956 49.520568 -123.659437 49.548730 -123.605459 49.713009 -123.736882 49.778720 -123.826062 49.842084 -123.903507 49.957079 # -b -123.980953 50.027484 -124.023196 49.926571 -124.079520 49.919530 -124.279001 49.813922 -124.487869 49.863206 -124.654495 49.964120 # -b -123.912895 39.980683 -124.091254 40.201286 -124.267267 40.410154 -124.091254 40.729324 -124.056052 40.931151 -124.013809 41.163488 -124.046664 41.637549 -124.189821 42.064673 -124.321244 42.458941 -124.398690 42.911880 -124.210943 43.381247 -124.166353 43.533792 -124.056052 43.820106 -124.013809 44.169784 -123.990340 44.446711 -123.990340 44.831591 -123.903507 45.167189 -123.835449 45.540336 -123.826062 45.779713 -123.891773 45.965113 -123.793206 46.188062 -123.340267 46.202143 -123.206497 46.232652 -123.450568 46.324179 -123.802594 46.310098 -123.990340 46.422746 -123.924629 46.622227 -123.858918 46.453255 -123.826062 46.544781 -123.835449 46.772424 -124.013809 46.878032 -123.990340 47.105675 -124.124110 47.089247 -124.210943 47.328624 -124.300123 47.612591 -124.544193 47.917680 -124.663882 48.227462 -124.544193 48.419902 -124.222677 48.323682 -123.903507 48.241543 -123.516280 48.199300 -123.206497 48.199300 -122.899062 48.117161 -122.633870 48.020940 -122.908449 47.701771 -122.854472 47.434232 -122.899062 47.523411 -122.577546 47.755748 -122.356943 47.880130 -122.279498 47.873090 -122.258376 48.058490 -122.291232 48.220421 -122.356943 48.316642 -122.413267 48.403475 -122.500100 48.433983 -122.488366 48.513776 -122.422654 48.579487 -122.345209 48.732031 -122.324087 48.755500 -122.601014 48.769581 -122.744171 48.929166 -122.753558 49.023039 -122.798148 49.044161 # -b 154.832448 49.642603 154.644701 49.391492 154.799592 49.475978 154.832448 49.642603 # -b 154.224617 48.898657 154.126050 48.746112 154.280941 48.870495 154.224617 48.898657 # -b 152.293172 47.140877 152.072570 46.878032 151.938800 46.929662 152.293172 47.140877 152.293172 47.140877 # -b 150.570595 46.171634 150.227957 45.871239 150.051944 45.756245 # -b 149.843076 45.857158 150.460294 46.232652 150.570595 46.171634 # -b 140.702153 50.032178 140.589505 49.649644 140.502672 49.253029 140.392371 49.023039 140.326660 48.593568 140.016877 48.300214 140.016877 48.300214 # -b 144.067515 50.011057 144.323320 49.353943 144.764525 48.856414 144.553310 48.964368 143.870381 49.318740 143.140515 49.203745 142.875323 48.586528 142.654720 47.880130 142.952768 47.335665 143.206226 46.915581 143.516009 46.802933 143.670900 46.415705 143.494887 46.270201 142.943381 46.687938 142.434118 46.361728 142.025768 46.049599 142.025768 46.983639 142.124335 47.671262 142.258105 48.220421 142.004647 48.950287 142.201781 49.590973 142.246371 49.975854 142.267492 49.975854 # -b 150.051944 45.756245 149.688185 45.739817 149.843076 45.857158 # -b 148.958319 45.392485 148.871486 45.345548 148.317633 45.082703 147.909284 44.948933 147.566646 44.697822 147.214621 44.446711 147.235742 44.650885 147.590114 45.002910 147.953874 45.291571 148.197945 45.230553 148.693127 45.500439 148.958319 45.392485 148.958319 45.392485 # -b 146.937694 43.843574 146.761682 43.691030 146.937694 43.843574 146.937694 43.843574 # -b 146.210175 44.446711 146.365066 44.399774 146.120996 44.097032 145.614079 43.667561 145.900393 44.113460 146.210175 44.446711 146.210175 44.446711 # -b 145.083695 44.066523 145.447454 44.209680 145.250320 43.620625 145.646935 43.331964 145.492044 43.146564 144.952272 43.017488 144.234140 42.911880 143.516009 42.285275 143.051335 42.081101 142.180659 42.440166 141.417938 42.473022 140.845310 42.505878 140.502672 42.153853 141.110503 41.900394 140.955612 41.726729 140.523794 41.520207 140.082589 41.562450 140.028612 42.120997 140.028612 42.120997 # -b 139.927698 42.522306 140.514407 42.904840 140.514407 43.282680 141.152746 43.179420 141.462528 43.557260 141.727720 44.043055 141.870877 44.721290 141.683130 45.160148 141.903733 45.432381 142.136070 45.361976 142.490442 45.042807 142.931647 44.643845 143.516009 44.280085 144.144960 44.082951 144.654224 43.906938 145.083695 44.066523 # -b 141.241925 45.230553 141.340492 45.089743 141.241925 45.230553 # -b 141.209070 41.372356 141.485996 41.379397 141.495384 40.947579 141.793432 40.325668 141.960057 40.022926 # -b 139.906576 39.980683 140.061467 40.611982 140.314926 40.787995 140.413493 41.130632 140.744396 40.879521 141.075300 40.888908 141.331105 41.245627 140.878166 41.264402 141.209070 41.372356 141.209070 41.372356 # -b 132.729954 44.838632 132.741689 45.244634 132.089268 45.120252 132.300484 44.667313 132.729954 44.838632 132.729954 44.838632 # -b 140.016877 48.300214 139.620262 47.962270 139.122733 47.441272 138.592349 46.960171 138.404602 46.521313 138.261445 46.392237 137.885951 45.979194 137.379035 45.509827 136.869772 45.113212 136.538868 44.808123 136.097663 44.413855 135.755025 44.033668 135.346676 43.597156 134.628544 43.162992 133.877557 42.782804 133.326051 42.677197 132.929435 42.740561 132.410785 42.846169 132.399051 43.137177 132.068147 43.090240 131.934377 43.299108 131.781833 43.106668 131.504906 42.822701 131.073089 42.611485 130.810243 42.529346 130.622496 42.562202 # -b 140.028612 42.120997 139.927698 42.522306 139.927698 42.522306 # -b 130.699942 42.374455 130.476993 42.268848 129.981810 41.851111 129.704884 41.412253 129.749474 40.888908 129.230823 40.579126 128.712173 40.257610 128.170054 40.029967 128.005775 40.022926 # -b 120.012455 39.980683 120.552227 40.215367 120.883131 40.595554 121.347804 40.879521 121.866455 40.987476 122.152768 40.602595 122.286538 40.426582 121.955634 40.046395 # -b 74.903937 46.833442 75.443709 46.786505 76.415299 46.704366 77.255466 46.598758 78.072164 46.589371 78.579081 46.772424 79.085997 46.748956 78.701116 46.392237 77.950129 46.347647 77.044250 46.460295 76.117251 46.544781 75.399119 46.544781 75.255962 46.507232 74.803023 46.324179 74.239782 46.002662 74.052036 45.493399 74.328962 44.815164 73.709398 45.338508 73.434818 45.918176 73.899491 46.324179 74.549565 46.734875 74.903937 46.833442 # -b 59.973372 43.597156 60.489675 43.813065 60.853435 44.195599 61.174951 44.683741 61.735845 45.028726 61.461265 45.472277 61.052916 45.833690 61.261784 46.432133 61.616156 46.809973 61.064650 46.568249 60.656301 46.727834 60.456820 46.523660 60.149384 46.462642 60.468554 46.286629 60.820579 46.195103 60.304275 46.256120 60.193974 46.202143 # -b 53.885681 39.863341 53.092451 40.083944 53.092451 40.083944 # -b 52.850727 39.957215 52.761547 40.588514 52.895317 40.940539 52.904704 41.064921 53.280198 40.799729 53.808236 40.715243 54.448922 40.741058 54.526367 40.891255 54.052307 41.621121 53.721403 42.074060 52.895317 41.902741 52.817871 41.588265 52.785016 41.264402 52.463499 42.090488 52.651246 42.808620 51.858016 43.010447 51.318244 43.205235 51.053051 43.979690 50.358388 44.376305 50.611846 44.683741 51.252532 44.596908 51.351099 44.817510 51.581089 45.270450 51.989439 45.207085 52.529211 45.448809 53.390499 45.293918 53.643957 45.371364 54.282297 45.160148 54.756357 45.254022 54.681259 45.573191 54.207198 45.965113 53.697935 46.483763 53.378765 46.758343 52.993884 47.058738 52.684102 47.201895 52.066884 47.143224 51.682003 47.208935 51.217330 47.269953 50.337267 46.870991 50.337267 46.870991 # -b 49.950039 40.698815 50.280943 40.471172 50.137786 40.471172 # -b 59.973372 43.597156 59.973372 43.597156 # -b 60.193974 46.202143 59.830215 46.385196 59.642468 46.042558 59.344420 45.981541 58.837504 45.887667 58.220286 45.035766 58.220286 44.503035 58.372830 43.909285 58.638023 43.766128 58.990048 43.749700 59.421865 43.806025 59.785625 43.606544 59.973372 43.597156 # -b 41.506126 41.646936 41.736116 41.959065 41.538982 42.393230 41.318379 42.864944 40.910030 43.116055 40.480559 43.195847 40.149655 43.397675 # -b 39.994764 41.025025 41.118898 41.423987 41.506126 41.646936 # -b 50.337267 46.870991 49.034773 46.697325 49.034773 46.432133 48.462145 46.063680 48.196953 45.904095 47.866049 46.232652 47.469434 46.378156 47.546880 45.772672 47.293422 45.347895 47.051697 45.082703 46.831095 44.801083 46.950784 44.439670 47.391989 43.756741 47.657181 43.782556 47.591470 42.961164 48.086652 42.376802 48.527857 41.909782 49.100485 41.280830 49.574545 40.689427 49.950039 40.698815 # -b 50.137786 40.471172 49.541690 40.217714 49.508834 40.067516 # -b 40.149655 43.397675 39.675595 43.700417 39.276633 43.996118 38.527992 44.369265 37.910775 44.603948 37.591605 44.714250 37.126932 45.052194 36.852352 45.307999 37.194990 45.425341 37.788739 45.826650 38.229944 46.178675 38.340246 46.272548 37.943630 46.493151 38.009342 46.734875 38.560848 46.758343 38.682883 46.939049 39.365812 47.119756 39.255511 47.208935 39.189800 47.300462 38.826040 47.291075 38.527992 47.246485 38.032810 47.171386 37.424980 46.983639 36.950919 46.894460 36.676339 46.840482 36.267990 46.697325 35.991064 46.659776 35.561593 46.469682 35.254157 46.188062 35.287013 46.256120 35.287013 46.500191 35.111000 46.317138 34.977231 46.002662 34.956109 45.887667 34.845808 45.995622 34.768362 46.178675 34.536026 46.056639 34.404603 46.171634 34.261446 46.317138 34.118289 46.188062 33.841363 46.256120 33.963398 46.134085 34.139411 46.056639 34.261446 45.958072 34.449193 46.019090 34.613471 45.934604 34.714385 45.833690 34.723773 45.702267 35.066410 45.617781 35.176712 45.401872 35.528737 45.418300 36.014532 45.486358 36.444003 45.509827 36.542570 45.340855 36.521448 45.099131 36.190545 45.089743 35.937086 45.075662 35.385580 45.052194 34.845808 44.855060 34.679183 44.761186 34.449193 44.589867 34.162879 44.486607 33.766264 44.456098 33.501071 44.596908 33.578517 44.761186 33.587904 45.052194 33.247613 45.207085 32.794674 45.394832 32.597540 45.432381 32.893241 45.634209 33.325059 45.857158 33.820241 45.972153 33.611373 46.178675 33.334446 46.164594 33.158434 46.188062 32.850998 46.127044 32.430915 46.117657 32.198578 46.239693 31.879408 46.249080 32.100011 46.422746 31.780841 46.483763 32.088277 46.537741 32.165722 46.591718 31.912264 46.734875 31.614216 46.690285 31.318515 46.643348 30.898431 46.561209 30.743540 46.432133 30.468960 46.225612 30.248358 46.347647 30.391515 46.218571 30.227236 45.873586 30.105201 45.864199 # -b 29.929188 41.172876 30.579262 41.140020 30.987611 41.090736 31.548505 41.339501 32.231434 41.630508 32.860385 41.919169 33.731061 42.041204 34.812952 42.017736 35.265891 42.083448 35.662507 41.719688 36.256256 41.604693 36.896942 41.290217 37.535281 41.015638 38.131377 40.966354 39.091233 41.100124 39.994764 41.025025 39.994764 41.025025 # -b 29.640528 45.385445 29.685118 45.106171 29.321358 44.794042 28.859032 44.479566 29.046778 44.817510 28.903621 44.995870 28.748730 44.533543 28.659551 44.195599 28.659551 43.789597 28.176103 43.364820 27.943766 42.775764 27.657452 42.604445 27.678574 42.449554 27.899176 42.132731 28.009477 41.827643 28.340381 41.473270 29.079634 41.290217 28.715875 40.989822 28.032946 41.048493 27.457971 40.865440 26.664741 40.421888 26.223536 40.109759 26.444138 40.496987 26.631885 40.656572 26.101500 40.673000 26.059257 40.731670 # -b 26.354958 41.811215 26.542705 41.463883 26.247004 40.931151 26.059257 40.731670 # -b 24.712174 40.614329 24.756764 40.780954 24.526774 40.630757 24.712174 40.614329 # -b 26.059257 40.731670 25.331738 40.956967 24.857678 40.924111 24.425860 40.956967 23.665485 40.621369 24.085569 40.428929 24.306171 40.201286 23.930678 40.370258 23.942412 40.142615 23.942412 40.142615 # -b 23.963534 39.964255 23.534063 40.269344 23.501207 40.100372 # -b 23.566918 39.940787 23.092858 40.360871 22.905111 40.621369 22.607063 40.353830 22.607063 40.152002 # -b 30.105201 45.864199 29.818887 45.765632 29.696852 45.826650 29.663996 45.634209 29.640528 45.385445 29.640528 45.385445 # -b 26.411283 40.067516 26.807898 40.438316 27.138801 40.454744 27.624596 40.370258 27.767753 40.572086 28.021211 40.438316 28.605573 40.454744 29.091368 40.565045 29.091368 40.698815 29.708586 40.731670 29.741442 40.832584 29.387069 40.823197 29.222791 40.982782 29.234525 41.231546 29.455128 41.224506 29.929188 41.172876 # -b 26.223536 39.905585 26.411283 40.067516 26.411283 40.067516 # -b 19.962180 39.914972 19.354349 40.344443 19.410673 40.572086 19.443529 40.973395 19.387205 41.372356 19.476385 41.604693 19.309759 41.893354 18.946000 42.212523 18.549385 42.465982 18.054203 42.735868 17.591876 42.857903 17.138937 43.083199 17.535552 42.954123 17.127203 43.285027 16.322238 43.540832 15.958479 43.630012 15.561864 43.909285 15.165249 44.258964 15.209838 44.463138 14.890669 44.958321 14.702922 45.169536 14.327428 45.347895 14.008259 44.855060 13.665621 45.113212 13.510730 45.502786 13.632765 45.556764 13.632765 45.556764 # -b 14.503441 45.237594 14.536297 45.176576 14.691188 45.042807 14.658332 45.005257 14.416608 45.075662 14.503441 45.237594 14.503441 45.237594 # -b 14.282839 45.160148 14.315694 45.183617 14.339163 45.099131 14.372018 44.974748 14.372018 44.848019 14.437730 44.683741 14.261717 44.887916 14.339163 44.974748 14.282839 45.146067 14.282839 45.160148 # -b 16.390297 43.414103 16.432540 43.428184 16.599165 43.404716 16.808033 43.357779 16.808033 43.317883 16.620286 43.301455 16.399684 43.364820 16.390297 43.414103 # -b 16.643755 42.977592 16.819767 43.010447 17.073226 42.994020 16.984046 42.944736 16.685998 42.937696 16.643755 42.977592 16.643755 42.977592 # -b 9.861401 44.082951 10.258016 43.766128 10.556064 43.155951 10.800135 42.871984 11.131039 42.524653 11.438474 42.458941 11.858558 42.083448 12.365474 41.736116 13.048403 41.280830 13.632765 41.290217 14.008259 41.032065 14.381406 40.799729 14.559765 40.673000 14.900056 40.588514 14.932912 40.337402 15.331874 40.100372 15.331874 40.100372 # -b 15.418707 39.999458 15.627575 40.083944 15.683899 40.025273 # -b 16.533453 39.914972 16.775178 40.353830 17.282094 40.487600 17.932167 40.252916 17.997879 40.126187 # -b 18.328782 39.914972 18.417962 40.236488 18.021347 40.656572 17.481575 40.891255 16.918334 41.165835 16.268261 41.372356 15.937357 41.473270 15.991335 41.696220 16.092248 41.926210 15.838790 41.984880 15.770732 41.952025 15.209838 41.952025 15.198104 41.844070 14.780368 42.123344 14.646598 42.238339 14.327428 42.419045 13.963669 42.808620 13.787656 43.116055 13.611644 43.510323 13.346451 43.669908 13.236150 43.749700 12.938102 43.932754 12.553221 44.068870 12.288029 44.399774 12.299763 44.770574 12.452307 45.005257 12.243439 45.207085 12.342006 45.448809 12.541487 45.495746 13.092993 45.671758 13.555320 45.765632 13.665621 45.617781 13.689089 45.725736 # -b 5.132528 43.383594 4.965903 43.392982 4.625612 43.376554 4.393275 43.465733 4.085840 43.529098 3.764324 43.367166 3.269141 43.184113 3.137719 42.820354 3.358321 42.355680 3.236286 42.200789 3.158840 41.790093 2.222453 41.292564 1.140562 40.994516 0.767415 40.574433 0.403656 40.180164 # -b 4.306442 40.027620 4.327564 40.027620 # -b 4.085840 39.910278 4.196141 40.079250 4.306442 40.027620 # -b -0.105608 49.292925 0.457633 49.414960 0.535078 49.487712 0.380187 49.708315 1.239129 49.942998 1.239129 49.942998 # -b 7.547422 43.836533 7.293964 43.726232 7.049893 43.580728 6.730723 43.374207 6.620422 43.228703 6.256662 43.123095 6.036060 43.106668 5.794336 43.172379 5.529144 43.228703 5.320275 43.348392 5.043349 43.421144 5.132528 43.383594 # -b 7.547422 43.836533 8.066072 43.899898 8.263206 44.115807 8.472075 44.322328 8.793591 44.423242 9.309895 44.322328 9.861401 44.082951 # -b 9.133882 41.316032 9.267652 41.273789 9.431930 41.191650 9.530497 41.074308 9.673654 40.722283 9.697123 40.344443 9.673654 40.142615 # -b 8.495543 39.973643 8.472075 40.353830 8.352386 40.588514 8.209229 40.741058 8.209229 40.966354 8.385242 40.865440 8.802979 41.074308 9.089292 41.257362 9.133882 41.316032 # -b 9.342751 43.033916 9.453052 42.719440 9.553966 42.238339 9.420196 41.827643 9.309895 41.588265 9.211328 41.391131 8.903892 41.564797 8.737267 41.787746 8.692677 42.090488 8.605844 42.294663 8.615232 42.433126 8.638700 42.475369 8.781857 42.604445 9.101027 42.752296 9.321629 42.930655 9.342751 43.033916 # -b -1.274331 60.003881 -1.164030 59.982759 -1.164030 59.982759 # -b -6.146361 58.445582 -6.456143 58.377524 -6.709602 58.227326 -6.918470 58.203858 -6.972447 57.980909 -6.939591 57.835405 -6.796435 57.769694 -6.643890 57.877648 -6.388085 57.941012 -6.289518 58.058354 -6.345842 58.128759 -6.179217 58.180390 -6.190951 58.255488 -6.146361 58.412726 -6.146361 58.445582 # -b -7.028771 57.612456 -7.082748 57.647658 -7.392531 57.624190 -7.303351 57.539704 -7.094483 57.516235 -7.049893 57.581947 -7.028771 57.612456 # -b -2.628455 58.945458 -2.663658 58.997088 -2.971093 59.001782 -3.114250 59.154326 -3.224551 58.990048 -2.872526 58.961886 -2.684779 58.929030 -2.628455 58.945458 # -b -3.102516 58.830463 -3.224551 58.921990 -3.236286 58.814035 -3.102516 58.830463 # -b -5.254564 58.215592 -5.242830 58.105291 -5.308541 58.004377 -5.165384 57.922238 -5.418842 57.858873 -5.660566 57.781428 -5.651179 57.617149 -5.529144 57.535010 -5.738012 57.511542 -5.738012 57.457564 -5.606589 57.356651 -5.418842 57.333182 -5.407108 57.286245 -5.517409 57.171251 -5.508022 57.093805 -5.618323 57.028094 -5.728625 56.896671 -5.728625 56.769942 -5.925759 56.725352 -5.881169 56.654947 -5.827192 56.617397 -5.639445 56.476587 -5.561999 56.460160 -5.407108 56.521177 -5.242830 56.610357 -5.186506 56.605663 -5.308541 56.392101 -5.418842 56.239557 -5.463432 56.079972 -5.540878 55.906306 -5.439964 55.833555 -5.475166 55.671623 -5.639445 55.415818 -5.550265 55.303170 -5.341397 55.608258 -5.242830 55.781924 -5.308541 55.955590 -5.263951 56.030689 -5.043349 56.183233 -5.111407 56.035382 -5.177118 55.838248 -5.076204 55.882838 -4.965903 55.932122 -4.890804 55.901613 -4.855602 55.913347 -4.789890 56.023648 -4.581022 55.936815 -4.757035 55.819474 -4.780503 55.664582 -4.581022 55.458061 -4.890804 55.087261 -5.043349 54.960532 -4.933047 54.662484 -4.834480 54.777479 -4.625612 54.784519 -4.282974 54.732889 -4.095227 54.796253 -3.754936 54.822069 -3.555455 54.873699 -3.280876 54.941757 -3.060273 54.892474 -3.290263 54.815028 -3.510865 54.540448 -3.424032 54.322193 -3.290263 54.188423 -3.191696 54.155567 -2.881914 54.129752 -2.729369 54.136793 -2.849058 53.890375 -2.738757 53.733137 -2.938238 53.477332 -2.860792 53.371725 -3.358321 53.287238 -4.160939 53.087757 -4.491842 52.789709 -3.996660 52.822565 -3.963805 52.555026 -3.952070 52.386054 -4.414397 52.109127 -5.001106 51.900259 -5.076204 51.750061 -4.944782 51.618639 -4.691323 51.625679 -4.294708 51.750061 -4.184407 51.564661 -3.776058 51.639760 -3.543721 51.468441 -3.179962 51.379261 -2.860792 51.564661 -2.475911 51.721899 -2.705901 51.433239 -2.938238 51.212636 -3.489744 51.184474 -4.029516 51.116416 -4.414397 50.790206 -5.043349 50.353695 -5.451698 50.135439 -5.508022 50.043912 # -b -5.508022 49.994629 -5.263951 50.065034 -5.099673 50.029831 -5.099673 50.029831 # -b -5.043349 49.987588 -4.712445 50.205844 -4.294708 50.346654 -3.942683 50.318492 -3.611779 50.241046 -3.445154 50.346654 -3.313731 50.628274 -2.982827 50.677558 -2.607334 50.677558 -2.398466 50.522667 -2.374997 50.529707 -1.968995 50.571950 -1.703802 50.684598 -1.283719 50.762044 -1.152296 50.823062 -0.833126 50.783165 -0.192440 50.797246 -0.037549 50.801940 # -b 0.004694 53.557124 -0.171319 53.726097 -0.061018 53.655692 # -b 0.093873 53.836398 -0.248765 54.244747 -0.269886 54.251788 -0.732213 54.554529 -1.128828 54.758704 -1.426876 55.131851 -1.459731 55.397043 -1.858693 55.720906 -2.353876 55.955590 -2.640190 56.004874 -3.048539 55.955590 -3.147106 56.084666 -2.696514 56.178539 -2.729369 56.368633 -2.673045 56.441385 -2.419587 56.654947 -2.231840 56.798104 -2.166129 56.870856 -2.046440 57.136048 -1.835225 57.326142 -1.757780 57.570213 -2.133273 57.664086 -2.783346 57.675820 -3.367708 57.664086 -4.008394 57.504501 -4.041250 57.640618 -3.930949 57.706329 -4.074106 57.811937 -3.841769 57.992643 -3.093129 58.337628 -3.257407 58.626288 -3.510865 58.579352 -4.095227 58.527721 -4.449599 58.551190 -4.646734 58.567617 -4.977637 58.429154 -5.043349 58.227326 -5.242830 58.220286 -5.254564 58.215592 # -b -1.095972 50.698679 -1.185152 50.712760 -1.250863 50.698679 -1.316575 50.607153 -1.009139 50.635315 -1.095972 50.698679 -1.095972 50.698679 # -b -4.095227 53.221527 -4.217263 53.385806 -4.437865 53.378765 # -b -4.306442 54.373823 -4.515311 54.233013 -4.524698 54.064041 -4.228997 54.277603 -4.306442 54.373823 # -b -5.231096 55.657542 -5.242830 55.476836 -5.043349 55.490917 -5.087939 55.671623 -5.221708 55.657542 -5.231096 55.657542 # -b -6.080650 55.864063 -6.167483 55.838248 -6.388085 55.664582 -6.190951 55.638767 -5.991470 55.739681 -6.080650 55.864063 -6.080650 55.864063 # -b -5.651179 56.072932 -5.782602 56.011914 -5.937493 55.845289 -5.803723 55.875798 -5.651179 56.072932 -5.651179 56.072932 # -b -6.244928 56.288841 -6.167483 56.244251 -5.815457 56.319349 -5.672301 56.399142 -5.848313 56.483628 -5.970349 56.556380 -6.179217 56.544646 -6.014938 56.441385 -6.003204 56.349858 -6.202685 56.288841 -6.244928 56.288841 # -b -6.244928 57.671126 -6.301252 57.600721 -6.477265 57.546744 -6.632156 57.380119 -6.345842 57.236962 -6.167483 57.124314 -5.881169 57.100846 -5.705156 57.154823 -5.892903 57.232268 -5.991470 57.391853 -6.125240 57.593681 -6.244928 57.671126 # -b -7.446508 54.941757 -7.458242 55.068486 -7.601399 55.213990 -7.845470 55.188175 -8.274941 55.012162 -8.307796 54.833803 -8.626966 54.674218 -8.439219 54.606160 -8.075460 54.606160 -8.209229 54.451269 -8.439219 54.296378 -8.737267 54.240053 -9.133882 54.270562 -9.697123 54.218932 -9.718244 53.949046 -9.861401 53.869254 -9.443665 53.777727 -9.795690 53.589980 -9.828546 53.378765 -9.619677 53.298973 -9.300508 53.228568 -8.826447 53.167550 -9.267652 52.982150 -9.377953 52.721651 -9.631411 52.576147 -9.640799 52.547985 -9.399075 52.576147 -8.925014 52.688795 -8.781857 52.789709 -8.770123 52.662980 -8.760736 52.594922 -9.497642 52.522170 -9.708857 52.259325 -9.983437 52.212388 -9.983437 52.212388 # -b -10.039761 52.083312 -9.807424 52.102087 -9.774568 52.048109 # -b -10.004558 51.750061 -9.729978 51.796998 -9.718244 51.714859 -9.962315 51.585783 -9.607943 51.639760 -9.387341 51.653841 -9.652533 51.536499 -9.453052 51.508337 -9.157351 51.489563 -9.101027 51.503644 -9.023581 51.543540 -8.671556 51.578742 -8.396976 51.646801 -8.242085 51.789958 -8.152905 51.796998 -7.965158 51.811079 -7.723434 51.919034 -7.547422 51.954236 -7.249374 52.109127 -6.808169 52.177185 -6.312986 52.144330 -6.268397 52.393094 -6.125240 52.695836 -5.991470 52.928173 -6.057181 53.200406 -6.036060 53.345909 -6.068916 53.594674 -6.244928 53.869254 -6.080650 53.979555 -6.003204 54.012410 -5.561999 54.218932 -5.561999 54.418413 -5.451698 54.369129 -5.594855 54.636669 -5.761480 54.911248 -6.268397 55.188175 -6.796435 55.131851 -7.082748 55.075527 -6.939591 55.244499 -7.249374 55.314904 -7.326819 55.239805 -7.338553 55.030937 -7.446508 54.941757 -7.446508 54.941757 # -b -9.983437 52.212388 -10.258016 52.069231 -10.039761 52.083312 # -b -9.774568 52.048109 -10.182918 51.804039 -10.004558 51.750061 -10.004558 51.750061 # -b -43.963262 59.947557 -43.996118 59.914701 -43.996118 59.816134 -43.665214 59.860724 -43.864695 59.947557 -43.963262 59.947557 # -b -43.918673 60.020308 -43.545526 59.971025 -43.512670 59.971025 # -b -60.006227 55.284395 -59.663589 55.340719 -59.454721 55.213990 -59.532167 54.974613 -59.156673 55.087261 -58.947805 55.030937 -58.551190 54.847884 -58.175696 54.810334 -58.020805 54.960532 -57.922238 54.777479 -57.603068 54.695340 -57.481033 54.514633 -57.657045 54.413719 -58.020805 54.399638 -58.241407 54.322193 -58.527721 54.207198 -59.377276 54.089856 -59.046372 54.059347 -58.990048 54.026492 -59.839602 53.895069 -59.839602 53.895069 # -b -60.104794 53.334175 -59.553288 53.608755 -58.837504 53.942005 -58.098250 54.103937 -57.865914 54.136793 -58.429154 54.136793 -57.668780 54.207198 -57.204106 54.148527 -57.171251 53.805889 -57.281552 53.465598 -57.138395 53.543043 -56.610357 53.791808 -56.410876 53.681507 -55.859370 53.568859 -55.892225 53.531309 -55.781924 53.352950 -55.683357 53.174590 -56.058851 53.134694 -56.136296 53.054902 -55.826514 52.923479 -55.892225 52.801444 -55.727947 52.623084 -55.969671 52.569107 -55.584790 52.379013 -55.892225 52.346158 -55.781924 52.062190 -56.443732 51.646801 -56.863815 51.468441 -57.800202 51.398036 -58.572311 51.233758 -59.001782 50.914588 -59.398397 50.564910 -59.982759 50.262168 -59.982759 50.262168 # -b -56.202008 51.508337 -56.410876 51.454360 -56.664334 51.268960 -56.863815 51.123456 -56.983504 50.949791 -57.272164 50.755003 -57.204106 50.628274 -57.382466 50.402978 -57.358997 50.219925 -57.436443 50.149520 -57.635924 50.036872 # -b -56.079972 49.987588 -56.035382 50.121358 -56.169152 50.128398 # -b -56.720658 49.914836 -56.378020 50.438181 -56.190273 50.790206 -55.892225 50.907548 -55.814780 51.212636 -55.671623 51.365180 -55.695091 51.564661 -56.202008 51.508337 -56.202008 51.508337 # -b -70.083537 59.926435 -69.686922 59.898273 -69.466320 59.799706 -69.421730 59.633081 -69.609477 59.407784 -69.466320 59.342073 -69.266839 59.266974 -69.388874 59.121471 -69.222249 59.018210 -69.344284 58.997088 -69.686922 58.853931 -69.839467 59.008822 # -b -70.006092 58.968926 -69.907525 58.877400 -69.916912 58.814035 # -b -70.006092 58.734243 -69.618864 58.727202 -69.079092 58.858625 -68.461874 58.870359 -68.264740 58.591086 -68.318717 58.161615 -69.278573 57.835405 -68.318717 58.105291 -67.933836 58.614554 -67.811801 58.457316 -67.778945 58.145187 -67.436307 58.330587 -66.917657 58.476091 -66.521042 58.762405 -66.046981 58.710774 -65.993004 58.499559 -65.960148 58.790567 -65.960148 58.849238 -65.849847 58.957192 -65.605776 59.166060 -65.561186 59.266974 -65.375786 59.358501 -65.352318 59.593184 -65.474353 59.860724 -65.331196 59.987453 # -b -64.371341 60.036736 -64.317364 59.914701 -64.228184 59.665936 -64.096761 59.553288 -63.819834 59.464108 -63.709533 59.297483 -63.545255 59.245853 -63.369242 59.149633 -63.953604 59.093309 -64.052171 59.046372 -63.676678 59.041678 -63.247207 59.081574 -63.247207 58.968926 -63.235473 58.802301 -62.937424 58.809341 -62.817736 58.654450 -63.258941 58.544149 -63.467809 58.562924 -63.423219 58.476091 -62.904569 58.487825 -62.540809 58.389258 -62.707435 58.278957 -62.982014 58.180390 -62.871713 58.121719 -62.475098 58.121719 -62.442242 58.016111 -62.430508 57.917544 -62.209906 57.877648 -61.846146 57.628883 -62.385918 57.488073 -61.902470 57.434096 -61.759313 57.225228 -61.372085 57.032787 -61.693602 56.697190 -62.343675 56.835653 -62.132460 56.701884 -62.871713 56.640866 -61.979916 56.617397 -61.857880 56.532911 -61.956447 56.441385 -61.670134 56.281800 -61.702989 56.202008 -61.294640 56.122215 -61.273518 55.906306 -60.722012 55.875798 -60.468554 55.758456 -60.346519 55.582443 -60.423964 55.321944 -60.193974 55.352453 -60.006227 55.284395 # -b -59.839602 53.895069 -60.346519 53.681507 -61.052916 53.805889 -60.447432 53.622836 -60.269073 53.399887 -60.104794 53.334175 # -b -59.982759 50.262168 -60.104794 50.452262 -60.325397 50.290330 -61.074037 50.226965 -61.658399 50.135439 -62.155928 50.290330 -62.970280 50.304411 -63.733002 50.304411 -63.864424 50.318492 -64.427665 50.346654 -65.098860 50.297370 -65.882703 50.297370 -66.255849 50.255127 -66.553897 50.156560 -66.732257 50.072074 # -b -80.038812 51.184474 -79.707908 51.074173 -79.719642 51.454360 -79.564751 51.578742 -79.663318 51.454360 -79.409860 51.632720 -79.046101 51.475482 -78.881822 51.268960 -78.682341 51.447320 -78.914678 51.653841 -78.935800 51.836894 -78.661220 51.968317 -78.461739 52.184226 -78.053390 52.191266 -78.011147 52.266365 -78.363172 52.252284 -78.583774 52.475233 -78.780908 52.634818 -78.748053 52.808484 -78.870088 53.087757 -78.947534 53.432742 -78.968655 53.714362 -78.992124 53.942005 -79.266703 54.270562 -79.499040 54.502899 -79.719642 54.554529 -79.156402 54.721155 -78.407762 55.019203 -77.645040 55.352453 -77.403316 55.509691 -77.358726 55.627033 -76.851810 56.148030 -76.455195 56.117522 -76.213471 56.244251 -76.377749 56.429651 -76.544375 56.483628 -76.708653 56.263025 -76.753243 56.453119 -76.807220 56.769942 -76.950377 57.032787 -77.006701 57.297980 -77.203835 57.640618 -77.349339 57.948053 -77.513617 58.196818 -77.701364 58.271916 -78.142569 58.436195 -78.518063 58.591086 -78.825498 58.802301 -78.804377 58.910255 -78.682341 59.105043 -78.220015 59.201263 -77.921967 59.250546 -77.745954 59.386663 -77.832787 59.536860 -77.513617 59.588491 -77.072412 59.593184 -77.447906 59.694098 -77.325871 59.853683 -77.325871 59.947557 -77.745954 59.982759 -77.745954 59.982759 # -b -70.909623 60.032043 -70.447297 59.926435 -70.083537 59.926435 # -b -69.839467 59.008822 -70.027213 58.997088 -70.006092 58.968926 # -b -69.916912 58.814035 -70.468418 58.666185 -70.644431 58.539455 -70.006092 58.734243 -70.006092 58.734243 # -b -90.026942 56.931873 -89.376869 56.793410 -88.902808 56.671375 -88.417013 56.502403 -88.032133 56.342818 -87.712963 56.068238 -87.536950 55.981405 -87.238902 55.894572 -86.797697 55.826514 -86.487915 55.746722 -86.070178 55.671623 -85.727540 55.558975 -85.396637 55.382962 -85.539794 55.030937 -85.617239 54.922983 -85.307457 55.263274 -84.493105 55.270314 -83.962720 55.221031 -83.411214 55.232765 -82.993477 55.239805 -82.617984 55.138891 -82.376260 55.124810 -82.287080 54.866658 -82.409116 54.310459 -82.277693 53.876294 -82.221369 53.273157 -82.254224 52.888276 -81.979645 52.670021 -81.592417 52.407175 -81.693331 52.245244 -82.155657 52.055150 -81.923321 52.090353 -81.550174 52.144330 -81.118356 52.008213 -80.710007 51.754755 -80.545728 51.440279 -80.876632 51.184474 -81.031523 51.053051 -80.599706 51.247839 -80.292270 51.261920 -80.038812 51.184474 # -b -82.021888 53.108879 -81.669862 53.155816 -81.296716 53.115919 -80.897754 52.928173 -80.799187 52.648899 -81.338959 52.801444 -81.857609 52.923479 -82.122802 52.996231 -82.021888 53.108879 # -b -98.003835 54.315152 -97.881800 54.340967 -97.837210 54.211891 -97.935777 53.960780 -97.560283 53.972514 -97.780886 53.913843 -97.738643 53.672119 -97.595486 53.430395 -97.473450 53.153469 -97.285703 52.975109 -97.241114 52.674714 -97.065101 52.458806 -97.032245 52.249937 -96.853886 52.048109 -96.767053 51.883831 -96.579306 51.672616 -96.445536 51.534153 -96.224934 51.341712 -96.170957 51.135191 -96.236668 50.869998 -96.335235 50.583684 -96.588693 50.407672 -96.865620 50.520320 -96.877354 50.926322 -96.579306 51.259573 -96.701341 51.217330 -96.689607 51.534153 -96.853886 51.747715 -97.053367 51.480175 -97.318559 51.761796 -97.583751 52.019947 -97.572017 52.134942 -97.726908 51.991785 -97.816088 51.876791 -98.102402 52.188920 -98.367594 52.379013 -98.421572 52.444725 -98.731354 52.627778 -98.743088 52.953988 -98.632787 53.059595 -98.975425 53.066636 -99.184293 53.284892 -99.160825 53.489066 -98.996546 53.667426 -98.886245 53.817623 -98.710232 53.784767 -98.257293 53.763646 -97.926389 53.700281 -98.179848 53.906803 -98.135258 54.148527 -98.200969 54.200157 -98.388716 54.270562 -98.477896 54.359742 -98.191582 54.404332 -98.036691 54.355048 -97.959245 54.348008 -97.959245 54.348008 # -b -94.734694 60.093060 -94.812139 59.771544 -94.823873 59.447681 -94.901319 59.121471 -94.758162 58.921990 -94.504704 58.757711 -94.382668 58.790567 -94.338079 58.504253 -94.260633 58.769445 -93.864018 58.797607 -93.455669 58.750671 -93.225679 58.727202 -93.202210 58.706081 -93.103643 58.417420 -92.850185 58.109985 -92.751618 57.652352 -92.498160 57.314408 -92.575605 57.039828 -92.850185 56.920139 -92.575605 56.967076 -92.408980 56.962382 -92.343269 56.931873 -91.869208 57.086765 -91.174545 57.267471 -90.655894 57.147782 -90.214689 56.967076 -90.026942 56.931873 # -b -110.136973 59.266974 -109.761479 59.553288 -109.407107 59.726954 -109.341395 59.811440 -109.285071 59.921741 -108.888456 59.888886 -108.512963 59.888886 -108.733565 59.771544 -109.163036 59.677670 -109.141915 59.508698 -108.811011 59.569716 -108.733565 59.492271 -108.688975 59.370235 -108.214915 59.452374 -107.827687 59.447681 -107.707998 59.407784 -107.529639 59.414825 -107.309036 59.342073 -106.945277 59.335033 -106.492338 59.323298 -106.680084 59.262281 -107.043844 59.290443 -107.341892 59.285749 -107.717386 59.295136 -108.083492 59.154326 -108.634998 59.133205 -109.064469 59.121471 -109.540876 59.058106 -109.982081 58.950152 -109.982081 58.950152 # -b -111.195395 58.717815 -111.162540 58.757711 -111.031117 58.825769 -110.599299 59.086268 -110.136973 59.266974 -110.136973 59.266974 # -b -109.982081 58.950152 -110.235540 58.853931 -110.169828 58.717815 -110.477264 58.675572 -110.876226 58.647410 -111.096828 58.706081 -111.195395 58.717815 -111.195395 58.717815 # -b -130.052216 53.510188 -129.843347 53.273157 -129.974770 53.273157 -129.974770 53.273157 # -b -129.819879 53.660385 -129.763555 53.646304 -129.632132 53.554778 -129.521831 53.404580 -129.587542 53.219180 -129.754167 53.411621 -129.864469 53.554778 -129.974770 53.634570 # -b -130.019360 53.829357 -129.918446 53.751912 -129.819879 53.660385 -129.819879 53.660385 # -b -129.235517 52.867155 -129.179193 52.853074 -129.059504 52.714611 -129.003180 52.559720 -129.179193 52.693489 -129.247251 52.841340 -129.235517 52.867155 # -b -127.512940 50.421753 -127.468350 50.428793 -127.512940 50.647049 -127.987001 50.731535 -128.240459 50.625927 -128.296783 50.823062 -127.822722 50.855917 -127.489472 50.780819 -126.905110 50.583684 -126.463905 50.506239 -126.043821 50.428793 -125.626084 50.365429 -125.459459 50.210538 -125.304568 50.041565 # -b -127.158568 49.971160 -127.125712 50.140133 -127.313459 50.076768 -127.524674 50.189416 -127.799254 50.147173 -127.799254 50.302064 -127.909555 50.463996 -127.534061 50.449915 -127.512940 50.421753 # -b -123.903507 49.957079 -123.945750 50.048606 -123.980953 50.027484 # -b -124.654495 49.964120 -124.708472 50.133092 -124.631026 50.287983 -124.631026 50.435834 -124.807039 50.393591 -124.973664 50.435834 -125.039376 50.555522 -125.194267 50.499198 -125.471193 50.527360 -125.668327 50.569603 -125.846687 50.520320 -126.154122 50.541441 -126.452170 50.590725 -126.121267 50.654089 -126.043821 50.717454 -126.109532 50.823062 -126.398193 50.884079 -126.177591 50.926322 -126.562472 51.024889 -126.750218 50.982646 -127.071735 51.003768 -127.137446 50.898160 -127.468350 51.010808 -127.602120 51.064786 -127.733542 51.273654 -127.414373 51.327631 -127.534061 51.398036 -127.733542 51.405077 -127.545796 51.466094 -127.325193 51.473135 -127.456616 51.548234 -127.369783 51.679656 -127.489472 51.773530 -127.656097 51.630373 -127.843844 51.712512 -127.843844 51.911993 -127.855578 52.005866 -127.843844 52.163104 -127.909555 52.317996 -128.010469 52.425950 -128.263927 52.371973 -128.240459 52.451765 -128.395350 52.559720 -128.660542 52.533904 -128.803699 52.646552 -128.946856 52.754507 -129.068892 52.874195 -129.158071 53.015006 -129.047770 53.193365 -129.036036 53.310707 -129.047770 53.444476 -129.134603 53.510188 -129.247251 53.456211 -129.322350 53.477332 -129.432651 53.521922 -129.632132 53.653345 -129.763555 53.784767 -129.941914 53.880988 -129.941914 53.880988 # -b -130.007626 54.141486 -129.918446 54.167302 -129.941914 54.230666 # -b -130.117927 55.061446 -130.272818 55.073180 -130.293940 55.042671 -130.415975 54.953491 -130.669433 54.871352 -130.824324 54.904208 -130.934626 54.800947 -130.967481 55.035631 -130.714023 55.080220 -130.559132 55.136545 -130.714023 55.357147 -130.880648 55.338372 -130.890036 55.495610 -130.934626 55.737334 -131.077782 55.875798 -131.145841 56.023648 -131.223286 56.122215 -131.432155 55.997833 -131.631636 55.974365 -131.819382 55.899266 -131.861625 55.751415 -131.995395 55.664582 -132.159673 55.582443 -132.260587 55.781924 -132.082228 55.842942 -132.016517 55.967324 -131.995395 56.152724 -131.608167 56.213742 -131.784180 56.274760 -131.995395 56.335777 -132.204263 56.422610 -132.326299 56.591582 -132.326299 56.701884 -132.502311 56.720658 -132.591491 56.840347 -132.844949 56.877896 -132.934129 56.948301 -133.053818 57.070337 -132.767504 56.917792 -132.922395 57.124314 -133.175853 57.117273 -133.286154 57.178291 -133.506757 57.201759 -133.363600 57.302673 -133.232177 57.361344 -133.485635 57.403587 -133.539613 57.469299 -133.452780 57.605415 -133.694504 57.605415 -133.551347 57.694595 -133.241564 57.598375 -133.098407 57.504501 -133.110142 57.539704 -133.274420 57.706329 -133.452780 57.753266 -133.506757 57.910504 -133.342478 57.929278 -133.673382 57.933972 -133.762562 57.816630 -133.861129 57.987949 -133.551347 58.074782 -133.750828 58.051314 -133.649914 58.196818 -133.882250 58.086516 -134.093466 58.086516 -134.135709 58.232020 -134.323455 58.232020 -134.555792 58.347015 -134.853840 58.417420 -135.065055 58.623942 -135.130767 58.797607 -135.252802 58.957192 -135.515648 59.407784 -135.560238 59.295136 -135.583706 59.194222 -135.482792 58.985354 -135.295045 58.670878 -135.175357 58.452623 -135.295045 58.232020 -135.539116 58.452623 -135.703394 58.412726 -135.959200 58.476091 -136.001443 58.635676 -136.078888 58.877400 -136.278369 58.809341 -136.632741 58.933724 -136.731308 58.945458 -137.005888 59.025250 -137.095068 58.921990 -137.041091 58.905562 -136.698453 58.790567 -136.522440 58.706081 -136.421526 58.654450 -136.200924 58.520681 -136.334693 58.347015 -136.564683 58.393952 -136.653863 58.271916 -136.951911 58.365790 -137.339139 58.457316 -137.702898 58.595779 -137.714632 58.717815 -137.890645 58.734243 -138.200427 58.957192 -138.266138 59.173101 -138.144103 59.386663 -137.857789 59.548595 -138.155837 59.642468 -138.000946 59.492271 -138.275526 59.447681 -138.442151 59.407784 -138.421030 59.210650 -138.728465 59.182488 -138.895090 59.234119 -139.315174 59.346767 -139.458331 59.386663 -139.634343 59.447681 -139.899536 59.525126 -139.690667 59.604919 -139.613222 59.738688 -139.667199 59.893579 -139.502921 59.971025 -139.458331 59.792665 -139.348029 59.569716 -139.348029 59.731648 -139.204873 59.860724 -139.324561 59.905313 -139.434862 59.954597 # -b -139.711789 60.057858 -139.955860 59.872458 -139.955860 59.872458 # -b -134.943020 57.283899 -134.886696 57.248696 -134.910164 56.997585 -134.776395 56.997585 -134.809250 56.877896 -134.755273 56.755861 -134.710683 56.500056 -134.722417 56.427304 -134.722417 56.281800 -134.877309 56.300575 -134.996997 56.464853 -134.975876 56.713618 -134.954754 56.805144 -135.107298 56.720658 -135.306779 56.847387 -135.295045 56.955342 -135.273924 57.093805 -135.449936 57.255737 -135.661151 57.356651 -135.583706 57.511542 -135.428815 57.473992 -135.142501 57.391853 -134.987610 57.302673 -134.943020 57.283899 # -b -134.633238 57.617149 -134.731805 57.746225 -134.820984 57.898769 -134.832719 58.063048 -134.644972 58.180390 -134.368045 58.173349 -134.147443 58.023152 -133.959696 57.804896 -133.861129 57.621843 -133.915106 57.652352 -134.048876 57.811937 -134.192033 57.980909 -134.302334 58.070088 -134.358658 57.945706 -134.180298 57.753266 -134.037142 57.628883 -134.025407 57.539704 -134.037142 57.462258 -134.060610 57.361344 -134.192033 57.333182 -134.302334 57.283899 -134.433757 57.124314 -134.621503 57.093805 -134.644972 57.236962 -134.621503 57.321448 -134.457225 57.380119 -134.534671 57.457564 -134.445491 57.546744 -134.567526 57.551438 -134.633238 57.617149 # -b -134.203767 56.647906 -134.358658 56.732392 -134.433757 56.877896 -134.246010 56.924833 -133.992552 56.791063 -133.882250 56.647906 -133.959696 56.464853 -133.959696 56.293534 -134.060610 56.267719 -134.246010 56.293534 -134.168564 56.446079 -134.135709 56.537605 -134.281212 56.617397 -134.203767 56.647906 # -b -133.795418 56.924833 -133.893985 56.990544 -134.016020 57.098499 -133.607671 57.063296 -133.319010 57.032787 -133.077286 56.948301 -133.053818 56.840347 -133.053818 56.671375 -133.199321 56.755861 -133.384721 56.852081 -133.265033 56.676068 -133.187587 56.561073 -133.375334 56.514137 -133.649914 56.579848 -133.717972 56.852081 -133.727359 56.894324 -133.882250 56.906058 -133.795418 56.924833 -133.795418 56.924833 # -b -132.856683 56.805144 -132.823828 56.779329 -132.645468 56.610357 -132.755770 56.591582 -132.910661 56.603316 -132.943516 56.791063 -132.856683 56.805144 -132.856683 56.805144 # -b -132.767504 56.434344 -132.722914 56.317003 -132.856683 56.317003 -133.086673 56.396795 -132.856683 56.469547 -132.767504 56.434344 -132.767504 56.434344 # -b -132.105696 56.335777 -131.995395 56.255985 -132.082228 56.213742 -132.227732 56.267719 -132.338033 56.385061 -132.314565 56.422610 -132.150286 56.366286 -132.105696 56.335777 # -b -135.130767 58.081823 -135.041587 58.051314 -135.130767 57.952747 -135.119033 57.894076 -135.363103 57.840099 -135.682273 57.910504 -135.649417 57.851833 -135.363103 57.781428 -135.217600 57.776734 -135.020465 57.633577 -135.020465 57.481033 -135.395959 57.593681 -135.694007 57.776734 -135.825430 57.682861 -135.694007 57.546744 -135.825430 57.415321 -136.036645 57.516235 -136.123478 57.633577 -136.266635 57.769694 -136.388670 57.976215 -136.322959 58.039580 -136.400405 58.215592 -136.233779 58.149881 -136.057767 58.248448 -135.738597 58.239061 -135.506260 58.121719 -135.252802 58.133453 -135.130767 58.081823 -135.130767 58.081823 # -b -132.812094 56.035382 -132.645468 55.899266 -132.502311 55.725600 -132.502311 55.683357 -132.269975 55.540200 -132.380276 55.540200 -132.558635 55.533160 -132.448334 55.413471 -132.183142 55.352453 -132.192529 55.225724 -132.039985 55.136545 -132.171408 54.986347 -132.028251 54.927676 -132.049372 54.744623 -132.192529 54.763398 -132.338033 54.904208 -132.424866 54.991041 -132.568023 55.073180 -132.678324 55.213990 -132.966985 55.275008 -133.241564 55.368881 -133.044430 55.469795 -132.976372 55.589484 -133.164119 55.627033 -133.363600 55.763149 -133.286154 56.028342 -133.309623 56.171499 -133.408190 56.047117 -133.661648 55.955590 -133.649914 56.115175 -133.661648 56.281800 -133.584202 56.366286 -133.363600 56.331084 -133.110142 56.274760 -133.131263 56.084666 -132.901273 56.065891 -132.812094 56.035382 # -b -131.420420 55.312557 -131.321853 55.345413 -131.244408 55.263274 -131.101251 55.155319 -130.958094 55.237458 -131.044927 55.446327 -131.044927 55.725600 -131.145841 55.892225 -131.354709 55.948549 -131.542456 55.868757 -131.596433 55.788965 -131.652757 55.688051 -131.706734 55.533160 -131.608167 55.345413 -131.554190 55.521425 -131.399299 55.465101 -131.375831 55.619993 -131.333587 55.401737 -131.420420 55.312557 -131.420420 55.312557 # -b -133.053818 55.035631 -132.955251 54.960532 -132.800359 54.770438 -133.044430 54.890127 -133.253299 55.087261 -133.253299 55.256233 -133.065552 55.124810 -133.053818 55.035631 # -b -131.631636 55.312557 -131.497866 55.225724 -131.399299 55.073180 -131.542456 55.113076 -131.587046 55.237458 -131.631636 55.312557 # -b -132.061106 54.049960 -131.819382 54.153221 -131.807648 53.822317 -131.950805 53.477332 -132.072841 53.233261 -132.171408 53.284892 -132.314565 53.284892 -132.525780 53.273157 -132.535167 53.364684 -132.568023 53.514881 -132.866071 53.627530 -133.032696 53.939659 -133.121876 54.141486 -132.833215 54.174342 -132.678324 54.042919 -132.502311 54.108631 -132.281709 54.012410 -132.359154 53.822317 -132.657202 53.693241 -132.481190 53.653345 -132.314565 53.667426 -132.138552 53.869254 -132.093962 53.979555 -132.093962 54.042919 -132.061106 54.049960 # -b -132.150286 52.740426 -132.192529 52.813178 -132.260587 52.895317 -132.227732 53.054902 -132.359154 53.113573 -132.105696 53.186325 -131.894481 53.291932 -131.706734 53.113573 -131.939071 53.073676 -131.673879 52.961028 -131.917949 52.900011 -131.939071 52.707570 -131.828770 52.592575 -131.575311 52.512783 -131.432155 52.386054 -131.265529 52.163104 -131.542456 52.303915 -131.774792 52.444725 -131.751324 52.505742 -132.039985 52.667674 -132.150286 52.740426 # -b -130.660046 53.979555 -130.603722 54.042919 -130.460565 54.101590 -130.293940 53.946699 -130.472299 53.902109 -130.624843 53.965474 -130.660046 53.979555 # -b -130.538010 53.660385 -130.493421 53.646304 -130.162517 53.554778 -130.052216 53.510188 # -b -129.974770 53.273157 -130.305674 53.482026 -130.526276 53.646304 -130.538010 53.660385 # -b -129.974770 53.634570 -130.052216 53.737831 -130.150783 53.784767 -130.251696 53.880988 -130.150783 53.902109 -130.019360 53.829357 -130.019360 53.829357 # -b -129.941914 53.880988 -130.117927 54.005370 -130.007626 54.141486 # -b -129.941914 54.230666 -130.183638 54.218932 -130.371385 54.348008 -130.472299 54.451269 -130.404241 54.610853 -130.239962 54.725848 -130.162517 54.756357 -130.106193 54.915942 -130.040481 55.012162 -130.117927 55.061446 -130.117927 55.061446 # -b -139.955860 59.872458 -140.385331 59.731648 -140.915715 59.776238 -141.455487 59.881845 -141.389776 59.966331 -141.401510 59.992146 # -b -141.643234 60.008574 -142.084439 59.987453 -142.084439 59.987453 # -b -147.484507 60.003881 -147.606542 59.881845 -147.913978 59.792665 -147.925712 59.947557 -147.836532 59.975719 # -b -148.742410 60.015615 -149.195350 59.975719 -149.195350 59.975719 # -b -149.394831 60.008574 -149.472276 59.987453 # -b -149.547375 60.015615 -149.702266 59.715220 -149.880626 59.898273 -149.934603 59.698792 -149.934603 59.698792 # -b -158.568609 56.366286 -158.568609 56.342818 -158.390250 56.305268 -158.446574 56.176192 -158.556875 56.084666 -158.556875 56.281800 -158.568609 56.366286 # -b -154.771430 56.556380 -154.693984 56.579848 -154.604805 56.579848 -154.726840 56.415570 -154.771430 56.556380 -154.771430 56.556380 # -b -154.241045 56.544646 -154.372468 56.556380 -154.241045 56.629132 -154.184721 56.568114 -154.241045 56.544646 # -b -153.192010 57.129008 -153.245987 57.086765 -153.433734 57.117273 -153.203744 57.206453 -152.947939 57.190025 -153.192010 57.129008 -153.192010 57.129008 # -b -154.837141 57.373078 -154.848875 57.403587 -154.661129 57.551438 -154.372468 57.659392 -154.130744 57.621843 -154.053298 57.523276 -153.865552 57.427056 -153.809228 57.570213 -153.865552 57.722757 -153.931263 57.898769 -153.666071 57.711023 -153.433734 57.835405 -153.192010 57.858873 -153.159154 57.933972 -152.980795 57.804896 -152.760192 57.905810 -152.595914 57.753266 -152.584180 57.671126 -152.384699 57.617149 -152.330721 57.516235 -152.640504 57.511542 -152.992529 57.558478 -152.861106 57.462258 -152.682747 57.349610 -152.849372 57.333182 -153.015997 57.349610 -153.081709 57.279205 -153.457202 57.194719 -153.710660 57.063296 -153.766984 56.877896 -154.119010 56.791063 -153.942997 57.009319 -154.107276 57.093805 -154.339612 57.194719 -154.241045 57.136048 -154.351346 56.906058 -154.593070 57.182985 -154.837141 57.373078 -154.837141 57.373078 # -b -153.478324 58.109985 -153.445468 58.145187 -153.203744 58.126412 -153.236600 58.074782 -153.457202 58.086516 -153.478324 58.109985 # -b -152.793048 58.290691 -152.893962 58.318853 -152.882228 58.405686 -152.694481 58.476091 -152.384699 58.469050 -152.462144 58.354055 -152.232154 58.337628 -152.142975 58.227326 -152.551324 58.145187 -152.849372 58.098250 -152.971407 58.070088 -153.081709 58.173349 -153.147420 58.208552 -152.980795 58.290691 -152.793048 58.290691 -152.793048 58.290691 # -b -152.682747 58.647410 -152.628769 58.602820 -152.495000 58.635676 -152.495000 58.532415 -152.682747 58.607514 -152.682747 58.647410 # -b -160.002525 56.537605 -159.814779 56.586889 -159.429898 56.706577 -159.054404 56.870856 -158.789212 56.847387 -158.613199 57.129008 -158.413718 57.236962 -158.193116 57.384813 -157.850478 57.605415 -157.728442 57.875301 -157.641609 58.173349 -157.463250 58.330587 -157.540695 58.480785 -157.132346 58.774139 -157.087756 58.858625 -156.813176 59.098002 -157.078369 59.069840 -157.376417 58.905562 -157.683852 58.774139 -158.017103 58.694347 -158.324538 58.682612 -158.613199 58.837504 -158.535753 58.968926 -158.667176 58.968926 -158.899513 58.802301 -158.854923 58.670878 -158.998080 58.433848 -159.176439 58.469050 -159.439285 58.745977 -159.650500 58.917296 -159.826513 58.905562 -159.925080 58.870359 # -b -149.934603 59.698792 -150.256119 59.665936 -150.486109 59.374929 -150.563555 59.543901 -150.840481 59.442987 -151.138529 59.323298 -151.302808 59.238812 -151.800337 59.189529 -152.020939 59.342073 -151.866048 59.480536 -151.690035 59.499311 -151.424843 59.464108 -151.370866 59.543901 -151.072818 59.783278 -151.546878 59.661243 -151.866048 59.705833 -151.800337 59.947557 -151.800337 59.947557 # -b -152.771926 60.020308 -153.081709 59.905313 -153.159154 59.837255 -153.457202 59.698792 -153.633215 59.687058 -153.710660 59.569716 -153.942997 59.419519 -154.250433 59.217691 -154.250433 59.041678 -153.788106 59.006476 -153.522914 58.945458 -153.490058 58.767098 -153.687192 58.670878 -154.020443 58.579352 -154.184721 58.476091 -154.327878 58.347015 -154.217577 58.239061 -154.527359 58.173349 -154.780817 58.074782 -155.111721 58.016111 -155.233756 57.905810 -155.444972 57.828364 -155.564660 57.753266 -155.785263 57.788468 -155.886177 57.605415 -156.193612 57.485726 -156.503394 57.415321 -156.592574 57.314408 -156.491660 57.190025 -156.735731 57.028094 -156.900009 56.985851 -157.111225 56.906058 -157.352949 56.840347 -157.618141 56.786370 -157.751911 56.659641 -158.071080 56.636172 -157.927923 56.591582 -158.237705 56.514137 -158.622586 56.410876 -159.030936 56.410876 -159.152971 56.427304 -158.744622 56.251291 -158.789212 56.035382 -158.899513 56.035382 -159.197561 55.936815 -159.429898 55.911000 -159.561320 55.925081 -159.650500 55.725600 -159.781923 55.612952 -159.749067 55.807739 -159.993138 55.824167 -159.993138 55.824167 # -b -169.331195 52.801444 -169.277218 52.907051 -169.000291 53.179284 -168.735099 53.324788 -168.547352 53.482026 -168.106147 53.536003 -168.261038 53.343562 -168.615410 53.172244 -168.868869 53.007965 -169.298339 52.787363 -169.331195 52.801444 # -b -167.840955 53.317747 -167.840955 53.404580 -167.587497 53.430395 -167.310570 53.627530 -167.089968 53.679160 -167.179147 53.784767 -167.125170 53.991289 -166.791919 53.888028 -166.550195 54.017104 -166.538461 53.880988 -166.615907 53.770686 -166.791919 53.601714 -167.134557 53.477332 -167.533519 53.338869 -167.840955 53.317747 -167.840955 53.317747 # -b -166.130112 54.277603 -165.975221 54.230666 -166.019811 54.064041 -166.240413 54.153221 -166.130112 54.277603 # -b -165.048221 54.648403 -164.827618 54.756357 -164.595282 54.986347 -164.132955 54.998081 -163.811439 55.113076 -163.647160 55.042671 -163.569715 54.878393 -163.468801 54.833803 -163.304522 54.782172 -163.459414 54.751664 -164.055510 54.662484 -164.705583 54.392598 -164.982510 54.547489 -165.048221 54.648403 # -b -162.896173 54.500552 -162.795259 54.521674 -162.708426 54.437188 -162.896173 54.500552 -162.896173 54.500552 # -b -160.732391 55.368881 -160.798103 55.375922 -160.720657 55.413471 -160.643211 55.357147 -160.610356 55.270314 -160.744125 55.237458 -160.887282 55.289089 -160.842692 55.368881 -160.732391 55.368881 # -b -160.854427 58.846891 -160.896670 58.710774 -161.161862 58.612207 -161.051561 58.757711 -160.854427 58.846891 -160.854427 58.846891 # -b -165.688907 60.003881 -165.954099 59.942863 -166.186436 59.872458 -166.615907 59.872458 -166.991400 59.982759 -167.212003 59.999187 # -b -163.435945 55.188175 -163.205955 55.244499 -163.006474 55.251539 -162.830462 55.375922 -162.675571 55.502651 -162.497211 55.650501 -162.199163 55.807739 -161.769692 55.960284 -161.471644 56.016608 -161.295632 56.072932 -161.030439 56.054157 -161.030439 55.960284 -160.776981 55.887532 -160.631477 55.911000 -160.345163 55.849982 -160.401487 55.906306 -160.622090 55.974365 -160.544644 56.171499 -160.213741 56.422610 -160.002525 56.537605 # -b -159.925080 58.870359 -160.190272 58.905562 -160.368632 58.957192 -160.324042 59.121471 -160.434343 59.229425 -160.744125 58.990048 -161.051561 58.938417 -161.459910 58.797607 -161.614801 58.687306 -162.034885 58.635676 -161.912849 58.722509 -161.725102 58.877400 -161.736837 59.086268 -161.891728 59.149633 -162.056006 59.318605 -161.826016 59.464108 -161.879994 59.633081 -162.056006 59.898273 -162.189776 59.982759 # -b -162.574657 60.081326 -162.839849 59.853683 -163.105041 59.670630 -163.492269 59.698792 -163.790317 59.738688 -164.121221 59.837255 -163.856029 59.954597 -164.067244 59.975719 -164.067244 59.975719 # -b -159.993138 55.824167 -160.246596 55.737334 -160.500054 55.688051 -160.666680 55.594177 -160.819224 55.577750 -160.964728 55.526119 -161.316753 55.446327 -161.626535 55.465101 -161.647657 55.664582 -161.868259 55.469795 -162.034885 55.263274 -162.222631 55.176441 -162.443234 55.124810 -162.541801 55.150626 -162.619247 55.270314 -162.684958 55.213990 -162.762404 55.049712 -163.060452 55.054405 -163.205955 55.087261 -163.337378 54.908902 -163.391355 55.030937 -163.536859 55.131851 -163.435945 55.188175 # -b -169.873314 56.647906 -169.894435 56.617397 -169.751279 56.603316 -169.774747 56.549339 -169.774747 56.549339 -169.873314 56.647906 # -b -178.429875 51.916687 -178.406406 51.951889 -178.141214 51.923727 -177.843166 51.855669 -177.976936 51.686697 -178.242128 51.679656 -178.296105 51.843935 -178.429875 51.916687 # -b -177.822045 51.686697 -177.610829 51.754755 -177.390227 51.855669 -177.237683 51.904953 -177.357371 51.733634 -177.732865 51.686697 -177.822045 51.686697 # -b -177.038202 51.808732 -176.927900 51.829854 -176.895045 51.973011 -176.751888 51.904953 -176.585262 51.848629 -176.531285 51.768836 -176.805865 51.691391 -176.972490 51.698431 -177.038202 51.808732 -177.038202 51.808732 # -b -174.454336 52.386054 -174.367503 52.425950 -174.189144 52.271059 -174.355769 52.141983 -174.576372 52.066884 -174.818096 52.113821 -174.597493 52.217082 -174.454336 52.343811 -174.454336 52.386054 # -b -174.156288 52.156064 -174.123432 52.156064 -173.881708 52.149023 -173.548458 52.113821 -173.241022 52.113821 -173.515602 52.052803 -173.902830 52.066884 -174.156288 52.156064 -174.156288 52.156064 # -b -172.698903 52.418909 -172.588602 52.386054 -172.621458 52.282793 -172.698903 52.418909 -172.698903 52.418909 # -b -170.546856 57.201759 -170.448289 57.225228 -170.535121 57.178291 -170.546856 57.201759 # -b 172.297595 52.928173 172.285860 52.939907 172.473607 53.015006 172.750534 52.993884 172.950015 52.928173 173.135415 52.860114 172.860835 52.787363 172.640233 52.820218 172.506463 52.874195 172.297595 52.928173 172.297595 52.928173 # -b 177.441857 52.141983 177.498181 52.181879 177.498181 52.034028 177.397267 51.944849 177.110954 51.911993 177.441857 52.141983 177.441857 52.141983 # -b 178.512014 51.665575 178.622315 51.686697 179.000000 51.499861 179.000000 51.499861 # -b 179.000000 51.414012 178.612928 51.597517 178.512014 51.665575 # -b 170.375537 60.048470 170.222992 59.942863 170.089223 59.971025 # -b 164.998937 59.804400 164.736092 59.942863 164.736092 59.942863 # -b 164.557732 60.036736 164.104793 59.935822 163.532165 59.860724 163.266973 59.581450 163.245852 59.274015 163.133203 59.086268 162.903214 58.973620 162.283649 58.515987 161.985601 58.086516 162.173348 57.746225 162.426806 57.898769 163.022902 57.804896 163.144938 57.574906 162.724854 57.272164 162.748323 56.936567 162.802300 56.683109 163.189528 56.615051 163.266973 56.255985 163.046371 55.986099 162.825768 56.028342 162.649755 56.237210 162.968925 56.476587 162.703733 56.446079 162.239059 56.305268 162.339973 56.232517 162.051312 56.065891 161.720409 55.669276 161.675819 55.237458 162.018457 54.890127 161.931624 54.603813 161.344915 54.488818 160.605662 54.430147 160.098746 54.146180 # -b 159.997832 53.153469 160.009566 53.146428 # -b 159.997832 59.194222 160.340470 59.358501 160.927178 59.654202 161.368383 59.954597 # -b 164.369986 59.170754 164.017960 59.058106 163.785624 58.933724 163.475841 58.567617 163.764502 58.640369 164.614056 58.950152 164.369986 59.170754 164.369986 59.170754 # -b 166.479790 60.008574 166.235720 59.853683 166.080828 59.853683 166.158274 59.954597 # -b 165.088117 60.069592 165.043527 59.877151 165.010672 59.860724 # -b 165.982261 55.319598 166.202864 55.282048 166.181742 55.195215 166.280309 55.035631 166.557236 54.807988 166.611213 54.700033 166.479790 54.700033 166.116031 54.948798 165.860226 55.244499 165.871960 55.307863 165.982261 55.312557 165.982261 55.319598 # -b 167.308223 54.871352 167.427912 54.789213 167.648514 54.685952 167.880851 54.533408 167.671983 54.636669 167.350466 54.819722 167.308223 54.871352 # -b 160.098746 54.146180 159.878143 53.672119 159.910999 53.390499 159.997832 53.153469 159.997832 53.153469 # -b 160.009566 53.146428 159.490915 53.172244 158.805639 52.881236 158.519326 52.846033 158.552181 52.639512 158.486470 52.451765 158.409024 52.099740 157.857518 51.581089 157.315399 51.182127 156.829604 50.898160 156.719303 51.168046 156.599614 51.815773 156.322688 52.545639 156.146675 53.350603 155.926073 53.958433 155.804037 54.256481 155.682002 54.953491 155.604556 55.643461 155.858015 56.446079 156.289832 56.882590 156.808483 57.091458 156.984495 57.680514 157.449169 57.765000 158.078121 57.969175 158.939409 58.386911 159.624685 58.802301 159.943855 59.149633 159.997832 59.194222 # -b 154.665822 60.086020 154.379508 59.816134 154.280941 59.710526 154.224617 59.468802 154.776124 59.459415 155.163351 59.234119 154.886425 59.109736 154.501544 59.159020 154.060339 59.053412 153.419653 59.130858 153.032425 58.950152 152.534896 59.013516 151.995124 58.830463 151.354438 58.905562 151.375559 59.126164 152.072570 59.137898 152.093691 59.262281 151.607896 59.480536 151.023534 59.548595 150.746608 59.496964 150.317137 59.581450 150.173980 59.621346 # -b 156.543290 50.827755 156.367278 50.771431 156.421255 50.654089 156.543290 50.827755 # -b 156.090351 50.717454 155.869749 50.527360 155.550579 50.337267 155.294774 50.217578 155.372220 50.018097 155.881483 50.210538 156.200653 50.513279 156.090351 50.710413 156.090351 50.710413 # -b 150.173980 59.621346 149.476970 59.719914 149.035765 59.581450 148.913729 59.452374 148.913729 59.330339 148.660271 59.210650 148.373957 59.367888 147.843573 59.250546 147.390633 59.262281 146.695970 59.407784 146.374454 59.222384 146.001307 59.159020 145.879272 59.367888 145.348887 59.386663 144.454743 59.367888 143.426829 59.330339 142.865935 59.250546 141.992913 58.914949 141.220804 58.429154 140.547262 57.941012 140.181156 57.711023 # -b 139.861986 54.146180 140.314926 53.946699 140.568384 53.653345 141.274781 53.317747 141.417938 53.179284 141.197336 53.019699 140.854698 53.146428 140.303191 53.252036 140.049733 53.259076 # -b 139.939432 53.186325 140.580118 53.059595 141.152746 52.885930 141.230191 52.519823 141.408551 52.235856 141.396817 52.031682 141.185601 51.705472 140.821842 51.430892 140.767865 51.252532 140.666951 51.001421 140.502672 50.625927 140.612974 50.161254 140.702153 50.032178 # -b 142.645333 54.340967 142.952768 54.134446 143.086538 53.521922 143.384586 52.813178 143.196839 52.275752 143.316528 51.698431 143.494887 51.369874 143.682634 50.834796 144.067515 50.011057 144.067515 50.011057 # -b 142.267492 49.975854 142.213515 50.358388 142.201781 50.919282 142.157191 51.369874 141.772310 51.691391 141.706599 52.120861 141.870877 52.639512 141.903733 53.198059 142.136070 53.521922 142.577275 53.442130 142.621864 53.658038 142.678188 53.822317 142.589009 54.010064 142.389528 54.275256 142.645333 54.340967 142.645333 54.340967 # -b 140.181156 57.711023 139.894842 57.617149 139.575672 57.368385 139.078143 57.147782 138.681528 56.917792 138.460926 56.798104 138.151144 56.556380 137.897685 56.317003 137.731060 56.138643 137.289855 55.911000 136.848650 55.669276 136.440301 55.514385 135.954506 55.192869 135.522688 55.016856 135.236374 54.723502 135.755025 54.540448 136.494278 54.596772 136.782939 54.596772 136.804060 54.359742 136.804060 54.218932 136.747736 53.972514 136.893240 53.829357 137.266387 54.010064 137.388422 54.270562 137.498723 54.113324 137.665349 53.932618 137.454133 53.658038 137.576169 53.547737 138.383480 53.815276 138.437457 53.653345 138.714384 53.789461 138.758974 54.061694 138.934986 54.230666 139.519348 54.230666 139.772807 54.171995 139.861986 54.146180 139.861986 54.146180 # -b 140.049733 53.259076 139.939432 53.186325 # -b 137.355566 54.833803 137.301589 54.718808 137.632493 54.648403 138.007987 54.793907 137.984518 55.124810 137.587903 55.091955 137.355566 54.833803 # -b 109.590160 55.688051 109.688727 55.676317 109.810763 55.368881 109.655871 54.775132 109.468125 54.134446 109.038654 53.547737 108.585715 53.449170 108.872028 53.296626 108.243077 52.860114 107.459234 52.613697 106.741102 52.289834 106.046439 51.766489 104.699356 51.381608 103.826333 51.562315 104.511609 51.752408 105.208619 51.827507 105.882161 52.350851 106.698859 52.780322 107.360667 53.052555 107.581269 53.205099 107.095474 53.205099 107.858196 53.697935 108.463679 54.249441 108.916618 54.864312 109.226401 55.338372 109.503327 55.681010 109.590160 55.688051 # -b 29.938576 59.924088 30.093467 59.924088 30.215502 59.963984 # -b 31.449938 60.083673 31.130768 59.912354 30.987611 59.940516 # -b 23.578653 60.006227 23.444883 59.963984 23.346316 59.980412 # -b 23.313460 60.090713 22.926232 59.858377 23.069389 59.989800 23.069389 59.989800 # -b 19.917590 54.934717 20.281349 54.998081 20.666230 55.136545 20.952544 55.387656 21.053458 55.669276 21.041724 55.568362 20.842243 55.249193 20.656843 54.976960 21.140291 54.946451 21.241205 55.256233 21.173147 55.380615 21.130904 55.669276 21.029990 55.953243 21.029990 55.922734 20.919688 56.255985 20.964278 56.523524 21.074579 56.856775 21.360893 57.168904 21.691797 57.586640 22.287893 57.727450 22.630531 57.626537 23.027146 57.312061 23.113979 57.354304 23.313460 57.110233 23.710075 57.018706 24.008123 57.030440 24.228726 57.187678 24.306171 57.560825 24.306171 57.879995 24.416473 58.241407 24.339027 58.415073 24.008123 58.293038 23.656098 58.391605 23.444883 58.680266 23.710075 58.788220 23.423761 58.839850 23.489473 58.994741 23.400293 59.114430 23.522328 59.276362 23.742931 59.304524 24.029245 59.389010 24.249847 59.445334 24.536161 59.501658 24.780232 59.586144 25.120523 59.541554 25.442040 59.586144 25.594584 59.630734 25.770597 59.619000 25.925488 59.647162 26.509850 59.574410 26.951055 59.461762 27.744285 59.457068 27.976622 59.663589 28.143247 59.757463 28.438948 59.825521 28.781586 59.825521 29.002189 59.947557 # -b 29.255647 60.006227 29.774297 59.940516 29.938576 59.924088 # -b 22.937967 58.640369 22.299627 58.633329 21.989845 58.508947 21.834954 58.398645 21.945255 58.241407 21.956989 58.056007 22.222182 58.213245 22.386460 58.311812 22.672774 58.300078 22.937967 58.415073 23.158569 58.525374 22.937967 58.623942 22.937967 58.640369 # -b 22.299627 58.978314 22.651653 59.062800 22.409929 59.046372 22.198713 58.978314 22.055557 58.907909 22.365339 58.743630 22.740832 58.875053 22.806544 59.034638 22.496762 59.114430 22.332483 58.987701 22.299627 58.978314 # -b 27.457971 59.022903 27.094212 58.994741 27.061356 58.715468 27.326548 58.304772 27.558885 58.241407 27.767753 58.640369 27.612862 59.006476 27.457971 59.022903 # -b 11.107571 59.123817 10.964414 59.163714 10.656978 59.227078 10.588920 59.428906 10.523209 59.764503 10.556064 59.891232 10.403520 59.863070 10.391786 59.691752 10.335462 59.534514 10.182918 59.712873 10.204039 59.557982 10.347196 59.396050 10.215773 59.231772 10.138328 59.051066 10.004558 59.015863 # -b 18.626830 60.055511 18.692542 59.841949 18.471939 59.630734 17.922780 59.428906 17.580142 59.518086 17.326684 59.518086 17.073226 59.501658 16.653142 59.595531 16.312851 59.529820 16.566309 59.496964 17.117815 59.344420 17.469841 59.292790 18.328782 59.384316 18.340517 59.311564 18.131648 59.299830 17.922780 59.067493 17.568408 58.936071 17.425251 58.959539 17.117815 58.783526 16.840889 58.692000 16.068780 58.675572 16.125104 58.640369 16.542841 58.605167 16.676610 58.478438 16.289383 58.485478 16.632021 58.328240 16.599165 58.119372 16.587431 57.955094 16.366828 57.938666 16.509985 57.732144 16.488864 57.462258 16.333972 57.103192 16.068780 56.596276 15.606454 56.169152 15.022092 56.211395 14.491707 56.047117 14.118560 55.817127 14.008259 55.413471 13.179826 55.387656 12.762089 55.469795 12.839535 55.598871 12.684644 55.873451 12.398330 56.225476 12.672910 56.248944 12.541487 56.413223 12.816067 56.474241 12.475776 56.737086 12.067426 57.133701 11.858558 57.396547 11.769378 57.567866 11.825702 57.851833 11.682545 57.985602 11.339907 58.138147 11.515920 58.293038 11.494798 58.379871 11.328173 58.316506 11.283583 58.391605 11.131039 58.497212 11.074715 58.727202 11.030125 58.983007 11.107571 59.107390 # -b 13.808778 58.851585 13.963669 59.095655 13.897958 59.339726 13.567054 59.412478 13.215029 59.384316 12.982692 59.266974 13.081259 58.987701 12.783211 59.107390 12.553221 58.943111 12.508631 58.675572 12.243439 58.410380 12.553221 58.462010 12.982692 58.537109 13.477874 58.696693 13.743067 58.816382 13.787656 58.839850 # -b 16.244793 56.279453 16.465395 56.493015 16.730588 56.983504 16.918334 57.335529 16.775178 57.258083 16.500598 56.852081 16.268261 56.427304 16.244793 56.279453 # -b 18.021347 56.964729 18.295927 57.164210 18.572853 57.347263 18.727744 57.520929 18.793456 57.767347 18.880289 57.922238 18.528263 57.922238 18.065937 57.579600 17.997879 57.300327 18.042468 57.110233 18.119914 57.056256 18.021347 56.964729 # -b 14.977502 55.021550 14.768633 55.256233 14.580887 55.110729 14.911790 55.028590 14.977502 55.021550 # -b 9.861401 57.560825 10.380052 57.720410 10.326075 57.537357 10.424642 57.258083 10.204039 57.002278 10.182918 56.814532 10.150062 56.718311 10.171183 56.669028 10.072616 56.511790 10.314340 56.530565 10.699221 56.511790 10.809523 56.305268 10.523209 56.206701 10.347196 56.241904 10.215773 55.972018 10.126594 55.903960 # -b 9.995171 54.385557 10.391786 54.397291 10.776667 54.359742 10.964414 54.256481 10.666366 54.028838 10.832991 53.958433 11.217872 53.972514 11.372763 54.042919 11.802234 54.197810 12.034571 54.179036 12.365474 54.455962 12.464041 54.397291 12.442920 54.333927 12.872391 54.397291 13.158705 54.197810 13.456753 54.139140 13.653887 53.998329 13.832246 53.822317 14.196006 53.770686 14.458851 53.756605 14.217127 53.888028 14.217127 53.888028 # -b 13.510730 54.467697 13.578788 54.345661 13.367573 54.319846 13.048403 54.364436 13.060137 54.545142 13.367573 54.493512 13.158705 54.641362 13.325330 54.615547 13.534198 54.519327 13.501342 54.474737 # -b 14.217127 53.888028 14.569152 53.951393 15.022092 54.160261 15.737876 54.268216 16.345707 54.507593 17.007514 54.723502 17.744420 54.845537 18.450818 54.838496 18.716010 54.641362 18.385106 54.761051 18.582241 54.437188 18.781722 54.352702 19.377818 54.430147 19.685253 54.563917 19.840144 54.697686 19.917590 54.934717 19.917590 54.934717 # -b -0.037549 50.801940 0.699357 50.858264 1.074850 50.970912 1.516055 51.276001 1.020873 51.315897 0.699357 51.503644 0.919959 51.604558 0.865982 51.728940 1.185152 51.768836 1.340043 51.904953 1.548911 52.001173 1.814104 52.515130 1.417488 52.909398 0.800271 52.916438 0.445899 52.749813 0.138463 52.822565 0.183053 52.928173 0.403656 53.087757 0.380187 53.327135 0.105608 53.524269 0.004694 53.557124 # -b -0.061018 53.655692 0.061018 53.615795 0.269886 53.601714 0.093873 53.836398 # -b 5.010493 53.214487 4.989371 53.141735 4.923660 52.996231 5.010493 53.214487 # -b 3.534334 51.351099 3.841769 51.315897 4.261853 51.372221 4.151551 51.412117 3.942683 51.508337 4.503577 51.625679 4.855602 51.754755 4.470721 51.707818 4.217263 51.904953 4.250118 51.968317 4.348685 52.041069 4.634999 52.259325 4.879070 52.862461 5.001106 52.946947 5.001106 52.946947 # -b 4.062372 51.761796 4.151551 51.796998 4.339298 51.667922 4.062372 51.761796 4.062372 51.761796 # -b 3.832382 51.693737 4.008394 51.700778 4.041250 51.646801 3.832382 51.693737 # -b 3.665756 51.536499 3.698612 51.433239 3.665756 51.536499 3.665756 51.536499 # -b 2.806815 51.095294 3.224551 51.287735 3.534334 51.351099 3.534334 51.351099 # -b 1.239129 49.942998 1.736658 50.283289 1.724924 50.684598 2.321020 51.010808 2.717635 51.060092 2.806815 51.095294 # -b 10.004558 59.015863 9.563353 59.006476 9.223062 58.783526 8.826447 58.569964 8.098928 58.182737 7.657723 58.060701 7.270495 58.154574 6.754192 58.131106 6.686133 58.375177 6.080650 58.358749 5.540878 58.875053 5.728625 58.931377 5.914025 58.943111 5.904637 59.051066 6.167483 59.255240 6.057181 59.344420 6.235541 59.541554 5.738012 59.445334 5.594855 59.332686 5.320275 59.316258 5.231096 59.461762 5.585468 59.630734 5.871781 59.691752 6.334108 59.825521 6.125240 59.818481 5.782602 59.902967 5.949227 59.989800 # -b 5.794336 60.083673 5.407108 59.956944 5.407108 59.956944 # -b 5.439964 59.741035 5.451698 59.891232 5.296807 59.947557 5.287420 59.797359 5.397721 59.752769 # -b 5.263951 59.159020 5.254564 59.327992 5.177118 59.266974 5.177118 59.159020 5.198240 59.163714 # -b 8.659822 54.908902 8.626966 55.230418 8.418098 55.526119 8.087194 55.563669 8.131784 55.880491 8.021482 56.267719 8.152905 56.664334 8.549520 57.114927 9.321629 57.199413 9.718244 57.478686 9.861401 57.560825 # -b 10.126594 55.903960 9.905991 55.798352 9.542232 55.725600 9.575087 55.563669 9.530497 55.443980 9.563353 55.275008 9.387341 55.167053 9.521110 55.028590 9.640799 54.901861 9.476520 54.927676 9.464786 54.894820 # -b 8.659822 54.908902 8.650434 54.800947 8.913280 54.577998 8.716146 54.423107 8.749001 54.326886 8.847568 54.164955 8.835834 54.068735 9.068171 53.888028 8.737267 53.848132 8.528399 53.730790 8.582376 53.409274 8.429832 53.533656 8.152905 53.442130 7.735169 53.709669 7.183662 53.566512 7.061627 53.416314 7.347941 53.343562 7.446508 53.198059 7.082748 53.256730 # -b 9.464786 54.894820 9.377953 54.845537 9.795690 54.793907 9.884870 54.582691 9.983437 54.460656 9.995171 54.385557 # -b 5.001106 52.946947 5.221708 52.752160 5.022227 52.592575 5.099673 52.343811 5.561999 52.336770 5.848313 52.585535 5.892903 52.733385 5.573733 52.878889 5.397721 53.045514 5.684035 53.329481 6.235541 53.362337 6.608688 53.449170 6.995916 53.324788 7.082748 53.256730 7.082748 53.256730 # -b -7.082748 62.064402 -7.293964 62.099604 -7.406612 62.059708 -7.082748 62.064402 -7.082748 62.064402 # -b -6.775313 61.961141 -6.761232 62.033893 -6.995916 62.219293 -7.225905 62.223987 -7.160194 62.125420 -6.897348 62.038587 -6.873880 61.949407 -6.775313 61.961141 # -b -6.665012 62.055014 -6.599300 62.099604 -6.754192 62.219293 -6.941938 62.301432 -6.866840 62.172356 -6.721336 62.059708 -6.665012 62.055014 # -b -6.456143 62.266230 -6.564098 62.289698 -6.629809 62.202865 -6.474918 62.202865 -6.456143 62.266230 # -b -6.608688 61.756966 -6.754192 61.883696 -6.763579 61.810944 -6.688480 61.752273 -6.608688 61.756966 # -b -6.897348 61.616156 -6.939591 61.595035 -6.850412 61.407288 -6.742457 61.470653 -6.897348 61.616156 -6.897348 61.616156 # -b -1.239129 60.637526 -1.283719 60.625792 -1.471466 60.513144 -1.349430 60.344172 -1.504321 60.196321 -1.239129 60.179893 -1.274331 60.003881 # -b -1.164030 59.982759 -1.074850 60.147038 -1.074850 60.273767 -1.053729 60.377027 -1.164030 60.452126 -1.239129 60.592936 -1.239129 60.637526 # -b -19.985648 63.545255 -19.985648 63.545255 # -b -20.072481 66.058715 -19.696987 65.833419 -19.420061 65.770054 -19.434142 66.049328 -19.110278 66.058715 -18.739479 66.199525 -18.650299 66.084530 -18.331129 65.910865 -18.119914 65.662100 -18.110527 65.936680 -18.274805 66.169016 -17.800744 66.103305 -17.392395 66.058715 -17.059145 66.192485 -16.650795 66.154935 -16.453661 66.248809 -16.566309 66.483492 -16.233059 66.539816 -15.782466 66.394313 -15.660431 66.234728 -15.364730 66.213606 -15.054947 66.319214 -14.646598 66.399006 -14.965768 66.222994 -15.097190 66.039941 -14.702922 66.021166 -14.768633 65.725465 -14.327428 65.734852 -14.041115 65.579961 -13.839287 65.551799 -13.862755 65.300687 -13.552973 65.242017 -13.764188 64.995599 -13.886223 64.847748 -14.336816 64.767956 -14.458851 64.678776 -14.228861 64.678776 -14.834345 64.357260 -15.130046 64.322057 -15.364730 64.437052 -15.735530 64.183594 -16.575697 63.894933 -17.007514 63.876159 -17.237504 63.845650 -17.720952 63.641475 -18.495408 63.430260 -19.035180 63.388017 -19.640663 63.514746 -19.983301 63.545255 -19.983301 63.545255 # -b -22.189326 70.050682 -22.531964 69.975583 -22.874602 69.952115 -23.146835 69.874669 -23.095205 69.815998 -23.325194 69.844160 -23.620896 69.759674 -23.808642 69.672841 -23.724156 69.593049 -24.052713 69.607130 -24.395351 69.553153 -24.231073 69.475707 -24.174749 69.407649 -24.395351 69.402955 -24.648809 69.372446 -24.892880 69.252758 -24.991447 69.259798 -25.287149 69.205821 -25.099402 69.154191 -25.254293 69.114295 -25.399797 69.043889 -25.672029 69.027462 -25.672029 68.961750 -25.841002 68.865530 -25.972424 68.795125 -26.357305 68.743495 -26.469953 68.694211 -26.723412 68.698905 -27.009725 68.651968 -27.296039 68.595644 -27.436849 68.511158 -27.760713 68.527586 -27.901523 68.522892 -28.079882 68.478302 -28.366196 68.490036 -28.605573 68.421978 -29.046778 68.377388 -29.323705 68.316371 -29.487983 68.248312 -29.764910 68.321064 -29.929188 68.400857 -29.929188 68.400857 # -b -19.985648 63.545255 -20.337673 63.603926 -20.868058 63.808100 -21.661288 63.857384 -22.079025 63.836262 -22.689202 63.817488 -22.740832 64.068599 -22.079025 64.108495 -21.816179 64.345526 -21.947602 64.432358 -21.994539 64.568475 -22.247997 64.577862 -22.370032 64.683470 -22.576554 64.833667 -22.909805 64.824280 -23.482432 64.814893 -23.956493 64.786731 -23.679566 64.894685 -22.994291 64.981518 -22.520230 65.066004 -21.872503 65.075391 -21.994539 65.108247 -22.534311 65.162224 -22.402888 65.291300 -22.027395 65.396908 -22.046169 65.521290 -22.290240 65.516596 -22.445131 65.594042 -22.754913 65.612817 -23.238361 65.502515 -23.524675 65.472006 -23.923637 65.474353 -24.275663 65.502515 -24.397698 65.629244 -23.768746 65.575267 -23.890782 65.676181 -24.177095 65.824032 -23.580999 65.643325 -23.304073 65.739546 -23.801602 65.861581 -23.735890 65.964842 -23.857926 66.039941 -23.688954 66.107999 -23.491820 66.187791 -23.083470 65.981270 -22.698589 65.950761 -22.477987 65.847500 -22.477987 66.098611 -22.942660 66.213606 -22.567167 66.239422 -22.665734 66.323908 -23.008372 66.314520 -23.097551 66.403700 -22.952048 66.455330 -22.675121 66.443596 -22.290240 66.293399 -21.806792 66.133814 -21.529865 66.070449 -21.487622 65.936680 -21.431298 65.770054 -21.759855 65.753627 -21.473541 65.544758 -21.417217 65.457925 -21.234164 65.232629 -20.868058 65.415682 -20.638068 65.666794 -20.384610 65.589348 -20.328286 65.910865 -20.281349 66.124427 -20.074828 66.058715 # -b -29.931535 68.400857 -30.034796 68.227191 -30.133363 68.161479 -30.429064 68.231885 -30.781090 68.182601 -30.715378 68.067606 -31.067403 68.182601 -31.180052 68.121583 -31.170664 68.072300 -31.508608 68.091074 -31.677581 68.088728 -31.907570 68.210763 -31.696355 68.248312 -32.085930 68.332798 -32.184497 68.400857 -32.372244 68.400857 -32.414487 68.558095 -32.545910 68.546360 -32.780593 68.527586 -32.503667 68.360960 -32.480198 68.201376 -32.038993 68.062912 -32.226740 67.931490 -32.437955 67.861085 -32.644477 67.818842 -33.076294 67.678031 -33.231185 67.560690 -33.461175 67.426920 -33.540968 67.333047 -33.583211 67.135913 -33.836669 67.009183 -34.033803 66.901229 -34.080740 66.849599 -34.137064 66.767459 -34.287261 66.713482 -34.521945 66.650118 -34.653368 66.469411 -34.864583 66.359110 -35.103960 66.443596 -35.249464 66.262890 -35.845560 66.424821 -35.765767 66.272277 -35.756380 66.138508 -35.976983 66.054022 -36.174117 65.964842 -36.408800 65.936680 -36.563691 65.976576 -36.671646 65.828725 -37.056527 66.025860 -37.244273 65.995351 -37.244273 65.878009 -37.478957 65.887396 -37.765271 65.936680 -37.685478 66.058715 -37.478957 66.204219 -37.408552 66.307480 -37.741803 66.363804 -38.084440 66.363804 -37.929549 66.239422 -38.051585 66.124427 -38.060972 65.946067 -38.258106 65.910865 -38.492790 65.882703 -38.192395 65.798217 -38.281575 65.701996 -38.459934 65.652713 -38.699311 65.671487 -38.811959 65.589348 -39.154597 65.624551 -39.384587 65.612817 -39.614577 65.638632 -39.882116 65.521290 -39.882116 65.521290 # -b -40.088638 65.457925 -39.947828 65.333543 -39.900891 65.237323 # -b -39.879769 65.521290 -40.222407 65.502515 -40.086291 65.457925 # -b -39.900891 65.237323 -40.088638 65.084779 -40.421888 65.042536 -40.684734 65.028455 -41.125939 65.103553 -41.107164 64.939275 -40.853706 64.706938 -40.496987 64.418277 -40.511068 64.385422 -41.107164 64.361953 -41.445108 64.197675 -40.741058 64.164819 -40.773914 64.016969 -40.562698 63.758817 -41.402865 63.812794 -40.806769 63.695452 -40.853706 63.549948 -40.952273 63.425566 -41.172876 63.406792 -41.247974 63.317612 -41.590612 63.326999 -41.548369 63.214351 -41.379397 63.120478 -41.745503 63.075888 -42.106916 63.153333 -41.665711 63.000789 -41.482658 62.974974 -41.637549 62.913956 -41.801827 62.834164 -41.956718 62.820083 -42.210177 62.813042 -42.463635 62.798961 -42.618526 62.693354 -42.632607 62.641723 -42.379149 62.489179 -42.266501 62.310820 -42.125691 62.012771 -42.102222 61.803903 -42.355680 61.606769 -42.379149 61.480040 -42.672503 61.285253 -42.639647 61.189032 -42.695971 61.045875 -42.761683 60.954349 -42.827394 60.832313 -42.860250 60.703237 -42.928308 60.550693 -43.148911 60.517837 -43.644093 60.550693 -43.301455 60.435698 -43.104321 60.273767 -43.071465 60.163465 -43.181766 60.147038 -43.599503 60.142344 -44.052442 60.250298 -44.228455 60.163465 -44.801083 60.125916 -45.009951 60.114182 -45.131986 60.191627 -45.033419 60.332437 -44.911384 60.452126 -44.890262 60.567121 -45.275143 60.480288 -45.188310 60.670382 -45.441769 60.534265 -45.617781 60.583549 -45.695227 60.679769 -45.716348 60.717318 -45.340855 60.937921 -45.716348 60.794764 -46.091842 60.740787 -45.958072 60.832313 -45.662371 60.949655 -45.993275 60.966083 -45.981541 61.062303 -46.256120 61.055263 -46.619880 60.944961 -47.126796 60.954349 -47.380254 60.975470 -47.448313 60.944961 -47.535146 60.841701 -47.812072 60.841701 -47.976351 60.853435 -47.877783 60.928534 -47.591470 61.029448 -47.701771 61.071691 -48.020940 61.130361 -48.119507 61.214848 -48.396434 61.210154 -48.572447 61.343923 -48.694482 61.400247 -48.901004 61.374432 -48.295520 61.505855 -48.483267 61.580954 -49.023039 61.480040 -48.980796 61.616156 -49.013652 61.742885 -49.332821 61.918898 -48.933859 62.111339 -49.342209 62.022159 -49.576892 62.003384 -49.506487 62.116032 -49.619135 62.202865 -49.609748 62.249802 -49.750558 62.428161 -49.896062 62.475098 # -b -43.148911 60.064898 -43.202888 60.048470 -43.566647 60.097754 -43.951528 60.081326 -43.918673 60.020308 # -b -43.512670 59.971025 -43.378901 60.048470 -43.148911 60.064898 # -b -50.686945 63.000789 -50.808981 63.080581 -51.118763 63.446688 -51.452013 63.627394 -51.414464 63.923095 -51.470788 64.164819 -50.921629 64.357260 -50.180029 64.469908 -50.743269 64.617758 -50.025138 64.636533 -50.686945 64.814893 -51.217330 64.678776 -51.935461 64.275121 -52.109127 64.422971 -52.090353 64.650614 -51.935461 64.843055 -52.109127 64.906419 -52.278099 65.089472 -52.221775 65.300687 -52.376666 65.333543 -52.400135 65.497822 -52.686449 65.622204 -53.113573 65.657406 -52.925826 65.866275 -53.137041 65.896784 -53.226221 66.061062 -52.916438 66.178404 -53.489066 66.178404 -53.554778 66.342682 -53.137041 66.504614 -53.179284 66.713482 -53.015006 66.896535 -53.554778 66.978675 -53.873947 67.187543 -53.676813 67.354168 -53.456211 67.509059 -53.503147 67.673338 -53.390499 67.910368 -53.193365 68.025363 -53.071330 68.112196 -53.249689 68.154439 -52.606656 68.173214 -52.179532 68.091074 -51.559968 68.051178 -50.940403 68.095768 -51.076520 68.194335 -51.231411 68.337492 -51.193862 68.433712 -51.372221 68.325758 -52.353198 68.215457 -52.808484 68.227191 -52.892970 68.382082 -52.123208 68.586257 -51.161006 68.579216 -51.193862 68.743495 -51.175087 68.917160 -51.175087 69.013381 -50.766738 69.135416 -50.569603 69.130722 -50.710413 69.217555 -50.963872 69.449892 -50.832449 69.618864 -50.334920 69.808958 -50.433487 69.907525 # -b -50.388897 70.006092 -50.961525 69.989664 # -b -53.191018 70.177411 -52.153717 69.794877 -51.909646 69.607130 -52.562066 69.384181 -53.608755 69.283267 -54.148527 69.384181 -53.674466 69.431117 -53.618142 69.463973 -53.871600 69.595396 -54.833803 69.595396 -54.359742 69.668148 -54.800947 69.884056 -54.524021 69.970889 -54.524021 69.970889 # -b -49.928917 62.475098 -50.168295 62.653457 -50.116664 62.789574 -50.257474 62.723862 -50.379510 62.864673 -50.581338 62.996095 -50.684598 63.000789 # -b -68.806859 70.031907 -68.708292 69.930993 -68.708292 69.930993 # -b -67.450388 70.031907 -67.239173 69.710391 -68.032404 69.672841 -68.651968 69.637639 -68.464221 69.522644 -68.102809 69.492135 -67.042039 69.421730 -66.488186 69.201127 -67.149994 69.137763 -68.046485 69.271532 -68.267087 69.196434 -68.520545 69.114295 -67.746090 68.980525 -68.154439 68.877264 -67.858738 68.722373 -68.023016 68.607378 -67.999548 68.506464 -67.164075 68.438406 -66.755725 68.292902 -66.535123 68.173214 -66.225341 68.055872 -65.948414 67.882206 -64.967437 68.030057 -65.112941 67.818842 -64.624799 67.807107 -64.216450 67.645176 -63.920748 67.328353 -64.028703 67.250907 -63.592191 67.208664 -63.028951 67.264988 -63.249554 66.964594 -62.892835 66.962247 -62.179397 66.964594 -61.705336 66.809702 -61.484734 66.518695 -61.780435 66.382578 -61.935326 66.234728 -62.301432 66.262890 -62.606521 66.070449 -62.254495 65.971882 -62.399999 65.774748 -62.719169 65.570574 -63.423219 65.744239 -63.282409 65.429763 -63.446688 65.171612 -63.578110 64.899379 -63.887893 65.122328 -64.418277 65.185693 -64.606024 65.406295 -65.066004 65.507209 -65.342930 65.685568 -65.572920 65.941373 -66.169016 66.138508 -66.976328 66.319214 -67.117138 66.525735 -67.196930 66.434209 -67.337740 66.298092 -67.915062 66.452984 -68.154439 66.382578 -67.548956 66.173710 -67.361209 65.936680 -67.769558 65.896784 -67.933836 65.612817 -67.272029 65.608123 -67.164075 65.396908 -67.239173 65.260791 -66.943472 65.103553 -66.699401 64.800812 -66.488186 64.953356 -66.337989 64.805505 -65.995351 64.833667 -65.643325 64.767956 -65.352318 64.711632 -65.244363 64.554394 -65.033148 64.326751 -65.112941 64.096761 -64.591943 63.927789 -64.437052 63.704840 -64.573169 63.437300 -64.746834 63.392711 -65.000293 63.263635 -64.793771 63.014870 -64.606024 63.024257 # -b -67.661604 63.010176 -67.933836 63.193230 -68.135664 63.228432 -68.520545 63.474850 -68.661355 63.763510 -68.243619 63.592191 -67.811801 63.549948 -67.239173 63.282409 -66.722870 63.040685 -66.722870 63.040685 # -b -70.125780 60.874556 -69.752634 60.959042 -69.541419 60.970777 -69.454586 60.808845 -69.696310 60.616405 -69.708044 60.398149 -69.586008 60.250298 -69.532031 60.076632 -69.762021 60.003881 -69.982624 60.003881 # -b -65.331196 59.987453 -64.955703 60.175200 -64.911113 60.229177 -64.690510 60.316010 -64.547353 60.196321 -64.371341 60.036736 -64.371341 60.036736 # -b -68.220150 60.484982 -68.274128 60.283154 -67.832923 60.468554 -68.163826 60.555387 -68.220150 60.484982 # -b -65.077738 61.705336 -64.955703 61.684215 -64.735100 61.590341 -64.904072 61.353311 -65.232629 61.470653 -65.509556 61.641971 -65.077738 61.705336 -65.077738 61.705336 # -b -64.606024 63.024257 -64.446439 62.960893 -64.657655 62.859979 -65.009680 62.890488 -64.845401 62.688660 -64.756222 62.566625 -65.089472 62.658151 -65.108247 62.798961 -65.305381 62.843551 -65.460272 62.979668 -65.727811 62.935078 -65.915558 62.899875 -66.722870 63.040685 -66.722870 63.040685 # -b -67.534875 63.000789 -67.337740 62.843551 -66.873067 62.693354 -66.455330 62.505607 -66.079837 62.249802 -66.178404 62.038587 -66.366151 61.876655 -66.840211 62.120726 -67.412839 62.059708 -67.830576 62.207559 -68.360960 62.249802 -68.759922 62.378878 -69.046236 62.414080 -69.309082 62.646417 -69.463973 62.768452 -69.726819 62.808349 -69.914565 62.890488 -69.947421 62.930384 # -b -76.384790 68.292902 -76.164187 68.243619 -75.680739 68.206069 -75.173823 68.095768 -75.108111 67.652216 -75.732370 67.274376 -76.638248 67.206318 -77.234344 67.417533 -77.309443 67.835269 -76.948030 68.133317 -76.384790 68.292902 -76.384790 68.292902 # -b -74.807717 67.992507 -74.366512 68.145052 -73.925307 67.985467 -73.761028 67.727315 -74.765474 67.872819 -74.807717 67.992507 # -b -78.579081 69.208168 -78.687035 69.107254 -79.039060 68.905426 -79.447410 68.954710 -79.039060 69.114295 -78.654179 69.231636 -78.358478 69.241024 -78.442964 69.360712 -78.710503 69.325510 -78.579081 69.208168 -78.579081 69.208168 # -b -80.066974 69.722125 -79.724336 69.783143 -79.480265 69.637639 -79.888615 69.576621 # -b -78.501635 63.397404 -78.435924 63.446688 -77.919620 63.420873 -77.567595 63.214351 -78.116754 63.200270 -78.501635 63.397404 # -b -77.454947 63.695452 -76.816607 63.568723 -76.703959 63.406792 -77.342299 63.554642 -77.454947 63.695452 # -b -71.278077 63.000789 -71.498679 63.125171 -71.874173 63.331693 -71.874173 63.437300 -71.555003 63.613313 -71.939884 63.845650 -72.207423 63.700146 -72.395170 63.857384 -72.700259 63.894933 -72.977185 63.958298 -73.033509 64.127270 -73.286967 64.326751 -73.484102 64.488683 -73.662461 64.627146 -73.972243 64.683470 -74.310188 64.631839 -74.634051 64.697551 -74.765474 64.819586 -74.718537 64.645920 -74.718537 64.493376 -74.962608 64.441746 -75.380344 64.526232 -75.732370 64.596637 -75.901342 64.394809 -76.295610 64.289202 -76.760283 64.207062 -77.379848 64.279814 -77.994719 64.488683 -78.149610 64.904072 -77.431478 65.166918 -77.431478 65.434457 -76.868238 65.366399 -76.009296 65.319462 -75.394425 65.246710 -75.061175 65.382827 -74.455691 65.453232 -73.991018 65.474353 -73.638993 65.629244 -74.202233 65.910865 -74.333656 66.222994 -73.648380 66.509308 -73.240031 66.678280 -73.019428 66.753378 -72.855150 67.042039 -72.371702 67.264988 -72.578223 67.539568 -72.888005 67.856391 -73.197788 68.222497 -73.704704 68.276474 -73.948775 68.551054 -74.300800 68.642581 -74.530790 68.614419 -74.831185 68.903079 -74.343043 68.996953 -75.380344 68.893692 -76.309691 68.694211 -76.736815 69.032155 -75.732370 69.114295 -76.506825 69.475707 -77.159245 69.625905 -76.990273 69.808958 -77.464334 69.785489 -77.708405 69.942727 -77.708405 69.942727 # -b -78.886516 70.111699 -79.327721 69.869975 -79.923817 69.900484 -79.923817 69.900484 # -b -77.745954 59.982759 -77.534739 60.076632 -77.645040 60.245605 -77.811666 60.409883 -77.832787 60.604670 -77.501883 60.717318 -77.790544 60.771296 -78.196546 60.825273 -77.921967 61.231275 -77.795238 61.407288 -77.724833 61.559832 -77.640347 61.738192 -77.818706 61.695949 -77.987678 61.897777 -78.039309 62.214599 -77.929007 62.310820 -77.823400 62.479792 -77.680243 62.519688 -77.436172 62.526728 -77.217916 62.489179 -77.034863 62.423468 -76.851810 62.348369 -76.748549 62.240414 -76.560802 62.289698 -76.471623 62.172356 -76.295610 62.177050 -76.159494 62.310820 -75.887261 62.423468 -76.049192 62.348369 -75.772266 62.449283 -75.464830 62.219293 -75.244228 62.158275 -75.237187 61.986956 -75.286471 61.841452 -75.192598 61.949407 -75.056481 61.857880 -74.967301 61.663093 -74.939139 61.573913 -74.763127 61.641971 -74.795982 61.505855 -74.852306 61.369739 -74.551912 61.243010 -74.432223 61.172604 -74.012139 61.071691 -73.803271 61.062303 -73.516957 61.020060 -73.195441 61.013020 -73.085140 60.874556 -73.085140 60.874556 # -b -69.982624 60.003881 -70.304140 60.025002 -70.975335 60.097754 -71.163082 60.048470 -70.909623 60.032043 # -b -80.083402 61.670134 -79.764232 61.649012 -79.585873 61.914204 -79.388739 62.280311 -79.862799 62.362450 # -b -69.949768 62.930384 -70.226694 62.789574 -70.405054 62.813042 -70.658512 62.899875 -71.278077 63.000789 -71.278077 63.000789 # -b -71.031659 62.784880 -70.674940 62.742637 -70.402707 62.646417 -70.829831 62.611214 -71.031659 62.784880 -71.031659 62.784880 # -b -74.052036 62.693354 -74.009793 62.676926 -74.418142 62.637030 -74.671600 62.728556 -74.150603 62.733250 -74.052036 62.693354 # -b -90.015208 68.635540 -89.850930 68.694211 -89.860317 69.036849 -89.287689 69.283267 -88.959132 69.149497 -88.231614 68.870224 -88.029786 68.541667 -88.043867 68.248312 -88.264469 68.410244 -88.386505 68.133317 -88.250388 67.811801 -87.888976 67.539568 -87.480626 67.295497 -87.147376 67.323659 -86.851674 67.408145 -86.631072 67.405799 -86.541892 67.741396 -86.157011 67.971386 -85.945796 68.194335 -85.936409 68.292902 -85.772130 68.602684 -85.471735 68.708292 -85.265214 68.759922 -84.734829 68.762269 -85.063386 68.811553 -85.119710 68.928895 -84.889720 68.996953 -84.856865 69.043889 -85.241746 69.126029 -85.452961 69.348978 -85.485816 69.485094 -85.485816 69.668148 -85.349700 69.801917 -84.777072 69.827732 -84.091796 69.754981 -83.584880 69.654067 -83.012252 69.644679 -82.585128 69.642332 -82.552272 69.480401 -82.383300 69.353672 -82.275346 69.208168 -81.580683 69.177659 -81.449260 69.050930 -81.843528 68.926548 -81.566602 68.830327 -81.294369 68.630847 -81.735574 68.515852 -81.899852 68.389122 -82.209635 68.511158 -82.561660 68.473609 -82.317589 68.316371 -82.284733 68.260047 -82.120455 68.189642 -82.120455 67.987814 -81.637007 67.635788 -81.294369 67.429267 -81.392936 67.286110 -81.425792 67.103057 -81.801285 67.016224 -82.111067 66.819090 -82.463093 66.671239 -82.970009 66.556244 -83.232855 66.387272 -83.500394 66.478799 -83.885275 66.619609 -84.115265 66.666546 -84.129346 66.579713 -83.753852 66.222994 -83.993229 66.232381 -84.392191 66.368497 -84.514227 66.253503 -84.800541 66.262890 -85.161953 66.272277 -85.349700 66.579713 -85.790905 66.499920 -85.992733 66.504614 -86.499649 66.575019 -86.687396 66.504614 -86.687396 66.373191 -86.100687 66.279318 -86.044363 66.075143 -86.100687 66.009432 -86.368226 65.856887 -86.673315 65.666794 -86.926773 65.570574 -87.128601 65.392214 -87.757553 65.371093 -88.151821 65.483741 -88.705674 65.685568 -88.968520 65.753627 -89.334626 65.847500 -89.785218 65.873315 -89.785218 65.873315 # -b -90.179487 65.819338 -89.353401 65.472006 -88.846484 65.342930 -88.095497 65.251404 -87.480626 65.272525 -87.006566 65.209161 -87.048809 65.051923 -87.316348 64.744488 -87.579193 64.563781 -87.823264 64.516845 -87.907750 64.345526 -88.151821 64.188288 -88.494459 64.049824 -89.043618 64.049824 -89.433193 64.082680 -89.498904 64.035743 -89.686651 64.108495 -89.850930 64.101455 -89.860317 64.031050 -89.818074 63.944217 -89.907254 63.944217 # -b -90.069185 63.890240 -89.970618 63.831569 # -b -86.652193 68.260047 -86.548933 68.107502 -86.595869 67.760171 -86.980750 67.964345 -86.957282 68.227191 -86.661581 68.260047 -86.652193 68.260047 # -b -85.814373 65.788829 -85.668870 65.882703 -85.307457 65.819338 -85.152566 65.535371 -84.889720 65.260791 -84.514227 65.453232 -84.148120 65.305381 -83.805482 65.148143 -83.453457 65.136409 -83.190612 64.925194 -82.571047 64.749181 -82.021888 64.664695 -81.834141 64.498070 -81.744961 64.251652 -81.599457 64.045131 -81.228657 64.035743 -80.829696 64.108495 -80.609093 63.948910 -80.566850 63.871465 -80.210131 63.777591 -80.674804 63.627394 -80.984587 63.500665 -81.402323 63.528827 -81.524359 63.603926 -81.890465 63.681371 -82.219022 63.686065 -82.397381 63.845650 -82.636759 63.972379 -82.955928 64.000541 -83.134288 64.000541 -82.970009 64.178900 -83.542637 64.101455 -83.650591 63.939523 -83.650591 63.768204 -83.852419 63.709533 -84.026085 63.636781 -84.415660 63.505359 -84.547082 63.420873 -84.941351 63.233126 -85.330925 63.183842 -85.659482 63.474850 -85.706419 63.812794 -85.814373 63.758817 -86.091300 63.667290 -86.377614 63.671984 -86.565361 63.681371 -86.926773 63.573417 -87.227168 63.690759 -87.015953 63.904321 -86.476181 64.077986 -86.368226 64.312670 -86.419857 64.563781 -86.279047 64.819586 -86.189867 65.051923 -86.166399 65.448538 -85.912940 65.744239 -85.814373 65.788829 # -b -83.894662 65.964842 -83.739771 65.922599 -83.552024 65.711384 -83.552024 65.624551 -84.091796 65.798217 -84.467290 66.070449 -84.148120 66.079837 -83.894662 65.964842 # -b -80.254721 69.785489 -80.066974 69.722125 -80.066974 69.722125 # -b -79.890961 69.576621 -80.069321 69.463973 -80.477670 69.703350 -80.257068 69.785489 -80.257068 69.785489 # -b -79.923817 69.900484 -80.036465 69.970889 -80.167888 69.968543 # -b -80.275842 70.001398 -80.519913 69.968543 # -b -81.777817 70.027213 -80.961118 69.740900 -81.646394 69.938034 -82.153311 69.839467 -82.219022 69.806611 -82.857361 69.919259 -83.598961 69.921606 -83.918131 69.930993 -84.856865 69.980277 # -b -85.626627 70.027213 -85.363781 69.970889 -85.584383 69.970889 # -b -82.540538 62.930384 -83.103779 62.813042 -83.563758 62.475098 -83.850072 62.116032 -83.446417 62.184090 -82.948888 62.296738 -82.737672 62.505607 -82.287080 62.637030 -82.043009 62.843551 -82.343404 62.960893 -82.540538 62.930384 # -b -80.050546 62.357756 -80.139726 62.331941 -80.294617 62.177050 -80.360328 61.785128 -80.083402 61.670134 # -b -79.862799 62.362450 -80.050546 62.357756 # -b -96.936025 69.534378 -97.100303 69.644679 -97.306825 69.729165 -97.607220 69.851201 -97.959245 69.813651 -98.311270 69.600089 -98.301883 69.557846 -98.531873 69.487441 -98.456774 69.302041 -98.766556 69.184700 -99.174906 69.130722 -99.512850 69.003993 -99.339184 68.835021 -99.052870 68.898386 -98.700845 68.806859 -98.409837 68.778697 -98.203316 68.715333 -97.818435 68.675436 -97.330293 68.555748 -97.067448 68.574522 -96.734197 68.499424 -96.292992 68.482996 -95.973823 68.626153 -95.565473 68.731760 -95.255691 68.762269 -95.499762 68.795125 -95.818931 68.973484 -96.030147 69.182353 -96.339929 69.309082 -96.748278 69.461626 -96.936025 69.534378 # -b -100.026807 67.861085 -99.355612 67.785986 -99.078685 67.785986 -98.684417 67.785986 -98.576463 67.870472 -98.768903 68.039444 -98.520139 68.069953 -98.323005 67.870472 -97.933430 67.701500 -97.346721 67.638135 -97.205911 67.954958 -97.454676 67.903328 -97.933430 67.985467 -97.961592 67.839963 -98.210356 67.997201 -98.323005 68.112196 -98.520139 68.267087 -98.712579 68.412591 -98.379329 68.382082 -98.182194 68.412591 -97.736296 68.391469 -98.041384 68.546360 -97.651810 68.494730 -97.539162 68.515852 -97.036939 68.382082 -97.008777 68.309330 -96.562878 68.330452 -96.675526 68.133317 -96.562878 68.081687 -96.060655 68.267087 -96.032493 68.112196 -96.201466 67.776599 -96.422068 67.584158 -96.060655 67.358862 -95.779035 67.412839 -95.530271 67.358862 -95.361299 67.241520 -95.361299 67.478550 -95.666387 67.743743 -95.530271 67.997201 -95.530271 68.100462 -95.333137 68.069953 -94.943562 68.100462 -94.826220 68.051178 -94.539906 68.194335 -94.295835 68.248312 -93.953198 68.482996 -93.774838 68.630847 -93.765451 68.865530 -94.051765 69.013381 -94.131557 68.846755 -93.995441 68.863183 -94.507051 68.715333 -94.680716 68.799819 -94.657248 68.940629 -94.370934 69.013381 -94.403790 69.126029 -94.230124 69.341938 -93.821775 69.414689 -93.896874 69.172965 -93.676271 69.426424 -94.051765 69.463973 -94.507051 69.492135 -94.769896 69.588355 -95.018661 69.630598 -95.206408 69.672841 -95.337830 69.759674 -95.821278 69.745593 -96.074737 69.895791 -96.393906 69.952115 # -b -92.155522 70.050682 -92.089810 69.912218 -92.385512 69.834773 -92.596727 69.778449 -92.728150 69.668148 -92.277557 69.625905 -91.845740 69.510910 -91.517183 69.611824 -91.460859 69.522644 -91.230869 69.473360 -90.986798 69.452239 -90.874150 69.440505 -90.996185 69.297348 -91.418616 69.348978 -90.808438 69.107254 -90.634773 68.914814 -90.545593 68.583910 -90.414170 68.365654 -90.217036 68.349226 -90.015208 68.572176 -90.015208 68.635540 # -b -89.782872 65.873315 -90.078573 65.910865 -90.177140 65.819338 # -b -89.904907 63.944217 -90.069185 63.890240 -90.069185 63.890240 # -b -89.970618 63.831569 -90.191221 63.618007 -90.454066 63.549948 -90.740380 63.559336 -91.040775 63.641475 -91.402188 63.754123 -91.669727 63.768204 -91.932573 63.798713 -92.120319 63.763510 -92.570912 63.840956 -92.969874 63.948910 -93.519033 64.026356 -93.575357 63.885546 -93.312512 63.904321 -92.857226 63.852690 -92.584993 63.716574 -92.120319 63.730655 -92.232967 63.641475 -92.120319 63.641475 -91.622790 63.681371 -91.359945 63.533521 -90.909352 63.486584 -90.829560 63.366895 -90.674669 63.219045 -90.618345 63.089969 -90.632426 63.019564 -90.763849 62.895181 -91.186279 62.890488 -91.636871 62.794268 -92.232967 62.789574 -92.340922 62.632336 -91.998284 62.587746 -92.608461 62.571318 -92.683560 62.310820 -92.707028 62.132460 -93.002729 62.137154 -93.223332 61.956447 -93.378223 61.918898 -93.378223 61.789822 -93.706780 61.569220 -94.260633 61.416675 -94.401443 61.301680 -94.248899 61.066997 -94.523478 60.853435 -94.511744 60.625792 -94.755815 60.480288 -94.722959 60.240911 -94.732347 60.093060 # -b -100.862280 70.013132 -100.904523 69.776102 -101.270629 69.691616 -101.434908 69.858241 -101.556943 69.808958 -101.646123 69.661107 -101.866726 69.703350 -102.040391 69.930993 -102.218751 69.895791 -102.406498 69.806611 -102.627100 69.715084 -102.528533 69.557846 -102.772604 69.576621 -103.091774 69.583662 -103.058918 69.463973 -103.058918 69.353672 -102.969738 69.344284 -102.561389 69.510910 -102.143652 69.515603 -101.932437 69.461626 -102.129571 69.332550 -102.242219 69.271532 -102.021617 69.273879 -101.589799 69.219902 -101.688366 69.090826 -101.866726 69.013381 -102.162427 68.961750 -102.650569 68.877264 -102.889946 68.823287 -103.256052 68.802165 -103.673789 68.813900 -104.058670 68.905426 -104.490487 68.950016 -105.030259 68.921854 -105.110052 69.050930 -105.142907 69.126029 -105.537176 69.130722 -105.823490 69.201127 -106.198983 69.201127 -106.321019 69.320816 -106.640188 69.517950 -107.048538 69.377140 -106.959358 69.212862 -107.414644 69.003993 -107.907479 68.966444 -108.583368 68.966444 -108.738259 68.818593 -109.564345 68.647274 -109.916370 68.626153 # -b -110.029018 67.997201 -109.977388 67.976080 # -b -110.029018 67.924449 -109.808416 67.870472 -109.808416 67.785986 -109.498633 67.785986 -108.996411 67.785986 -108.996411 67.680378 -108.996411 67.499672 -108.855601 67.455082 -108.663160 67.659257 -108.634998 67.520793 -108.409702 67.478550 -108.020127 67.295497 -108.048289 67.100710 -108.437864 67.100710 -107.991965 66.814396 -107.738507 66.936432 -107.264446 66.957553 -107.292608 67.142953 -107.574229 67.250907 -107.710345 67.466816 -107.794831 67.668644 -107.991965 67.903328 -107.710345 67.964345 -107.738507 68.091074 -107.236284 68.173214 -106.846710 68.236578 -106.508765 68.360960 -106.260001 68.412591 -105.950219 68.555748 -105.922057 68.687171 -106.372649 68.656662 -106.677738 68.525239 -106.677738 68.464221 -106.734062 68.309330 -106.846710 68.370348 -107.067312 68.412591 -107.264446 68.318717 -107.574229 68.370348 -107.879317 68.370348 -107.794831 68.267087 -107.907479 68.206069 -108.020127 68.206069 -108.353378 68.227191 -108.634998 68.257700 -108.883763 68.309330 -108.663160 68.525239 -108.104613 68.668396 -107.597697 68.720026 -106.982826 68.860836 -106.424279 68.931241 -106.034705 68.921854 -105.645130 68.769310 -105.701454 68.720026 -105.391672 68.565135 -105.673292 68.504117 -105.391672 68.412591 -105.086583 68.288209 -104.748639 68.257700 -104.748639 68.121583 -104.190092 68.039444 -103.856842 68.048831 -103.687870 68.091074 -103.326457 68.154439 -102.904027 67.903328 -102.345480 67.701500 -102.068553 67.764864 -101.871419 67.743743 -101.369197 67.755477 -100.838812 67.743743 -100.195779 67.870472 -100.026807 67.861085 # -b -110.024325 62.890488 -109.550264 62.838857 -109.221707 62.789574 -109.141915 62.658151 -109.451697 62.545503 -109.606588 62.658151 -109.916370 62.728556 # -b -110.146360 62.552544 -109.883514 62.461017 -109.883514 62.461017 # -b -120.017148 69.356019 -119.599412 69.306735 -119.026784 69.252758 -118.618435 69.165925 -118.120906 69.067358 -117.660926 68.957057 -117.182172 68.921854 -117.017893 68.931241 -117.017893 68.931241 # -b -119.963171 66.990409 -119.963171 66.990409 # -b -120.061738 65.117634 -119.859911 65.281913 -119.456255 65.295994 -119.873992 65.434457 -119.827055 65.570574 -119.695632 65.690262 -119.212184 65.730158 -118.803835 65.666794 -118.583232 65.570574 -118.315693 65.589348 -117.987136 65.643325 -117.977749 65.701996 -118.217126 65.671487 -118.437728 65.697303 -118.062235 65.847500 -117.996523 65.931986 -117.879182 65.990657 -117.799389 66.079837 -117.611642 66.199525 -117.775921 66.244115 -117.635111 66.314520 -117.456751 66.452984 -117.536544 66.424821 -117.733678 66.452984 -117.578787 66.556244 -117.578787 66.619609 -117.912037 66.591447 -118.249982 66.424821 -118.461197 66.312173 -118.794447 66.288705 -119.268508 66.298092 -119.676857 66.272277 -119.742569 66.319214 -119.996027 66.354416 # -b -120.073473 66.596140 -119.688592 66.652464 -119.303711 66.767459 -119.158207 66.809702 -119.181675 66.866026 -119.378809 66.891842 -119.599412 66.948166 -119.712060 66.905923 -119.951437 66.957553 -119.965518 66.990409 # -b -114.889314 69.285614 -115.030124 69.248064 -115.241339 69.255105 -115.724787 69.285614 -116.212929 69.365406 -116.574341 69.529684 -116.916979 69.644679 -117.236149 69.825386 -117.367572 69.952115 # -b -109.916370 68.626153 -110.291864 68.612072 -110.700213 68.602684 -111.052238 68.602684 -111.371408 68.572176 -111.493443 68.539320 -112.023828 68.522892 -112.784203 68.515852 -113.225408 68.515852 -113.370911 68.642581 -113.676000 68.893692 -113.610289 69.088479 -113.854359 69.189393 -114.182916 69.283267 -114.769625 69.290307 -114.891661 69.285614 # -b -117.015546 68.931241 -116.231703 68.900733 -116.147217 68.931241 -116.062731 69.001646 -115.757643 69.001646 -115.255420 68.961750 -115.058286 68.820940 -114.804828 68.769310 -114.471577 68.668396 -114.218119 68.412591 -114.138326 68.339839 -114.274443 68.257700 -114.471577 68.309330 -114.832990 68.257700 -115.339906 68.206069 -115.339906 68.100462 -115.504185 67.933836 -115.391536 67.903328 -114.668711 67.839963 -114.302605 67.776599 -113.631410 67.764864 -113.072863 67.743743 -112.350038 67.785986 -112.068418 67.734355 -111.843122 67.818842 -111.566195 67.785986 -111.148459 67.912715 -110.979486 67.785986 -110.420940 67.997201 -110.026671 67.997201 -110.026671 67.997201 # -b -109.975041 67.976080 -110.026671 67.924449 # -b -115.788152 62.996095 -115.745909 62.974974 -115.755296 62.838857 -115.501838 62.688660 -115.116957 62.566625 -114.783706 62.414080 -114.422294 62.496219 -114.342501 62.693354 -114.441068 62.820083 -114.211078 62.667538 -114.178223 62.545503 -114.164142 62.418774 -113.910683 62.214599 -113.624370 62.167663 -113.502334 62.357756 -113.427235 62.209906 -113.305200 62.050321 -112.831139 62.076136 -112.277286 62.202865 -111.883018 62.439895 -111.704658 62.658151 -111.263453 62.789574 -110.831636 62.864673 -110.399818 62.916303 -110.024325 62.890488 -110.024325 62.890488 # -b -109.914023 62.728556 -110.397471 62.740290 -110.467876 62.714475 -110.078302 62.672232 -110.388084 62.637030 -110.144013 62.552544 -110.144013 62.552544 # -b -109.881168 62.461017 -110.420940 62.430508 -110.843370 62.444589 -111.031117 62.439895 -110.974793 62.310820 -111.439466 62.188784 -111.744555 62.106645 -111.777410 61.956447 -112.002707 61.778088 -112.307795 61.632584 -112.838180 61.501161 -113.260610 61.480040 -113.556311 61.318108 -113.765180 61.163217 -114.030372 60.975470 -114.516167 61.029448 -115.058286 60.900372 -115.487757 60.832313 -115.919574 60.841701 -116.337311 60.841701 -116.614238 61.008326 -116.924020 61.078731 -117.222068 61.151483 -117.463792 61.200766 -117.684394 61.280559 -117.937853 61.400247 -118.102131 61.395554 -118.111518 61.285253 -118.289878 61.280559 -118.609047 61.289946 -118.627822 61.395554 -118.397832 61.555139 -118.022339 61.555139 -117.590521 61.433103 -117.304207 61.332189 -116.905245 61.280559 -116.630665 61.416675 -116.264559 61.289946 -115.821007 61.205460 -115.710706 61.365045 -115.644995 61.437797 -115.292969 61.480040 -115.316438 61.590341 -115.194402 61.752273 -115.161547 61.853187 -114.861152 61.815637 -114.598306 61.857880 -114.795440 61.925939 -114.598306 61.970528 -114.556063 62.064402 -115.081754 62.101951 -114.917476 62.228680 -115.128691 62.228680 -115.358681 62.444589 -115.757643 62.514994 -115.954777 62.698047 -116.119055 62.881100 -116.428838 62.991402 -116.053344 62.956199 -115.799886 62.996095 -115.799886 62.996095 # -b -113.061129 61.841452 -112.929706 61.879002 -112.497889 61.918898 -112.169332 61.991650 -112.277286 61.862574 -112.389934 61.773394 -112.610537 61.747579 -112.831139 61.794516 -113.061129 61.841452 -113.061129 61.841452 # -b -116.440572 61.221888 -116.363126 61.163217 -116.163645 61.034141 -116.351392 61.045875 -116.616584 61.142096 -116.449959 61.221888 -116.440572 61.221888 # -b -111.261107 62.662845 -111.106216 62.658151 -110.805821 62.693354 -110.665011 62.613561 -111.031117 62.561931 -111.303350 62.571318 -111.556808 62.475098 -111.580276 62.566625 -111.261107 62.662845 -111.261107 62.662845 # -b -129.613357 70.020173 -129.998238 69.895791 -129.998238 69.895791 # -b -130.164864 69.703350 -129.592236 69.827732 -129.085319 69.914565 -128.986752 69.846507 -129.207355 69.703350 -128.766150 69.797224 -128.423512 69.949768 # -b -127.163261 70.036601 -126.876948 69.783143 -126.501454 69.583662 -126.388806 69.487441 -126.060249 69.391221 -125.473540 69.360712 -125.234163 69.402955 -125.553333 69.445198 -125.497009 69.499176 -125.299874 69.534378 -125.389054 69.668148 -125.285793 69.764368 -125.079272 69.862935 -124.858669 69.989664 # -b -124.914993 70.001398 -125.187226 69.942727 -125.187226 69.942727 # -b -124.760102 70.027213 -124.703778 69.961502 # -b -124.429199 70.001398 -124.462054 69.869975 -124.494910 69.717431 -124.166353 69.722125 -124.142885 69.644679 -124.443280 69.445198 -124.560621 69.402955 -124.307163 69.344284 -124.110029 69.348978 -123.734535 69.377140 -123.438834 69.461626 -123.237006 69.588355 -123.119665 69.801917 -122.697234 69.839467 -122.213786 69.806611 -122.026039 69.806611 -121.650546 69.778449 -121.242196 69.710391 -120.833847 69.607130 -120.481822 69.433464 -120.153265 69.367753 -120.017148 69.356019 # -b -119.963171 66.990409 -120.183774 66.943472 -120.371521 66.835518 -120.624979 66.809702 -120.920680 66.762766 -121.131895 66.697054 -121.305561 66.605528 -121.605956 66.584406 -121.812477 66.535123 -122.080017 66.490533 -122.408573 66.499920 -122.676113 66.478799 -122.882634 66.460024 -123.093849 66.429515 -123.192416 66.483492 -123.558523 66.382578 -123.985647 66.253503 -124.253186 66.323908 -124.417464 66.284011 -124.623986 66.248809 -124.900912 66.244115 -125.121515 66.187791 -125.121515 66.025860 -124.947849 65.901477 -124.844588 65.976576 -124.638067 65.990657 -124.459707 66.124427 -124.220330 66.124427 -124.009115 66.054022 -123.675864 66.079837 -123.290983 66.115039 -123.183029 66.014125 -123.051606 66.115039 -122.971814 66.183097 -122.586933 66.164323 -122.202052 66.178404 -121.845333 66.143201 -121.671667 66.044634 -121.418209 66.016472 -121.338417 65.892090 -121.760847 65.861581 -122.220827 65.927292 -122.464898 65.950761 -122.563465 65.878009 -122.333475 65.819338 -122.211439 65.697303 -122.422654 65.530677 -122.774680 65.483741 -122.793454 65.371093 -122.849778 65.227936 -123.117318 65.157531 -123.436487 65.143450 -123.389551 65.089472 -123.150173 65.000293 -122.774680 64.929888 -122.319394 64.939275 -121.892270 64.948662 -121.615343 65.162224 -121.460452 65.319462 -120.953536 65.502515 -120.521718 65.535371 -120.423151 65.347624 -120.676609 65.141103 -120.977004 65.042536 -121.253931 64.906419 -121.493308 64.810199 -121.174138 64.758569 -120.812726 64.880604 -120.258873 65.080085 -120.061738 65.117634 # -b -119.996027 66.354416 -120.357440 66.359110 -120.249485 66.424821 -120.216629 66.530429 -120.071126 66.596140 # -b -140.033305 69.656413 -139.690667 69.595396 -139.225994 69.534378 -138.751933 69.306735 -138.432764 69.219902 -138.122982 69.130722 -137.639533 68.992259 -137.278121 68.945322 -136.888546 68.886652 -136.724268 68.886652 -136.536521 68.905426 -136.207964 68.893692 -135.785534 68.802165 -135.292698 68.668396 -135.226987 68.710639 -135.442896 68.830327 -135.433508 68.914814 -134.992303 68.886652 -134.663747 68.748188 -134.288253 68.600338 -134.189686 68.722373 -134.410288 68.846755 -134.649666 69.027462 -134.461919 69.114295 -134.020714 69.264492 -133.734400 69.365406 -133.175853 69.419383 -133.006881 69.611824 -132.744035 69.632945 -132.476496 69.733859 -132.204263 69.703350 -132.035291 69.776102 -131.748977 69.834773 -131.486132 69.949768 -131.021458 69.970889 -131.021458 69.970889 # -b -129.998238 69.895791 -130.406588 69.806611 -130.913504 69.618864 -131.307772 69.600089 -131.927337 69.522644 -132.058760 69.409996 -132.401397 69.271532 -132.645468 69.161231 -132.974025 69.111948 -132.678324 69.118988 -132.312218 69.170619 -131.838157 69.330203 -131.828770 69.402955 -131.608167 69.332550 -131.443889 69.344284 -131.288998 69.456932 -131.021458 69.438158 -131.087170 69.201127 -130.749226 69.440505 -130.406588 69.686922 -130.162517 69.703350 # -b -135.060362 69.384181 -134.952407 69.365406 -135.027506 69.461626 -134.731805 69.452239 -134.497121 69.515603 -134.576914 69.546112 -134.553445 69.679882 -134.487734 69.733859 -134.314068 69.644679 -134.159177 69.529684 -133.882250 69.560193 -134.079385 69.379487 -134.454878 69.154191 -134.830372 69.050930 -134.952407 69.025115 -134.872615 69.090826 -134.750579 69.182353 -135.126073 69.201127 -135.327901 69.391221 -135.248108 69.461626 -135.074443 69.384181 -135.060362 69.384181 # -b -135.954506 69.266839 -135.996749 69.231636 -135.987362 69.147150 -135.785534 69.060317 -135.579012 69.036849 -135.325554 68.966444 -135.123726 68.914814 -135.058015 68.985219 -135.245762 69.043889 -135.400653 69.090826 -135.400653 69.147150 -135.597787 69.172965 -135.733903 69.266839 -135.884101 69.285614 -135.954506 69.266839 # -b -139.434862 59.954597 -139.711789 60.057858 -139.711789 60.057858 # -b -145.327765 70.008439 -144.952272 69.982624 -144.952272 69.982624 # -b -144.919416 70.024867 -144.797381 69.982624 -144.609634 69.982624 # -b -142.560847 70.006092 -142.307389 69.914565 -141.974138 69.820692 -141.579870 69.766715 -141.392123 69.656413 -141.227844 69.698656 -141.162133 69.745593 -141.007242 69.722125 -141.007242 69.722125 # -b -141.004895 69.722125 -140.826536 69.672841 -140.197584 69.649373 -140.033305 69.656413 # -b -141.401510 59.992146 -141.511811 60.032043 -141.643234 60.008574 # -b -142.084439 59.987453 -142.492789 60.036736 -142.835426 60.109488 -143.088885 60.114182 -143.466725 60.041430 -143.872728 60.025002 -144.137920 60.015615 -144.194244 60.097754 -144.492292 60.196321 -144.658917 60.196321 -144.912376 60.299582 -145.022677 60.459167 -145.100122 60.492022 # -b -147.815411 60.015615 -147.681641 60.086020 -147.395327 60.233870 -147.263904 60.393455 -147.207580 60.311316 -147.219314 60.208055 -147.484507 60.003881 -147.484507 60.003881 # -b -147.836532 59.975719 -147.827145 60.003881 -147.815411 60.015615 # -b -146.810965 60.386415 -146.822699 60.447432 -146.611484 60.484982 -146.379147 60.442739 -146.280580 60.386415 -146.667808 60.306622 -146.778109 60.360600 -146.810965 60.386415 # -b -145.154100 60.492022 -145.255013 60.414577 -145.431026 60.339478 -145.729074 60.475594 -145.916821 60.534265 -145.860497 60.604670 -145.926208 60.670382 -146.113955 60.703237 -146.346292 60.707931 -146.423737 60.783030 -146.832087 60.729053 -146.501183 60.808845 -146.480061 60.890984 -146.787497 60.933227 -146.733520 61.078731 -146.656074 61.142096 -147.162990 60.982511 -147.461038 60.982511 -147.716844 61.050569 -147.827145 60.937921 -148.146314 60.937921 -147.913978 61.268825 -148.268350 61.062303 -148.322327 61.130361 -148.432628 61.003632 -148.697821 60.862822 -148.697821 60.729053 -148.399773 60.740787 -148.554664 60.588243 -148.510074 60.517837 -148.146314 60.538959 -148.277737 60.442739 -148.510074 60.266726 -148.355183 60.250298 -148.488952 60.142344 -148.643843 60.020308 -148.742410 60.015615 # -b -149.195350 59.975719 -149.293917 60.008574 -149.394831 60.008574 # -b -149.472276 59.987453 -149.537988 60.102448 -149.547375 60.015615 # -b -150.044904 60.937921 -149.481664 60.916799 -149.195350 60.923840 -149.714000 61.024754 -149.979193 61.045875 # -b -150.033170 61.226582 -149.702266 61.407288 -149.641248 61.517589 -149.779712 61.449531 # -b -160.072930 66.455330 -159.523771 66.509308 -159.875796 66.556244 -159.875796 66.556244 # -b -160.105786 66.575019 -159.678662 66.640730 -159.875796 66.692361 -159.875796 66.692361 # -b -151.800337 59.947557 -151.535144 60.201015 -151.424843 60.571815 -151.359132 60.766602 -150.885071 60.886291 -150.476722 61.020060 -150.044904 60.937921 -150.044904 60.937921 # -b -149.979193 61.045875 -150.033170 61.226582 -150.033170 61.226582 # -b -149.857157 61.449531 -150.373461 61.247703 -150.659775 61.400247 -150.382848 61.717070 -150.218570 62.094911 -150.307749 62.285004 -150.382848 62.033893 -150.626919 61.712377 -150.838134 61.437797 -150.988332 61.200766 -151.464739 61.029448 -151.894210 60.799458 -152.203992 60.609364 -152.445716 60.360600 -152.776620 60.245605 -153.163848 60.299582 -152.788354 60.142344 -152.755499 60.020308 # -b -164.550692 63.050073 -164.663340 63.028951 -164.386413 63.028951 -164.330089 63.005483 # -b -163.757462 63.000789 -163.569715 63.059460 -163.184834 63.035992 -162.776485 63.188536 -162.358748 63.460769 -162.081821 63.474850 -162.203857 63.388017 -161.696940 63.420873 -161.222880 63.479543 -160.847386 63.700146 -160.767594 63.866771 -160.945953 64.026356 -160.955340 64.174207 -161.340221 64.418277 -161.476338 64.516845 -161.067989 64.502764 -160.748819 64.664695 -160.955340 64.861829 -161.265123 64.838361 -161.598373 64.796118 -161.894075 64.735100 -162.443234 64.526232 -162.776485 64.284508 -163.020555 64.559088 -163.391355 64.622452 -163.053411 64.512151 -163.184834 64.441746 -163.635426 64.573169 -163.870110 64.554394 -164.306621 64.563781 -164.869861 64.441746 -165.414327 64.507457 -166.038585 64.563781 -166.240413 64.608371 -166.512646 64.730407 -166.681618 65.004986 -166.855284 65.265485 -166.648763 65.141103 -166.193476 65.295994 -166.869365 65.382827 -167.122823 65.371093 -167.826874 65.535371 -168.136656 65.692609 -167.958297 65.701996 -167.826874 65.685568 -167.549947 65.765361 -167.310570 65.906171 -166.935076 65.960148 -166.733249 66.054022 -166.141846 66.187791 -165.832064 66.124427 -165.677173 66.218300 -165.498813 66.394313 -165.226580 66.438902 -164.827618 66.535123 -164.409882 66.591447 -163.799705 66.626649 -163.945208 66.600834 -163.780930 66.474105 -163.888884 66.267584 -163.888884 66.204219 -163.658895 66.070449 -163.020555 66.070449 -162.720160 66.103305 -162.621593 66.054022 -162.293037 66.039941 -161.992642 66.030553 -161.762652 66.000044 -161.584292 66.208913 -161.330834 66.248809 -161.100844 66.173710 -160.945953 66.274624 -161.551437 66.399006 -161.818976 66.293399 -161.870606 66.474105 -162.016110 66.636037 -161.560824 66.464718 -161.199411 66.530429 -160.988196 66.448290 -160.659639 66.363804 -160.218434 66.424821 -160.072930 66.455330 # -b -159.873449 66.556244 -160.192619 66.514001 -160.103439 66.575019 # -b -159.873449 66.692361 -160.225475 66.645424 -160.469546 66.589100 -160.854427 66.652464 -161.197064 66.605528 -161.305019 66.661852 -161.516234 66.579713 -161.882340 66.762766 -161.596026 66.922351 -161.802548 67.034999 -162.121718 67.030305 -162.577004 66.990409 -162.356401 67.161728 -162.530067 67.135913 -162.642715 67.088976 -162.882092 67.004490 -163.257586 67.037345 -163.755115 67.218052 -163.820826 67.354168 -164.107140 67.560690 -164.205707 67.631095 -164.815884 67.811801 -165.365044 68.006588 -165.984608 68.121583 -166.458669 68.304636 -166.885793 68.365654 -166.580704 68.473609 -166.698046 68.393816 -166.524380 68.426672 -166.172355 68.511158 -166.313165 68.558095 -166.280309 68.811553 -166.270922 68.891345 -165.871960 68.903079 -165.815636 68.846755 -165.088117 68.914814 -164.482634 68.954710 -163.952249 69.015727 -163.468801 69.229289 -163.224730 69.463973 -163.069839 69.499176 -162.882092 69.595396 -162.830462 69.618864 -162.896173 69.747940 -162.332933 69.764368 -162.750669 69.776102 -162.694345 69.912218 -162.530067 69.970889 # -b -162.290690 70.017826 -161.868259 69.921606 -161.901115 69.956808 -161.901115 69.956808 # -b -162.466702 66.931738 -162.325892 66.957553 -162.147533 66.840211 -162.048966 66.722870 -162.424459 66.769806 -162.523026 66.896535 -162.466702 66.931738 # -b -169.833418 63.035992 -169.885048 63.115784 -169.885048 63.115784 # -b -170.075142 63.491278 -169.737198 63.420873 -169.568225 63.343427 -169.295993 63.303531 -169.019066 63.343427 -168.774995 63.268328 -168.840707 63.179149 -169.249056 63.188536 -169.493127 63.108743 -169.713729 63.045379 -169.713729 63.045379 # -b -167.566375 60.262032 -167.256593 60.250298 -166.737942 60.327744 -166.395304 60.402843 -165.986955 60.339478 -165.721763 60.306622 -165.667785 60.097754 -165.688907 60.003881 # -b -167.212003 59.999187 -167.477195 60.118875 -167.566375 60.262032 -167.566375 60.262032 # -b -165.379125 60.670382 -165.191378 60.757215 -164.860474 60.837007 -164.320702 60.679769 -164.628137 60.435698 -164.937920 60.595283 -165.292292 60.653954 -165.379125 60.670382 # -b -164.330089 63.005483 -164.320702 62.829470 -164.597629 62.798961 -164.907411 62.702741 -164.973122 62.829470 -164.550692 63.050073 # -b -162.189776 59.982759 -162.344667 60.240911 -162.443234 60.365293 -161.978561 60.653954 -161.560824 60.846394 -161.638269 60.846394 -162.046619 60.712625 -162.431500 60.529572 -162.586391 60.257339 -162.541801 60.142344 -162.574657 60.081326 # -b -164.067244 59.975719 -164.055510 60.076632 -164.419269 60.025002 -164.585894 60.273767 -164.341824 60.484982 -164.121221 60.653954 -163.724606 60.771296 -164.055510 60.825273 -164.407535 60.841701 -164.773641 60.900372 -164.738439 61.020060 -164.961388 61.113934 -165.203112 60.975470 -165.390859 61.125668 -165.501160 61.268825 -165.440142 61.407288 -165.726456 61.348617 -165.803902 61.517589 -165.531669 61.576260 -165.526975 61.665440 -165.747578 61.590341 -165.951752 61.548098 -166.024504 61.576260 -165.902469 61.658399 -165.951752 61.742885 -165.947059 61.836759 -165.803902 61.846146 -165.792168 61.977569 -165.764006 62.127766 -165.698294 62.270923 -165.625542 62.374184 -165.548097 62.470404 -165.404940 62.566625 -165.322801 62.618255 -165.151482 62.754371 -165.052915 62.740290 -164.919145 62.763759 -164.952001 62.899875 -164.759560 63.000789 # -b -170.098610 66.159629 -169.690261 66.115039 -169.957800 66.049328 # -b -169.887395 63.115784 -170.342681 63.193230 -170.685319 63.326999 -171.126524 63.383323 -171.511405 63.308224 -171.854043 63.430260 -171.905673 63.554642 -171.830574 63.784632 -171.431612 63.681371 -171.013876 63.592191 -170.694706 63.650862 -170.441248 63.690759 -170.140853 63.622700 -170.075142 63.491278 -170.075142 63.491278 # -b -172.931240 60.545999 -172.919506 60.501410 -172.698903 60.409883 -172.555747 60.372334 -172.865529 60.435698 -172.996952 60.522531 -172.931240 60.545999 # -b -179.000000 68.743495 -178.779738 68.579216 -178.601379 68.466568 -178.282209 68.421978 -178.404245 68.511158 -178.085075 68.337492 -177.948959 68.271781 -177.545303 68.243619 -177.301232 68.184948 -177.277764 68.107502 -176.935126 68.041791 -177.071242 67.943224 -176.540858 67.882206 -176.155977 67.849350 -176.385967 67.722621 -176.296787 67.640482 -175.714772 67.509059 -175.456620 67.502019 -175.733546 67.602933 -175.935374 67.722621 -175.766402 67.753130 -175.404989 67.685072 -175.160919 67.480897 -174.808893 67.340087 -174.996640 67.438654 -174.916848 67.243867 -174.696245 66.943472 -174.644615 66.722870 -174.433400 66.619609 -174.222185 66.560938 -173.982807 66.495227 -174.034438 66.328601 -173.795061 66.460024 -173.968726 66.645424 -174.147086 66.692361 -174.067293 66.978675 -174.334833 67.020918 -174.442787 67.051426 -174.377076 67.088976 -173.935871 67.067854 -173.780980 67.051426 -173.626088 67.124178 -173.396099 67.063161 -173.485278 66.948166 -173.241207 66.823783 -173.241207 66.988062 -172.898570 66.905923 -172.424509 66.948166 -172.659192 67.011530 -172.049015 66.978675 -171.729846 66.870720 -171.457613 66.711135 -170.946003 66.452984 -170.528266 66.284011 -170.518879 66.232381 -170.232565 66.173710 -170.101142 66.159629 # -b -169.955453 66.049328 -170.415433 65.936680 -170.593792 65.755973 -170.847251 65.624551 -171.354167 65.842806 -171.100709 65.594042 -171.330699 65.483741 -171.992506 65.479047 -172.180253 65.251404 -172.457179 65.204467 -172.058217 65.056617 -172.644926 64.958050 -172.710638 64.852442 -172.842060 64.824280 -172.973483 64.721019 -172.842060 64.631839 -172.513503 64.601331 -172.344531 64.432358 -172.898384 64.512151 -172.874916 64.446439 -173.109600 64.242265 -173.259797 64.469908 -173.339589 64.474601 -173.771407 64.376034 -174.034253 64.413584 -174.189144 64.622452 -174.663204 64.702245 -174.606880 64.953356 -174.705447 64.934581 # -b -174.674939 64.967437 -174.773506 64.824280 -175.050432 64.786731 -175.008189 64.730407 -175.402458 64.828974 -175.909374 65.042536 -175.956311 65.319462 -176.120589 65.488434 -176.519551 65.598736 -176.848108 65.603429 -177.364412 65.535371 -177.876022 65.507209 -178.490893 65.565880 -178.580072 65.802910 -178.889855 65.964842 -178.842918 66.039941 -178.580072 66.192485 -178.655171 66.347376 -178.941485 66.159629 -179.000000 66.189567 # -b 169.885048 68.755229 170.448289 68.846755 170.866025 69.039196 170.898881 69.231636 170.720521 69.407649 170.335640 69.593049 170.335640 69.717431 170.481144 69.869975 170.415433 69.930993 # -b 171.330699 70.017826 172.067605 69.956808 172.687169 69.919259 173.447544 69.884056 174.118739 69.888750 174.738303 69.832426 174.860339 69.858241 175.221751 69.869975 175.860090 69.869975 176.437412 69.733859 177.099219 69.625905 177.362065 69.614170 178.066115 69.449892 178.385285 69.419383 178.718536 69.325510 179.000000 69.263358 # -b 179.000000 64.747939 178.575564 64.577862 178.476997 64.664695 178.223538 64.744488 177.937225 64.697551 177.383371 64.843055 177.139301 65.014374 176.580754 65.066004 176.346070 65.166918 176.435250 64.976824 176.965635 64.943969 177.162769 64.772650 176.444637 64.847748 175.961189 64.981518 176.191179 64.824280 176.158324 64.636533 176.139549 64.350219 175.731200 64.150738 175.665488 64.059212 176.289746 64.270427 176.205260 64.559088 176.590141 64.601331 177.139301 64.725713 177.373984 64.636533 177.561731 64.371341 178.087422 64.228184 178.387817 64.261039 178.519240 64.063905 178.298637 64.016969 178.650662 63.967685 178.772698 63.592191 179.000000 63.289088 179.000000 63.289088 # -b 179.000000 63.030208 178.993300 63.028951 # -b 178.995462 63.028951 178.962606 62.974974 179.000000 62.950668 # -b 179.000000 62.338348 178.798328 62.336635 178.380591 62.444589 177.784495 62.557237 177.498181 62.679273 177.474713 62.566625 177.329209 62.644070 177.155543 62.723862 176.934941 62.838857 177.099219 62.627642 177.155543 62.540809 176.658014 62.465711 176.216809 62.310820 175.784992 62.188784 175.662956 62.177050 175.231139 62.076136 175.221751 62.167663 175.076247 62.085523 174.836870 61.935326 174.428521 61.815637 174.085883 61.773394 173.841812 61.658399 173.578967 61.726458 173.391220 61.569220 173.287959 61.517589 173.025114 61.374432 172.762268 61.390860 172.813898 61.259437 172.569828 61.189032 172.405549 61.142096 172.283514 60.998939 172.030055 61.083425 172.107501 60.949655 171.908020 60.862822 171.699152 60.825273 171.499671 60.733746 171.257947 60.571815 171.004488 60.545999 170.671238 60.459167 170.560937 60.409883 170.474104 60.250298 170.373190 60.048470 170.373190 60.048470 # -b 170.089223 59.971025 170.068101 60.020308 # -b 159.988444 69.778449 160.476586 69.722125 160.992890 69.553153 161.302672 69.492135 161.612454 69.435811 162.077128 69.621211 162.382216 69.693963 162.781178 69.656413 163.311563 69.722125 163.827867 69.736206 164.193973 69.679882 164.569467 69.555500 165.020059 69.560193 165.020059 69.560193 # -b 164.998937 69.569581 165.219540 69.593049 165.604421 69.571927 165.970527 69.550806 166.430507 69.492135 166.820081 69.475707 167.172107 69.576621 167.500664 69.717431 167.890238 69.747940 167.876157 69.668148 168.176552 69.571927 168.218795 69.377140 168.251651 69.208168 168.669388 69.170619 169.002638 69.083786 169.387519 68.940629 169.664446 68.766963 169.885048 68.755229 # -b 168.099107 69.994358 168.099107 69.994358 # -b 168.474600 70.020173 169.127020 69.884056 169.366398 69.729165 169.258443 69.611824 168.807851 69.564887 168.230529 69.710391 167.836261 69.888750 168.099107 69.994358 # -b 164.736092 59.942863 164.557732 60.036736 # -b 161.368383 59.954597 161.908156 60.299582 162.173348 60.496716 162.781178 60.642220 163.332684 60.745480 163.708178 60.937921 163.609611 61.151483 163.874803 61.374432 163.858376 61.585647 163.956943 61.810944 163.996839 62.090217 164.107140 62.310820 164.381720 62.414080 164.381720 62.414080 # -b 164.888636 62.407040 164.438044 62.681619 163.621345 62.545503 163.302176 62.275617 163.081573 61.923592 163.269320 61.688908 162.968925 61.526977 162.828115 61.717070 162.396297 61.599728 161.809588 61.306374 161.412973 61.118627 160.859120 60.792417 160.340470 60.604670 160.241903 60.799458 160.220781 60.991898 160.220781 60.991898 # -b 159.988444 61.066997 160.021300 61.135055 # -b 159.910999 61.315761 160.131601 61.552792 160.209047 61.956447 160.028341 61.794516 # -b 170.068101 60.020308 169.812296 60.212749 169.472005 60.447432 169.162223 60.545999 168.807851 60.571815 168.467560 60.588243 168.134309 60.621098 167.782284 60.538959 167.472502 60.426311 167.273021 60.409883 167.120476 60.339478 166.932730 60.372334 166.831816 60.184587 166.557236 60.057858 166.479790 60.008574 # -b 166.158274 59.954597 166.247454 60.175200 166.226332 60.381721 166.181742 60.496716 166.026851 60.452126 165.707682 60.273767 165.374431 60.217443 165.088117 60.069592 165.088117 60.069592 # -b 159.922733 70.095272 159.683356 69.851201 159.988444 69.778449 159.988444 69.778449 # -b 160.220781 60.991898 159.899265 61.024754 159.988444 61.066997 # -b 160.021300 61.135055 159.910999 61.205460 159.910999 61.315761 # -b 160.033034 61.794516 159.577748 61.679521 159.145931 61.918898 158.850229 61.836759 158.319845 61.794516 157.611100 61.782782 157.038473 61.573913 156.672366 61.315761 156.242896 61.034141 155.956582 60.754868 155.480174 60.534265 154.919281 60.316010 154.663475 60.086020 154.663475 60.086020 # -b 70.320568 66.640730 70.865034 66.741644 71.437661 66.851945 71.592552 66.657158 70.982375 66.544510 70.466072 66.556244 70.320568 66.640730 # -b 72.526593 70.006092 72.592304 69.914565 72.672097 69.715084 72.606385 69.541419 72.517205 69.386527 72.460881 69.118988 72.728421 68.863183 73.244724 68.654315 73.432471 68.410244 73.080446 68.138011 73.122689 67.823535 72.949023 67.626401 72.582917 67.502019 72.338846 67.281416 72.151099 67.159381 71.723975 67.103057 71.357869 67.093669 71.766218 67.086629 71.930497 66.964594 71.493985 66.948166 71.095023 66.835518 70.775854 66.767459 70.254856 66.692361 70.189145 66.753378 # -b 69.780796 66.697054 70.081191 66.499920 70.099965 66.363804 70.541170 66.333295 71.348482 66.354416 72.043145 66.222994 72.273135 66.525735 72.869231 66.657158 73.498183 66.870720 73.850208 67.192237 74.052036 67.405799 74.436917 67.588852 74.732618 67.795373 74.746699 67.985467 74.601195 68.184948 74.314881 68.321064 74.357124 68.454834 74.389980 68.682477 75.108111 68.818593 75.629109 68.877264 76.103170 68.933588 76.642942 68.903079 76.750896 68.698905 77.173326 68.572176 77.290668 68.417285 77.239038 68.299943 77.346992 68.210763 77.281281 68.067606 77.239038 67.823535 77.379848 67.678031 77.689630 67.527834 78.295114 67.513753 78.628364 67.534875 78.759787 67.602933 78.187159 67.647523 77.835134 67.715581 77.656774 67.703847 77.511271 67.889247 77.600450 68.138011 78.163691 68.260047 77.985331 68.414938 77.755341 68.682477 77.576982 68.870224 76.840076 69.020421 76.220511 69.177659 75.629109 69.208168 75.140967 69.055624 74.413448 69.107254 73.751641 69.194087 73.930000 69.456932 73.596750 69.862935 73.643686 69.942727 # -b 60.020308 70.050682 60.517837 69.815998 60.414577 69.663454 60.062551 69.675188 60.062551 69.675188 # -b 59.888886 68.691864 60.592936 68.778697 60.846394 68.893692 60.959042 69.118988 60.757215 69.212862 60.461513 69.438158 60.428658 69.630598 60.790070 69.740900 61.146789 69.825386 61.541058 69.745593 62.104298 69.733859 62.766106 69.724472 63.273022 69.642332 63.958298 69.529684 64.563781 69.377140 65.225589 69.219902 65.690262 69.154191 65.610470 69.072052 65.929639 69.032155 66.549204 68.877264 67.276723 68.710639 67.858738 68.482996 68.182601 68.260047 68.576869 68.360960 68.910120 68.734107 69.008687 68.926548 68.356267 69.111948 68.069953 69.360712 67.896287 69.480401 67.243867 69.654067 66.990409 69.522644 66.858986 69.888750 66.858986 69.888750 # -b 66.912963 70.036601 67.025611 69.975583 67.213358 69.975583 # -b 70.189145 66.753378 69.780796 66.697054 69.780796 66.697054 # -b 49.842084 68.008935 50.330226 68.138011 50.823062 68.309330 51.001421 68.311677 51.686697 68.426672 52.137289 68.506464 52.456459 68.349226 52.634818 68.522892 52.620737 68.663702 52.855421 68.680130 53.296626 68.626153 53.273157 68.795125 53.568859 68.893692 54.066388 68.945322 54.385557 68.961750 54.516980 68.973484 # -b 49.896062 69.259798 50.093196 69.278573 50.280943 68.996953 50.158907 69.090826 # -b 58.806995 69.963849 58.764752 69.968543 # -b 60.064898 69.675188 59.689405 69.790183 59.163714 69.877016 59.248200 69.771408 58.886787 69.938034 58.806995 69.963849 # -b 54.516980 68.973484 54.498205 68.950016 54.057000 68.921854 53.770686 68.813900 53.934965 68.853796 54.024145 68.680130 53.902109 68.527586 54.000676 68.311677 54.418413 68.267087 54.883086 68.145052 54.948798 68.344533 55.314904 68.494730 55.873451 68.595644 56.403835 68.572176 57.023400 68.579216 57.497461 68.595644 57.994990 68.774003 58.445582 68.926548 59.083921 68.985219 59.370235 68.750535 59.196569 68.626153 59.313911 68.365654 59.989800 68.466568 59.891232 68.691864 59.891232 68.691864 # -b 39.914972 68.079340 40.205979 67.938530 40.393726 67.795373 40.853706 67.720274 41.064921 67.471510 41.163488 67.208664 41.327767 66.978675 40.778607 66.553897 40.271691 66.354416 40.093331 66.274624 # -b 39.950174 64.608371 40.475865 64.526232 40.809116 64.474601 40.752792 64.601331 40.466478 64.915806 40.034660 65.213855 40.034660 65.213855 # -b 39.860995 65.617510 40.508721 65.802910 41.015638 65.976576 41.644589 66.138508 42.109263 66.368497 42.404964 66.490533 42.705359 66.382578 43.287374 66.354416 43.578382 66.164323 43.676949 66.133814 44.005506 65.985963 44.202640 65.960148 44.183865 66.234728 44.169784 66.337989 44.446711 66.565632 44.535890 66.870720 44.380999 67.093669 43.897551 67.180502 43.949181 67.487938 44.118154 67.844657 44.151009 67.903328 44.169784 68.215457 43.784903 68.445447 43.277987 68.663702 43.841227 68.567482 44.404467 68.527586 45.052194 68.515852 45.746857 68.461874 46.080108 68.264740 46.488457 68.051178 46.530700 67.807107 45.671758 67.732009 45.197698 67.534875 45.099131 67.316619 45.681146 67.077242 45.967460 66.844905 46.530700 66.856639 46.741915 66.797968 47.314543 66.849599 47.746361 66.999796 47.779216 67.264988 48.032675 67.577118 48.563059 67.619361 48.802437 67.703847 49.168543 67.856391 49.839738 68.008935 49.839738 68.008935 # -b 48.661626 69.445198 48.793049 69.475707 48.990183 69.480401 49.323434 69.452239 49.896062 69.259798 49.896062 69.259798 # -b 50.161254 69.090826 49.588626 68.818593 49.015999 68.694211 48.682748 68.680130 48.297867 68.823287 48.222768 68.755229 48.232156 69.032155 48.419902 69.313776 48.663973 69.445198 # -b 29.978472 69.703350 30.100507 69.656413 30.246011 69.684575 30.433758 69.654067 30.588649 69.783143 30.893738 69.754981 31.104953 69.729165 31.480446 69.630598 31.701049 69.745593 31.963894 69.771408 31.977975 69.900484 32.470811 69.794877 32.860385 69.747940 33.080988 69.722125 32.893241 69.557846 32.428568 69.618864 32.142254 69.722125 32.175110 69.541419 32.395712 69.461626 32.494279 69.440505 32.813449 69.445198 32.968340 69.421730 33.066907 69.341938 33.268735 69.332550 33.320365 69.271532 33.386077 69.208168 33.827282 69.259798 34.381135 69.243370 34.963150 69.182353 35.287013 69.182353 35.681281 69.172965 36.080243 69.107254 36.727970 68.938282 37.192643 68.823287 37.633848 68.675436 38.098521 68.499424 38.361367 68.349226 38.680537 68.248312 38.835428 68.304636 39.112354 68.128624 39.440911 68.074647 39.863341 68.025363 39.914972 68.079340 # -b 40.093331 66.274624 39.290714 66.129120 38.713392 66.075143 37.967099 66.093918 37.788739 66.107999 37.446101 66.194832 36.709195 66.288705 35.901884 66.373191 35.230689 66.474105 34.789484 66.584406 34.390522 66.722870 34.104208 66.711135 33.686471 66.819090 33.423626 66.774500 32.860385 66.973981 32.484892 67.140606 32.109398 67.114791 32.405099 66.936432 32.649170 66.675933 33.066907 66.518695 33.606679 66.403700 33.874218 66.239422 34.268487 66.133814 34.658061 65.927292 34.780097 65.594042 34.456233 65.392214 34.709692 65.051923 34.888051 64.871217 34.723773 64.507457 35.033555 64.399503 35.540471 64.298589 35.958208 64.218796 36.286765 64.016969 37.169175 63.845650 37.600992 63.798713 37.934243 63.939523 38.164233 63.944217 38.018729 64.317364 37.577524 64.385422 37.061220 64.474601 36.709195 64.692857 36.610628 64.889991 36.939185 65.162224 37.779352 64.990905 38.375448 64.819586 38.131377 64.655308 38.474015 64.749181 39.013787 64.730407 39.699063 64.554394 39.952521 64.608371 39.952521 64.608371 # -b 40.037007 65.213855 39.863341 65.521290 39.863341 65.617510 # -b 30.215502 59.963984 30.182647 60.001534 30.048877 60.013268 # -b 30.931287 61.681868 31.142502 61.672480 31.471059 61.531670 31.813697 61.329842 32.341735 61.207807 32.552950 60.973123 32.740697 60.768949 32.630396 60.531918 32.376937 60.189281 31.980322 60.243258 31.449938 60.083673 31.449938 60.083673 # -b 30.987611 59.940516 30.910165 60.304275 30.633239 60.646913 30.436105 60.768949 30.358659 60.959042 30.292948 61.043529 30.060611 61.059956 30.114588 61.426063 30.241317 61.541058 30.375087 61.672480 30.501816 61.688908 30.511204 61.735845 # -b 19.987995 69.806611 20.293083 69.914565 20.293083 69.522644 20.072481 69.318469 20.462055 69.553153 20.560623 69.733859 20.856324 69.888750 20.936116 69.806611 21.166106 69.825386 21.320997 69.888750 # -b 21.255286 70.013132 21.705878 69.839467 22.006273 69.790183 21.973417 69.989664 21.973417 69.989664 # -b 22.987250 70.048335 23.226627 69.956808 23.226627 69.956808 # -b 29.173507 70.001398 29.450434 69.884056 29.943269 69.815998 29.624100 69.729165 29.891639 69.693963 29.976125 69.703350 # -b 19.865959 63.650862 20.217985 63.721267 20.480830 63.812794 20.715514 63.923095 20.936116 64.131964 21.156719 64.289202 21.363240 64.427665 21.433645 64.350219 21.466501 64.488683 21.255286 64.617758 21.198962 64.716326 21.100395 64.843055 21.311610 64.948662 21.433645 65.042536 21.565068 65.195080 21.377321 65.333543 21.597924 65.406295 21.752815 65.453232 21.917093 65.502515 22.039129 65.549452 21.860769 65.706690 22.071984 65.671487 22.236263 65.652713 22.292587 65.734852 22.391154 65.901477 22.466253 65.861581 22.653999 65.868622 22.832359 65.838113 23.076430 65.760667 23.503554 65.856887 23.911903 65.765361 24.024551 65.936680 24.132506 65.892090 24.310865 65.814644 24.573711 65.784135 24.939817 65.622204 25.258986 65.443844 25.324698 65.272525 25.301230 65.112941 25.348166 64.972131 25.146338 64.885298 24.639422 64.814893 24.231073 64.437052 23.616202 64.092067 23.128060 63.817488 22.719711 63.500665 22.334830 63.322305 21.851382 63.223738 21.574455 63.134559 21.649554 63.040685 # -b 27.624596 60.585896 27.457971 60.522531 26.974523 60.592936 26.399548 60.494369 26.026402 60.433351 25.880898 60.400496 25.540607 60.337131 25.320004 60.297235 24.867065 60.198668 24.458716 60.161119 24.228726 60.067245 23.874354 60.078979 23.578653 60.006227 # -b 23.346316 59.980412 23.358050 60.067245 23.313460 60.090713 # -b 23.069389 59.989800 22.949701 60.083673 22.783075 60.215096 22.496762 60.292541 22.398194 60.407536 21.834954 60.536612 21.536906 60.663341 21.360893 60.738440 21.250592 60.808845 21.241205 60.952002 21.283448 61.090465 21.384362 61.292293 21.363240 61.472999 21.433645 61.566873 21.424258 61.595035 21.351506 61.796863 21.236511 62.057361 21.236511 62.381225 21.163759 62.573665 21.203655 62.822430 21.323344 62.906916 21.346812 63.021911 21.501703 63.040685 # -b 19.983301 60.025002 20.049013 60.090713 # -b 19.983301 60.222136 20.016157 60.346519 20.016157 60.346519 # -b 21.769243 60.210402 21.614352 60.243258 21.757508 60.139997 21.802098 60.156425 # -b 22.553086 60.050817 22.696243 60.264379 22.541351 60.254992 22.299627 60.116529 22.419316 60.083673 22.553086 60.050817 # -b 29.002189 59.947557 29.100756 60.001534 29.255647 60.006227 # -b 30.048877 60.013268 29.950310 60.132957 29.422272 60.215096 28.870766 60.254992 28.516394 60.358253 28.507006 60.553040 28.584452 60.564774 28.605573 60.754868 28.262935 60.663341 27.866320 60.560081 27.624596 60.585896 # -b 9.941194 63.411485 10.138328 63.465462 10.579533 63.519440 10.668712 63.603926 10.969107 63.763510 11.344601 63.831569 11.231953 63.845650 10.649938 63.704840 10.161796 63.554642 10.039761 63.578110 # -b 9.962315 63.754123 10.004558 63.798713 # -b 9.929459 63.923095 10.051495 64.087374 10.248629 64.237571 10.534943 64.385422 10.746158 64.488683 10.966761 64.608371 11.407966 64.540313 11.440821 64.763262 11.670811 64.847748 11.361029 64.843055 11.694279 65.004986 11.900801 65.148143 12.168340 65.171612 12.356087 65.251404 12.342006 65.371093 12.069773 65.305381 12.309150 65.443844 12.309150 65.549452 12.665869 65.392214 12.576689 65.549452 12.464041 65.652713 12.708112 65.690262 12.816067 65.842806 12.961570 65.910865 13.017894 66.054022 12.520365 65.946067 12.928715 66.119733 13.027282 66.258196 13.445018 66.347376 13.172786 66.389619 13.271353 66.478799 13.247884 66.575019 13.313596 66.706442 13.721945 66.800315 13.721945 66.938778 13.951935 66.990409 14.228861 67.063161 14.449464 67.196930 14.360284 67.318966 14.834345 67.560690 15.078416 67.487938 15.529008 67.487938 15.585332 67.560690 15.223919 67.598239 15.388198 67.614667 15.486765 67.753130 15.444522 67.893940 15.773079 68.001895 15.820016 68.072300 16.050005 68.105155 16.256527 67.926796 16.392643 68.055872 16.402031 68.201376 16.303464 68.365654 16.768137 68.400857 17.138937 68.337492 17.406476 68.445447 17.472188 68.522892 16.974658 68.534626 16.514679 68.518198 16.735281 68.630847 17.209342 68.703598 17.373620 68.762269 17.683403 68.795125 17.725646 68.910120 17.547286 69.008687 17.847681 69.126029 18.044815 69.224596 18.101139 69.384181 18.298273 69.433464 18.396841 69.348978 18.664380 69.259798 18.697235 69.365406 18.476633 69.510910 18.838046 69.468667 19.260476 69.271532 19.490466 69.273879 19.025792 69.473360 19.007018 69.632945 19.335575 69.754981 19.631276 69.771408 19.654744 69.529684 19.809635 69.715084 19.987995 69.806611 # -b 18.234909 63.000789 18.380413 63.085275 18.643258 63.219045 18.962428 63.312918 19.239354 63.474850 19.624235 63.514746 19.868306 63.650862 19.868306 63.650862 # -b 15.632269 68.926548 15.773079 68.945322 15.805935 68.778697 15.852871 68.659009 15.927970 68.640234 16.139185 68.799819 16.524066 68.771657 16.402031 68.572176 15.993681 68.426672 15.773079 68.443100 15.599413 68.309330 15.519621 68.466568 14.979849 68.243619 14.848426 68.276474 14.604355 68.217804 14.261717 68.206069 14.374365 68.316371 14.717003 68.400857 14.989236 68.445447 15.209838 68.534626 15.444522 68.626153 15.519621 68.774003 15.599413 68.910120 15.632269 68.926548 # -b 14.451811 68.680130 14.484666 68.727067 14.616089 68.778697 14.827304 68.877264 15.071375 68.881958 15.169942 68.893692 15.277897 68.755229 15.169942 68.630847 14.860160 68.630847 14.925871 68.670743 14.639558 68.630847 14.428342 68.663702 14.451811 68.680130 # -b 15.775426 69.194087 15.888074 69.252758 16.108676 69.285614 16.094595 69.147150 15.906849 69.025115 15.564211 68.985219 15.676859 69.130722 15.775426 69.194087 # -b 14.925871 67.795373 14.827304 67.868125 15.202798 67.877512 15.291978 67.807107 14.907097 67.682725 14.770980 67.732009 14.925871 67.795373 14.925871 67.795373 # -b 16.944150 69.194087 16.944150 69.219902 16.887826 69.302041 16.977005 69.367753 17.319643 69.414689 17.319643 69.480401 17.451066 69.569581 17.596570 69.560193 17.803091 69.503869 17.925127 69.426424 17.859415 69.236330 17.563714 69.147150 17.310256 69.083786 16.869051 69.036849 16.887826 69.111948 16.991086 69.172965 16.944150 69.194087 # -b 18.244296 69.693963 18.464899 69.691616 18.633871 69.729165 18.741825 69.855894 18.920185 69.722125 18.699582 69.576621 18.244296 69.550806 18.225522 69.595396 18.244296 69.693963 18.244296 69.693963 # -b 18.863861 70.020173 18.788762 69.989664 # -b 19.150175 70.031907 19.197111 69.952115 19.215886 69.987317 # -b 19.347309 70.006092 19.525668 69.938034 19.215886 69.797224 18.840392 69.900484 18.887329 69.975583 18.887329 69.975583 # -b 18.087058 63.012523 18.227868 62.989055 18.218481 62.918650 17.974410 62.801308 17.744420 62.852938 17.688096 62.862326 17.720952 62.634683 17.622385 62.507954 17.359539 62.512647 17.279747 62.346022 17.312603 62.113685 17.270360 61.829718 17.204648 61.698296 16.993433 61.625544 17.007514 61.435450 17.014555 61.207807 17.136590 60.883944 17.214036 60.705584 16.993433 60.433351 16.507638 60.243258 16.265914 60.144691 16.772831 60.222136 17.246891 60.449779 17.368927 60.656301 17.554327 60.553040 17.941555 60.489675 18.359291 60.308969 18.293580 60.231524 18.624484 60.055511 # -b 19.962180 60.391108 19.664132 60.391108 19.607808 60.304275 19.718109 60.128263 19.983301 60.025002 # -b 20.049013 60.090713 19.983301 60.222136 19.983301 60.222136 # -b 20.016157 60.346519 19.983301 60.369987 19.962180 60.391108 # -b 7.547422 63.010176 7.594358 63.125171 7.791493 63.165067 7.969852 63.174455 8.035563 63.237819 8.190455 63.244860 8.340652 63.219045 8.387589 63.308224 8.542480 63.392711 8.805325 63.470156 9.105720 63.524133 9.213675 63.352814 9.293467 63.486584 9.359178 63.564029 9.612637 63.646169 9.866095 63.549948 9.941194 63.411485 9.941194 63.411485 # -b 10.039761 63.578110 9.917725 63.676678 9.964662 63.754123 # -b 10.006905 63.798713 9.711204 63.880852 9.931806 63.923095 # -b 8.450953 63.568723 8.648087 63.592191 8.849915 63.681371 9.089292 63.667290 9.023581 63.559336 8.493196 63.524133 8.450953 63.568723 # -b 4.933047 61.130361 4.846215 61.099853 4.780503 61.041182 4.768769 60.987204 4.890804 61.008326 4.933047 61.130361 4.933047 61.130361 # -b 5.001106 60.670382 4.989371 60.778336 4.989371 60.675075 5.001106 60.670382 # -b 5.949227 59.989800 6.268397 60.165812 6.498386 60.440392 6.665012 60.386415 6.819903 60.564774 6.498386 60.614058 5.958614 60.247951 5.794336 60.083673 # -b 5.407108 59.956944 5.705156 60.074286 5.550265 60.193974 5.320275 60.165812 5.153650 60.346519 5.439964 60.456820 5.695769 60.677422 5.177118 60.592936 5.001106 60.785377 5.165384 60.759561 5.308541 60.855782 5.087939 60.942615 5.364865 61.022407 5.860047 61.069344 6.477265 61.097506 6.897348 60.968430 7.150807 60.947308 7.380796 61.144442 7.425386 61.235969 7.380796 61.367392 7.331513 61.477693 7.080402 61.170258 6.859799 61.177298 6.606341 61.320455 6.352883 61.165564 5.867088 61.186685 5.294460 61.106893 5.106713 61.224235 5.118447 61.383820 5.224055 61.524630 5.174771 61.625544 5.130182 61.735845 5.306194 61.855533 5.489247 61.817984 5.784949 61.886042 5.576080 61.876655 5.693422 61.975222 5.522103 61.932979 5.350784 61.923592 5.191199 61.942366 5.167731 62.118379 5.350784 62.040933 5.416495 62.134807 5.571387 62.092564 5.641792 62.097258 5.625364 62.226333 5.803723 62.294392 5.857700 62.252149 5.862394 62.416427 5.845966 62.442242 5.829538 62.493873 5.763827 62.543156 5.923412 62.608868 6.122893 62.604174 6.348189 62.554890 6.381045 62.676926 6.294212 62.756718 6.155749 62.796614 6.082997 62.906916 6.327068 62.918650 6.364617 63.010176 # -b 5.892903 62.238068 6.014938 62.350716 5.813111 62.364797 5.827192 62.238068 5.892903 62.238068 # -b 5.001106 61.761660 5.141916 61.850840 5.001106 61.881349 5.001106 61.796863 # -b -8.382895 71.076249 -8.955523 70.916664 -8.936748 70.848606 -8.185761 70.984722 -7.965158 71.160735 -8.382895 71.076249 -8.382895 71.076249 # -b -17.746767 79.200992 -17.521471 79.135281 -17.605957 79.055488 -17.878190 78.999164 -17.981451 79.114159 -17.746767 79.200992 # -b -17.735033 77.900845 -17.537899 77.844521 -17.772582 77.663815 -18.091752 77.727179 -17.735033 77.900845 -17.735033 77.900845 # -b -20.072481 79.771273 -19.912896 79.794741 # -b -20.006769 79.923817 -19.781473 79.980141 # -b -17.514431 80.012997 -17.833600 79.874534 -18.115220 79.750151 -19.082116 79.764232 -19.373124 79.738417 -19.654744 79.524855 -19.626582 79.409860 -19.861266 79.222113 -19.598420 79.308946 -19.213539 79.212726 -19.466997 79.238541 -19.664132 79.100078 -19.945752 79.109465 -19.880040 78.888863 -19.880040 78.888863 # -b -20.095949 77.814012 -19.053954 77.682590 -19.542096 77.612185 -19.851878 77.689630 # -b -20.006769 77.365767 -19.377818 77.234344 -19.049261 77.314136 -18.467246 77.293015 -18.279499 77.271893 -18.195013 77.044250 -18.204400 76.985580 -18.204400 76.985580 # -b -18.197360 76.985580 -18.206747 76.938643 -18.385106 76.811914 -18.892023 76.814261 -19.746271 76.901094 -19.746271 76.901094 # -b -20.215638 76.215818 -19.802595 76.084395 -19.811982 76.035111 # -b -20.084215 75.887261 -19.577299 75.706554 -19.483425 75.274737 -19.769739 75.112805 -19.769739 75.112805 # -b -20.206250 74.631704 -19.520975 74.643438 -19.136094 74.406408 -19.619542 74.216314 # -b -18.748866 76.502132 -18.739479 76.267448 -18.664380 75.929504 -18.786415 76.131332 -19.030486 76.396524 -19.143134 76.539681 -19.002324 76.586618 -18.852127 76.647635 -18.748866 76.502132 # -b -17.976757 75.300552 -18.187972 75.194944 -17.957982 75.072909 -17.493309 75.133927 -17.648200 74.925058 -18.220828 74.976689 -18.671420 74.983729 -18.924878 75.122192 -18.948347 75.281777 -18.586934 75.342795 -18.187972 75.380344 -17.976757 75.300552 -17.976757 75.300552 # -b -20.525420 80.012997 -20.609906 79.848718 -20.253187 79.750151 -20.065440 79.771273 # -b -19.908202 79.794741 -20.002076 79.923817 -20.002076 79.923817 # -b -19.884734 78.888863 -20.729595 78.820805 -21.133250 78.771521 -21.095701 78.642445 -20.954891 78.609589 -21.292835 78.388987 -21.649554 78.114407 -21.612005 77.992372 -21.705878 77.835134 -21.489969 77.663815 -21.001828 77.931354 -20.598172 77.886764 -20.100643 77.814012 # -b -19.851878 77.689630 -20.659190 77.689630 -20.415119 77.574635 -20.527767 77.520658 -20.274309 77.443212 -20.283696 77.370461 -20.002076 77.365767 # -b -19.753311 76.901094 -20.907954 76.945683 -21.715265 76.950377 -20.757757 76.896400 -21.198962 76.865891 -21.292835 76.814261 -21.123863 76.769671 -21.649554 76.647635 -22.137696 76.790792 -22.719711 76.682838 -22.531964 76.516213 -22.147083 76.513866 -21.827914 76.419992 -22.616450 76.422339 -21.705878 76.396524 -21.687103 76.328466 -21.583843 76.218164 -21.142638 76.154800 -20.870405 76.143066 -21.058152 76.279182 -20.222678 76.215818 -20.222678 76.215818 # -b -19.819023 76.035111 -20.438587 75.988175 -21.076926 75.943585 -20.325939 75.875527 -20.091256 75.887261 # -b -19.774433 75.112805 -20.215638 75.314633 -21.914746 75.546970 -21.881891 75.460137 -21.520478 75.403813 -20.703780 75.190251 -21.374974 75.070562 -21.121516 75.049441 -20.778878 74.932099 -20.858671 74.683334 -21.055805 74.641091 -20.525420 74.645785 -20.206250 74.631704 # -b -19.619542 74.216314 -20.384610 74.418142 -21.267020 74.465079 -22.116574 74.526096 -22.201060 74.307841 -22.168205 74.202233 -22.332483 74.077851 -22.135349 73.995712 -21.318650 73.946428 -20.933769 73.904185 -20.417466 73.789190 -20.591131 73.549813 -21.121516 73.444205 -21.806792 73.371453 -22.468600 73.244724 -23.416721 73.409003 -24.097303 73.756334 -24.439941 73.739907 -24.693399 73.561547 -24.960938 73.526345 -25.411531 73.397269 -25.918447 73.225950 -26.744533 73.303395 -26.692903 73.176666 -26.603723 73.146157 -25.655602 73.066365 -25.181541 72.953717 -25.876204 72.812907 -26.758614 72.798826 -26.866569 72.681484 -26.425364 72.606385 -25.524179 72.791785 -24.829516 72.559449 -25.599278 72.418638 -25.477242 72.252013 -25.411531 72.169874 -24.904614 72.418638 -24.308518 72.303643 -23.979961 72.214464 -23.571612 72.097122 -23.083470 71.968046 -22.773688 71.829583 -23.205506 71.571431 -23.083470 71.590206 -22.534311 71.766218 -22.576554 71.592552 -22.102493 71.709894 -22.600022 71.442355 -22.332483 71.432968 -21.806792 71.477558 -21.914746 71.271036 -21.895972 71.097370 -21.816179 70.994109 -21.905359 70.806363 -21.783324 70.656165 -21.661288 70.459031 -22.355951 70.482499 -22.600022 70.808710 -22.665734 70.440256 -23.867313 70.581067 -24.275663 71.062168 -24.782579 71.322666 -25.796412 71.536228 -26.636579 71.557350 -27.683267 71.806114 -27.838158 71.616021 -27.354710 71.463477 -26.369040 71.477558 -25.608665 71.210018 -26.031095 71.076249 -27.087171 70.940132 -27.763060 70.921358 -28.335687 70.893196 -28.410786 70.548211 -28.687713 70.451991 -27.462665 70.398013 -26.570867 70.334649 -27.406341 70.207920 -28.312219 70.137515 -28.002437 70.006092 -27.199819 70.163330 -26.162518 70.247816 -25.369288 70.285365 -25.003181 70.271284 -24.097303 70.163330 -23.163263 70.069456 -22.313708 70.114046 -22.149430 70.139861 # -b -22.147083 70.139861 -22.189326 70.050682 -22.189326 70.050682 # -b -21.759855 74.361818 -21.849035 74.155296 -20.924382 74.103666 -20.206250 74.197539 -20.581744 74.394674 -21.562721 74.408755 -21.759855 74.361818 # -b -25.641521 73.207175 -24.937470 73.071059 -24.097303 73.014735 -23.271217 73.071059 -23.247749 73.169626 -24.299131 73.223603 -24.740336 73.282274 -23.900169 73.218909 -23.383865 73.244724 -23.965880 73.343291 -24.928083 73.399615 -25.420918 73.289314 -25.641521 73.207175 # -b -22.036782 72.871578 -22.149430 72.747195 -22.266772 72.690871 -22.698589 72.714340 -22.942660 72.824641 -23.435496 72.864537 -24.153627 72.897393 -24.641769 72.960757 -23.810989 73.005347 -23.116326 73.005347 -22.501455 72.977185 -22.046169 72.899740 -22.036782 72.871578 # -b -23.062349 72.721380 -22.231569 72.493737 -22.198713 72.395170 -22.794810 72.367008 -22.222182 72.247319 -22.353605 72.099469 -22.794810 72.167527 -23.569265 72.397517 -24.132506 72.533633 -24.404739 72.655669 -24.536161 72.808213 -24.306171 72.866884 -23.667832 72.824641 -23.203159 72.791785 -23.062349 72.721380 # -b -25.453774 70.862687 -25.388062 70.635044 -25.819880 70.574026 -26.139050 70.541170 -26.946361 70.510661 -27.650411 70.456684 -28.058761 70.496580 -27.626943 70.705449 -26.890037 70.874421 -25.909060 71.043393 -25.524179 70.916664 -25.453774 70.862687 # -b -50.433487 69.907525 -50.391244 70.006092 # -b -50.963872 69.989664 -51.494256 70.001398 -52.817871 70.245469 -54.183729 70.524742 -53.963127 70.799322 -52.817871 70.745345 -51.672616 70.433216 -50.611846 70.405054 -51.207943 70.491887 -51.029583 70.606882 -51.095294 70.728917 -51.053051 70.869727 -51.902606 71.050434 -51.470788 71.069208 -52.188920 71.113798 -52.001173 71.263996 -52.264018 71.364909 -52.996231 71.400112 -51.869750 71.665304 -52.761547 71.648876 -53.104185 71.773259 -53.423355 71.899988 -53.873947 71.754484 -54.094550 71.688773 -54.010064 71.449395 -55.178788 71.484598 -55.751415 71.674692 -55.047365 71.895294 -55.540200 72.024370 -54.934717 72.221504 -54.826762 72.442107 -54.714114 72.646281 -54.559223 72.850456 -55.319598 73.019428 -55.385309 73.155545 -55.352453 73.305742 -55.451020 73.343291 -55.497957 73.446552 -55.662236 73.542772 -56.004874 73.664808 -55.817127 73.732866 -56.112828 73.941734 -56.300575 74.030914 -56.183233 74.249170 -56.643213 74.331309 -56.488322 74.397020 -56.248944 74.481506 -56.765248 74.669253 -57.042175 74.784248 -57.150129 74.892203 -57.910504 75.042400 -58.318853 75.293511 -58.530068 75.331061 -58.267223 75.528195 -58.398645 75.622068 -58.708428 75.697167 -58.891481 75.847365 -59.112083 75.877873 -59.224731 75.913076 # -b -54.348008 70.327608 -53.643957 70.247816 -53.193365 70.177411 # -b -54.526367 69.970889 -54.516980 70.290059 -54.348008 70.327608 # -b -70.097618 70.806363 -69.942727 70.822791 # -b -70.142208 70.590454 -69.546112 70.738304 -69.086133 70.653818 -68.490036 70.566985 -68.565135 70.367505 -68.851449 70.301793 -69.668148 70.151596 -69.203474 70.156289 -68.696558 70.095272 -68.809206 70.031907 # -b -68.708292 69.930993 -68.309330 70.184451 -67.450388 70.031907 -67.450388 70.031907 # -b -68.950016 77.264853 -68.856143 77.300055 -68.396163 77.384542 -67.682725 77.396276 -67.034999 77.396276 -66.462371 77.302402 -65.908518 77.224957 -66.687667 77.159245 -67.748436 77.231997 -68.649621 77.241385 -68.950016 77.264853 # -b -70.264244 77.227304 -69.231636 77.217916 -68.555748 77.185061 -68.227191 77.163939 -67.663950 77.199142 -66.593794 77.138124 -66.115039 77.156899 -65.655060 77.248425 -66.274624 77.335258 -66.274624 77.466681 -65.758320 77.567595 -66.011779 77.661468 -66.490533 77.635653 -66.462371 77.687283 -66.922351 77.663815 -67.663950 77.544126 -68.311677 77.607491 -68.602684 77.579329 -69.334897 77.485455 -69.644679 77.520658 # -b -70.118740 77.612185 -69.630598 77.727179 -69.996705 77.682590 # -b -70.109353 78.802030 -69.480401 78.827845 -69.086133 78.856007 -69.236330 78.914678 -69.020421 79.015592 -68.128624 79.081303 -67.678031 79.109465 -67.246214 79.147015 -66.964594 79.088344 -66.560938 79.097731 -66.204219 79.062529 -65.931986 79.161096 -65.509556 79.306600 -65.171612 79.407513 -64.843055 79.522508 -65.068351 79.675053 -65.124675 79.801782 -64.401850 79.841678 -64.833667 79.909736 -64.880604 79.982488 # -b -65.497822 80.022384 -66.164323 79.989529 -66.164323 79.989529 # -b -59.886539 75.913076 -60.665688 76.049192 -60.684463 75.992868 -60.909759 76.103170 -61.435450 76.133678 -62.101951 76.192349 -62.646417 76.201737 -63.406792 76.187656 -63.951257 76.192349 -64.430012 76.182962 -64.889991 76.103170 -65.584655 76.046846 -65.706690 76.241633 -66.204219 76.089089 -66.711135 76.215818 -66.908270 76.075008 -66.786234 75.903689 -67.584158 75.978787 -68.813900 76.152453 -69.527338 76.382443 -68.485343 76.551415 -68.560441 76.647635 -69.208168 76.668757 -69.884056 76.734468 # -b -70.008439 76.833035 -69.764368 77.006701 -69.923953 76.929256 # -b -79.384045 76.969152 -79.083650 77.053638 -79.524855 77.163939 -79.844025 77.161592 # -b -80.254721 77.224957 -79.353536 77.229650 -78.865395 77.276587 -78.611936 77.278934 -78.095633 77.424438 -77.776463 77.541779 -78.114407 77.647387 -78.198893 77.783504 -78.292767 77.853909 -78.114407 77.896152 -77.447906 77.886764 -76.950377 77.863296 -76.556109 77.950129 -76.077354 77.912579 -75.805121 78.006453 -75.683086 78.076858 -76.208777 78.102673 -76.649982 78.114407 -77.034863 78.166038 -76.537334 78.196546 -75.955319 78.166038 -75.645537 78.182465 -75.373304 78.262258 -75.307592 78.370212 -75.983481 78.424190 -76.302651 78.489901 -75.542276 78.485207 -75.007198 78.539184 -74.857000 78.604896 -74.800676 78.672954 -74.800676 78.722238 -74.857000 78.811417 -75.570438 78.881822 -76.312038 78.863048 -75.880220 78.935800 -76.011643 78.989777 -76.537334 78.985083 -77.316483 78.973349 -77.860949 78.898250 -77.879724 79.001511 -77.476068 79.010898 -76.678144 79.055488 -76.190002 79.076610 -76.903440 79.118853 -77.776463 79.118853 -77.382195 79.161096 -76.640595 79.186911 -75.917770 79.130587 -75.842671 79.041407 -75.232494 79.008551 -74.594155 79.008551 -74.688028 79.111812 -74.622317 79.210379 -75.429628 79.226807 -75.964706 79.222113 -76.537334 79.238541 -77.372807 79.212726 -77.457293 79.222113 -77.832787 79.269050 -77.823400 79.313640 -77.222610 79.306600 -77.419744 79.409860 -77.119349 79.353536 -76.462235 79.325374 -76.002256 79.344149 -76.452848 79.416901 -77.147511 79.445063 -77.091187 79.487306 -76.725081 79.470878 -76.096129 79.412207 -75.485952 79.372311 -75.129233 79.447410 -74.922711 79.423941 -74.237436 79.461491 -74.087238 79.522508 -73.617871 79.545977 -73.786843 79.705561 -74.857000 79.743111 -74.256210 79.787701 -73.542772 79.745458 -73.383188 79.644544 -73.017081 79.644544 -72.594651 79.649237 -72.162833 79.646891 # -b -72.160487 79.646891 -71.625408 79.719642 -71.531535 79.822903 -71.606633 79.905042 -71.165428 79.959020 # -b -72.247319 80.005956 -72.707299 79.998916 # -b -80.189010 75.173823 -79.747805 75.319327 -79.790048 75.464830 -79.987182 75.504727 -79.944939 75.535235 # -b -79.229154 76.046846 -79.294865 75.962359 -79.078957 75.814509 -79.491999 75.809815 -79.689134 75.767572 -79.848718 75.837977 -79.689134 75.950625 -79.529549 76.060927 -79.304253 76.075008 -79.229154 76.046846 # -b -79.703215 74.847613 -79.604648 74.943833 -79.792394 75.028319 -79.792394 75.028319 # -b -80.045853 74.817104 -79.792394 74.845266 -79.703215 74.847613 # -b -77.708405 69.942727 -77.952476 70.184451 -78.492248 70.247816 -79.285478 70.433216 -79.430982 70.318221 -78.886516 70.111699 # -b -80.144420 72.357621 -79.881574 72.315378 -79.463837 72.364661 -78.933453 72.303643 -78.689382 72.413945 -78.238790 72.658016 -77.201488 72.721380 -76.131332 72.559449 -75.436668 72.446800 -75.028319 72.193342 -74.751393 72.066613 -74.432223 71.827236 -75.070562 71.655917 -74.652825 71.627755 -73.582669 71.782646 -73.859595 71.606633 -73.836127 71.557350 -73.549813 71.357869 -73.286967 71.292158 -73.132076 71.547963 -72.658016 71.592552 -72.428026 71.648876 -71.442355 71.475211 -71.188897 71.134920 -72.127631 71.031659 -71.432968 70.928398 -70.649125 71.022272 -70.883808 70.689021 -70.306487 70.745345 -70.099965 70.806363 # -b -69.942727 70.822791 -70.440256 70.524742 -70.139861 70.590454 -70.139861 70.590454 # -b -80.320432 76.220511 -79.278437 76.434073 -78.583774 76.464582 -78.095633 76.631207 -78.283379 76.943337 -78.987430 76.793139 -79.325374 76.889359 -79.391086 76.969152 -79.391086 76.969152 # -b -78.963962 73.603790 -78.245830 73.615524 -77.330564 73.465327 -77.011395 73.279927 -76.537334 73.085140 -76.316732 72.925555 -76.635901 72.789438 -77.936048 72.866884 -78.996817 72.737808 -79.790048 72.754236 # -b -80.090442 73.664808 -78.963962 73.603790 -78.963962 73.603790 # -b -71.299198 76.999661 -71.158388 77.046597 -70.754732 77.131083 -70.266591 77.227304 -70.266591 77.227304 # -b -69.644679 77.520658 -70.029560 77.548820 -70.123434 77.612185 # -b -69.999051 77.682590 -70.468418 77.750648 -70.496580 77.830440 -71.322666 77.830440 -71.735709 77.919620 -72.205076 77.943088 -72.242626 78.013493 -72.702605 78.114407 -72.740155 78.191853 -72.486697 78.276339 -72.824641 78.344397 -72.646281 78.438271 -72.073654 78.546225 -71.529188 78.633058 -71.210018 78.635405 -70.928398 78.675301 -70.365158 78.757440 -70.111699 78.802030 # -b -69.888750 76.734468 -70.010786 76.833035 # -b -69.921606 76.929256 -70.850953 76.823648 -71.095023 76.933949 -71.432968 76.959764 -71.292158 77.004354 # -b -87.245943 80.050546 -87.114520 79.947285 -87.302267 79.893308 -87.030034 79.898002 -87.274105 79.740764 -87.621436 79.628116 -87.433690 79.623422 -87.161457 79.653931 -86.832900 79.698521 -86.485568 79.623422 -86.260272 79.541283 -86.335371 79.452103 -86.138237 79.461491 -86.081913 79.529549 -85.959877 79.599954 -85.781518 79.574139 -85.349700 79.447410 -85.190115 79.374658 -85.096242 79.276091 -85.330925 79.193951 -85.509285 79.158749 -86.372920 79.064875 -86.767188 78.978043 -86.983097 78.902944 -87.030034 79.001511 -87.208393 79.034367 -87.180231 78.900597 -87.536950 78.701116 -87.931219 78.661220 -88.137740 78.848967 -88.222226 78.931106 -88.184677 79.006205 -88.194064 79.055488 -88.391198 78.900597 -88.419360 78.736319 -88.287938 78.621324 -88.118965 78.478167 -88.250388 78.428883 -88.635269 78.527450 -88.823016 78.593162 -88.869953 78.461739 -88.560170 78.351438 -88.691593 78.158997 -89.076474 78.166038 -89.358094 78.297460 -89.489517 78.346744 -89.771137 78.400721 -89.968271 78.499288 # -b -90.080920 78.426536 -89.705426 78.281033 -89.433193 78.093286 -89.902560 78.227055 -89.902560 78.227055 # -b -88.637616 76.999661 -88.487419 77.013742 -88.431094 77.067719 -88.187024 77.058331 -88.008664 77.041904 -87.830305 77.077106 -87.680107 77.055985 -87.614396 77.088840 -87.473586 77.124043 -87.229515 77.140471 -87.004219 77.088840 -86.900958 77.138124 -87.229515 77.161592 -87.342163 77.194448 -87.135641 77.231997 -87.370325 77.253119 -87.041768 77.309443 -87.295226 77.330564 -87.680107 77.297709 -87.886629 77.384542 -87.867854 77.469028 -88.064988 77.525352 -88.355996 77.586369 -88.374770 77.670855 -88.393545 77.727179 -88.309059 77.769423 -87.924178 77.816359 -87.623783 77.860949 -87.295226 77.867990 -86.778923 77.835134 -86.365880 77.767076 -86.243844 77.694324 -85.924675 77.562901 -85.858963 77.478415 -85.746315 77.429131 -85.267561 77.382195 -84.901454 77.356380 -84.638609 77.290668 -84.497799 77.342299 -84.422700 77.386888 -83.972108 77.379848 -83.568452 77.365767 -83.746812 77.403316 -83.784361 77.450253 -83.465191 77.513617 -83.258670 77.586369 -83.023986 77.687283 -82.817465 77.792891 -82.686042 77.900845 -82.610943 77.978291 -82.507683 78.022881 -82.873789 77.954822 -82.995824 77.804625 -83.380705 77.623919 -83.784361 77.504230 -84.188017 77.499536 -84.544736 77.513617 -84.732482 77.506577 -84.939004 77.574635 -84.779419 77.645040 -84.770032 77.734220 -84.901454 77.635653 -85.126751 77.612185 -85.342659 77.638000 -85.408371 77.713098 -85.211237 77.790544 -85.352047 77.790544 -85.539794 77.785850 -85.492857 77.839828 -85.107976 77.844521 -84.957778 77.870336 -84.948391 77.903192 -85.333272 77.867990 -85.699378 77.842174 -85.887125 77.900845 -85.549181 77.985331 -85.173687 77.978291 -85.089201 78.015840 -85.201849 78.058083 -85.089201 78.109714 -84.760644 78.121448 -84.450862 78.114407 -84.141080 78.144916 -84.319439 78.151957 -84.779419 78.168384 -84.957778 78.201240 -84.779419 78.283379 -84.666771 78.335010 -84.892067 78.346744 -84.854518 78.454698 -84.713708 78.555612 -84.835743 78.501635 -84.976553 78.388987 -85.126751 78.248177 -85.427146 78.095633 -85.652442 78.088592 -85.896513 78.069817 -86.243844 78.058083 -86.300168 78.130835 -86.037323 78.229402 -85.934062 78.337357 -86.112421 78.295114 -86.243844 78.198893 -86.469140 78.187159 -86.656887 78.105020 -86.919733 78.088592 -87.295226 78.079205 -87.539297 78.093286 -87.370325 78.156650 -87.210740 78.170731 -87.501748 78.180119 -87.558072 78.227055 -87.595621 78.309195 -87.698882 78.379600 -87.539297 78.459392 -87.060543 78.522757 -87.191966 78.555612 -87.060543 78.677648 -86.816472 78.769174 -86.328330 78.778562 -85.586730 78.811417 -85.417758 78.886516 -85.136138 78.881822 -84.760644 78.846620 -84.141080 78.820805 -83.596614 78.750400 -83.192958 78.654179 -82.798690 78.588468 -82.404422 78.515716 -82.610943 78.647139 -82.301161 78.670607 -82.686042 78.682341 -82.939500 78.701116 -83.268057 78.738665 -83.202346 78.799683 -82.629718 78.780908 -82.244837 78.799683 -82.000766 78.764481 -81.888118 78.785602 -81.813019 78.832539 -81.766083 78.891210 -81.615885 78.959268 -81.981992 78.900597 -82.188513 78.853660 -82.479521 78.839579 -82.648493 78.841926 -83.108472 78.879476 -83.437029 78.888863 -83.953333 78.900597 -84.291277 78.909984 -84.629222 78.975696 -84.835743 78.994470 -84.835743 79.071916 -84.535348 79.076610 -84.075368 78.999164 -83.530903 78.978043 -83.512128 79.003858 -83.774974 79.060182 -84.037819 79.111812 -84.037819 79.198645 -84.291277 79.161096 -84.460249 79.217420 -84.507186 79.294865 -84.591672 79.407513 -85.023490 79.508427 -85.145525 79.576486 -85.239399 79.644544 -85.614892 79.703215 -85.952837 79.724336 -86.591176 79.818210 -86.609950 79.926164 -86.328330 79.970754 -85.680604 79.905042 -85.474082 79.923817 -86.046710 79.980141 -86.356492 79.998916 # -b -83.209386 80.005956 -82.683695 79.874534 -82.298814 79.783007 -82.167392 79.672706 -81.979645 79.616382 -81.970257 79.550670 -81.557214 79.578832 -81.050298 79.508427 -80.947037 79.515468 -80.806227 79.569445 -80.458896 79.592913 -80.064627 79.635156 -80.289923 79.653931 -80.618480 79.616382 -81.059685 79.616382 -81.378855 79.653931 -81.707412 79.700868 -81.810673 79.743111 -81.848222 79.848718 -81.782511 79.881574 -81.698025 79.919123 -81.923321 79.926164 -82.139230 79.954326 -82.495948 79.996569 # -b -79.846372 77.161592 -80.437774 77.039557 -80.409612 77.163939 -81.047951 77.199142 -81.911587 77.044250 -82.127495 77.217916 -81.310797 77.255466 -81.695678 77.393929 -81.160599 77.304749 -80.250027 77.224957 -80.250027 77.224957 # -b -90.125509 74.502628 -89.416765 74.615276 -89.627980 74.690375 -89.496558 74.758433 -89.243099 74.695068 -88.956786 74.742005 -88.778426 74.767820 -88.745570 74.594155 -88.754958 74.479160 -88.346608 74.479160 -87.952340 74.436917 -87.576847 74.528443 -87.281145 74.446304 -86.783616 74.467425 -86.849328 74.509669 -86.384654 74.570686 -86.121809 74.450998 -85.689991 74.652825 -85.337966 74.479160 -85.159606 74.636398 -85.126751 74.617623 -84.577591 74.504975 -83.695181 74.556605 -83.573146 74.788942 -83.892315 74.892203 -83.408867 74.800676 -83.188265 74.603542 -82.648493 74.504975 -82.404422 74.488547 -81.752002 74.509669 -81.193455 74.558952 -80.817961 74.558952 -80.531647 74.584767 -80.287577 74.725577 -80.320432 74.788942 -80.663070 74.983729 -80.287577 75.108111 -80.189010 75.173823 # -b -79.944939 75.535235 -80.564503 75.530542 -80.418999 75.624415 -80.728782 75.678392 -81.240392 75.687780 -81.306103 75.791040 -81.568949 75.833284 -81.813019 75.854405 -82.118108 75.781653 -82.334017 75.762878 -82.441971 75.786347 -82.596862 75.814509 -82.840933 75.713595 -83.014599 75.640843 -83.324381 75.652577 -83.652938 75.596253 -83.634163 75.504727 -83.873541 75.551663 -84.305358 75.537582 -84.591672 75.497686 -84.042513 75.399119 -84.385151 75.380344 -84.901454 75.345142 -85.131444 75.319327 -84.910842 75.387385 -85.441227 75.462484 -85.751009 75.563397 -86.037323 75.462484 -86.178133 75.523501 -86.501996 75.462484 -86.764842 75.431975 -86.877490 75.554010 -87.008912 75.596253 -87.295226 75.596253 -87.248290 75.431975 -87.548684 75.516461 -87.891322 75.525848 -88.046214 75.511767 -88.163555 75.535235 -87.778674 75.589213 -87.694188 75.744104 -87.858467 75.767572 -87.910097 75.765225 # -b -90.059798 75.784000 -89.956537 75.849711 -89.956537 75.849711 # -b -90.268666 76.107863 -89.517679 76.121944 -89.386256 76.283876 -89.714813 76.272142 -89.958884 76.283876 # -b -79.792394 75.028319 -80.224212 74.962608 -80.496445 74.932099 -80.191356 74.807717 -80.045853 74.817104 # -b -80.165541 69.968543 -80.273496 70.001398 # -b -80.519913 69.968543 -81.435179 70.088231 -81.777817 70.027213 # -b -84.854518 69.980277 -85.624280 70.027213 -85.624280 70.027213 # -b -85.582037 69.970889 -86.595869 70.257203 -87.135641 70.273631 -87.919484 70.266591 -88.346608 70.405054 -89.308811 70.787588 -89.529413 71.050434 -88.581292 70.954213 -87.454811 70.956560 -87.886629 71.132573 -89.041272 71.242874 -89.956537 71.308585 # -b -90.125509 71.651223 -89.947150 71.761525 # -b -90.069185 72.054879 -89.970618 72.169874 -89.970618 72.169874 # -b -90.048064 72.367008 -89.738282 72.606385 -89.320545 72.747195 -89.254834 72.967798 -89.179735 73.181360 -88.837097 73.298702 -88.109578 73.603790 -87.170844 73.761028 -86.166399 73.810312 -85.504591 73.791537 -85.110323 73.735213 # -b -85.107976 73.735213 -85.173687 73.624912 -85.887125 73.371453 -86.408123 73.012388 -86.802391 72.613426 -86.581788 72.190995 -86.178133 71.752137 -85.525713 71.468170 -85.061039 71.313279 -85.502244 71.252261 -86.042016 71.186550 -86.717905 71.001150 -86.042016 71.085636 -85.295723 71.141960 -85.061039 71.127879 -85.061039 70.926051 -84.873292 71.245221 -84.821662 71.418887 -85.075120 71.627755 -85.713459 71.862438 -85.877738 72.017330 -85.549181 72.228545 -85.028184 72.268441 -85.107976 72.367008 -85.746315 72.517205 -85.835495 72.876271 -85.084508 72.899740 -84.356989 72.737808 -84.831049 72.892699 -85.614892 73.049937 -85.337966 73.101567 -84.277196 73.003000 -84.521267 73.082793 -85.117363 73.317476 -84.464943 73.207175 -84.258422 73.446552 -83.784361 73.286967 -83.648244 73.566241 -82.869095 73.695317 -81.906893 73.704704 -81.367121 73.577975 -81.268554 73.312783 -81.137131 73.188400 -80.728782 72.988919 -80.728782 72.796479 -80.564503 72.606385 -80.850817 72.284869 -80.860204 72.155793 -81.005708 72.085388 -81.005708 71.902335 -80.395531 72.200383 -80.142073 72.357621 -80.142073 72.357621 # -b -88.553130 76.999661 -88.862912 76.938643 -89.501251 76.828342 -89.585737 76.628861 -89.623287 76.509172 -89.210244 76.384790 -88.881687 76.450501 -88.787813 76.628861 -88.665778 76.692225 -88.628229 76.441114 -88.252735 76.370709 -87.867854 76.347240 -87.755206 76.483357 -87.323388 76.344894 -86.797697 76.459888 -86.675662 76.448154 -86.459753 76.321425 -86.788310 76.567843 -86.769535 76.363668 -86.215682 76.302651 -85.586730 76.255714 -84.920229 76.239286 -85.201849 76.415299 -85.023490 76.396524 -84.460249 76.603045 -83.652938 76.382443 -83.596614 76.675797 -83.343156 76.560802 -82.892564 76.342547 -82.272999 76.481010 -82.498295 76.614780 -82.141576 76.499785 -81.531399 76.450501 -81.033870 76.394177 -81.231004 76.180615 -80.320432 76.220511 -80.320432 76.220511 # -b -79.792394 72.754236 -80.242987 73.071059 -80.773371 73.223603 -80.871939 73.470021 -80.477670 73.702357 -80.092789 73.664808 # -b -99.944668 71.871826 -99.986911 71.881213 # -b -100.000992 73.120342 -99.935280 73.106261 -99.888344 73.129729 # -b -100.090171 73.885410 -99.813245 73.782150 -99.437751 73.723479 -99.020015 73.711745 -98.489630 73.732866 -98.104749 73.815005 -97.804354 73.852555 -97.442941 73.880717 -97.175402 73.753988 -97.100303 73.624912 -97.320906 73.547466 -97.518040 73.495836 -97.630688 73.462980 -97.306825 73.446552 -97.288050 73.312783 -97.715174 73.270540 -97.968632 73.164932 -98.278415 73.031162 -98.433306 72.925555 -98.259640 72.918514 -97.597833 72.986573 -97.344374 72.899740 -97.353762 72.834028 -97.255195 72.763623 -97.076835 72.683831 -97.123772 72.585264 -96.701341 72.695565 -96.569919 72.669750 -96.471352 72.533633 -96.438496 72.357621 -96.701341 72.291909 -96.546450 72.174568 -96.677873 72.007942 -96.504207 71.961006 -96.569919 71.796727 -96.912557 71.672345 -97.574364 71.601940 -98.090668 71.601940 -97.917002 71.475211 -98.222091 71.343788 -98.531873 71.259302 -98.700845 71.362563 -99.038789 71.308585 -99.184293 71.508066 -99.395508 71.693466 -99.813245 71.820195 -99.944668 71.871826 # -b -96.680220 72.974838 -96.670833 72.986573 -96.717769 73.117995 -97.069795 73.120342 -97.144893 72.970145 -96.825724 72.897393 -96.680220 72.974838 -96.680220 72.974838 # -b -98.665642 73.800924 -98.501364 73.824393 -98.083627 73.913572 -97.872412 74.073157 -98.459121 74.028567 -99.031749 73.941734 -99.440098 73.850208 -99.285207 73.824393 -98.989506 73.831433 -98.811146 73.812658 -98.665642 73.800924 # -b -96.393906 69.952115 -96.628590 70.156289 -96.614509 70.386279 -96.375131 70.477806 -96.196772 70.569332 -96.065349 70.656165 -96.318807 70.766466 -96.440843 70.968294 -96.375131 71.052780 -96.342276 71.210018 -96.173304 71.273383 -95.999638 71.378990 -95.657000 71.235834 -95.525577 71.341441 -95.788423 71.503373 -95.666387 71.658264 -95.337830 71.806114 -95.117228 71.949271 -95.037435 71.953965 # -b -96.410334 75.633803 -96.565225 75.584519 -96.630936 75.497686 -96.696648 75.450749 -96.950106 75.413200 -97.104997 75.500033 -96.950106 75.589213 -96.640324 75.638496 -96.452577 75.720635 -96.278911 75.657271 -96.124020 75.579825 -96.354010 75.539929 -96.508901 75.633803 -96.508901 75.633803 # -b -97.689359 76.002256 -97.689359 75.955319 -97.773845 75.861446 -97.877106 75.800428 -97.623648 75.767572 -97.520387 75.654924 -97.534468 75.490646 -97.543855 75.471871 -97.731602 75.626762 -98.017916 75.633803 -97.928736 75.579825 -97.985060 75.556357 -98.116483 75.523501 -98.017916 75.469524 -98.083627 75.408506 -98.261987 75.408506 -98.182194 75.342795 -98.008529 75.253615 -97.905268 75.143314 -98.196275 75.227800 -98.261987 75.157395 -98.158726 75.049441 -98.632787 75.030666 -98.844002 75.023625 -99.008280 75.089337 -99.252351 75.033013 -99.397855 75.051787 -99.552746 75.122192 -99.773349 74.997810 -99.773349 74.997810 # -b -100.062009 75.518808 -99.860182 75.518808 -99.850794 75.549316 # -b -100.050275 75.593906 -99.754574 75.657271 -99.731106 75.725329 -99.477647 75.741757 -99.482341 75.765225 -99.745187 75.751144 -99.843754 75.734716 -99.843754 75.734716 # -b -100.083131 75.978787 -99.735799 76.004602 -99.970483 76.042152 -99.970483 76.042152 # -b -100.094865 76.204083 -99.935280 76.204083 # -b -100.029154 76.645288 -99.766308 76.661716 -99.559787 76.600699 -99.400202 76.563149 -99.146744 76.542028 -99.118582 76.471623 -98.883898 76.481010 -98.958997 76.600699 -98.611665 76.614780 -98.724313 76.675797 -98.508405 76.687532 -98.170460 76.593658 -98.339432 76.579577 -97.982713 76.551415 -97.766805 76.431726 -97.823129 76.307344 -97.644769 76.166534 -97.719868 76.053886 -97.691706 76.002256 # -b -95.065597 77.933701 -95.290894 77.943088 -95.750873 77.893805 -96.295339 77.877377 -96.595734 77.875030 -96.614509 77.842174 -96.736544 77.792891 -97.177749 77.792891 -97.065101 77.898498 -97.403045 77.987678 -97.750377 78.062777 -97.468757 78.116754 -96.755319 78.140222 -97.027552 78.198893 -97.543855 78.234096 -97.909962 78.278686 -97.872412 78.283379 -97.985060 78.342050 -98.013222 78.471126 -98.360554 78.572040 -98.125870 78.602549 -98.219744 78.691729 -98.294843 78.827845 -98.154032 78.893557 -97.609567 78.905291 -97.027552 78.839579 -96.642671 78.764481 -96.173304 78.698769 -96.041881 78.616630 -95.966782 78.539184 -95.525577 78.557959 -95.084372 78.494595 -94.952949 78.438271 -94.783977 78.360825 -94.990499 78.306848 -94.999886 78.128488 -94.859076 78.097979 -94.802752 78.013493 -94.943562 77.926660 -95.065597 77.933701 # -b -100.029154 78.724584 -99.841407 78.698769 -99.681822 78.637751 -99.869569 78.532144 -99.907118 78.433577 -99.803858 78.365519 -99.494075 78.252871 -99.118582 78.112060 -99.203068 77.980638 -99.372040 77.867990 -99.935280 77.835134 -99.935280 77.835134 # -b -98.341779 80.027078 -98.238518 79.919123 -98.238518 79.787701 -98.360554 79.653931 -98.632787 79.668012 -98.886245 79.768926 -99.167865 79.834637 -99.533971 79.862799 -99.533971 79.959020 -99.533971 79.959020 # -b -89.970618 78.499288 -90.195915 78.553265 -90.083266 78.426536 # -b -89.904907 78.227055 -90.411823 78.231749 -90.618345 78.241136 -90.317950 78.184812 -90.177140 78.072164 -90.806092 78.069817 -91.266071 78.102673 -91.660340 78.147263 -92.092157 78.201240 -92.214193 78.248177 -92.204805 78.295114 -92.355003 78.255217 -92.523975 78.295114 -92.833757 78.386640 -92.768046 78.438271 -92.401940 78.457045 -91.923185 78.468779 -91.650952 78.496941 -91.960735 78.506329 -92.345615 78.553265 -92.664785 78.569693 -92.899469 78.553265 -93.105990 78.614283 -93.293737 78.679995 -93.105990 78.722238 -92.739884 78.752746 -93.115377 78.804377 -93.519033 78.825498 -93.772491 78.959268 -93.274962 79.027326 -92.918243 79.125893 -92.458264 79.132934 -91.848086 79.142321 -91.068937 79.184564 -90.383661 79.200992 -90.186527 79.271397 -90.665282 79.238541 -91.359945 79.198645 -91.791762 79.198645 -92.054608 79.205686 -92.270517 79.264356 -91.895023 79.276091 -91.106487 79.308946 -91.284846 79.332415 -91.895023 79.315987 -92.110932 79.377005 -92.420714 79.388739 -92.589686 79.330068 -92.908856 79.308946 -92.852532 79.412207 -93.021504 79.358230 -93.228025 79.292518 -93.556582 79.226807 -93.734942 79.283131 -93.528420 79.353536 -93.594132 79.369964 -93.781879 79.393432 -94.101048 79.369964 -94.110436 79.318334 -94.467154 79.266703 -94.683063 79.287825 -94.767549 79.346496 -94.842648 79.384045 -95.002233 79.365270 -95.114881 79.381698 -95.377726 79.416901 -95.368339 79.503734 -95.002233 79.501387 -94.814486 79.510774 -94.373281 79.538936 -93.903914 79.583526 -93.819428 79.649237 -94.044724 79.616382 -94.326344 79.597607 -94.748775 79.618729 -95.077332 79.621075 -95.302628 79.642197 -95.649959 79.733724 -95.922192 79.818210 -96.072390 79.867493 -95.621797 79.898002 -96.016066 79.933204 -96.081777 79.973101 # -b -94.823873 80.003610 -94.730000 79.989529 # -b -94.349813 80.003610 -94.049418 79.949632 -94.068192 79.970754 # -b -95.065597 77.738914 -94.924787 77.720139 -94.652554 77.755341 -94.483582 77.734220 -94.164413 77.717792 -93.929729 77.694324 -93.666884 77.720139 -93.516686 77.696671 -93.272615 77.656774 -93.347714 77.593410 -93.441587 77.551167 -93.469750 77.461987 -93.526074 77.396276 -93.741982 77.398623 -93.967279 77.400969 -94.305223 77.419744 -94.596230 77.429131 -94.802752 77.443212 -94.999886 77.412704 -95.056210 77.433825 -95.572514 77.452600 -96.060655 77.548820 -96.192078 77.633306 -95.797810 77.731873 -95.553739 77.792891 -95.290894 77.745954 -95.065597 77.738914 # -b -94.999886 76.211124 -94.859076 76.243980 -94.286448 76.211124 -93.817081 76.215818 -93.873405 76.279182 -93.648109 76.288570 -93.422813 76.356628 -93.075481 76.180615 -92.840798 75.950625 -92.531015 75.863792 -92.286945 75.605641 -92.653051 75.373304 -92.638970 75.237187 -92.286945 75.131580 -92.014712 75.098724 -92.352656 74.974342 -92.268170 74.784248 -91.892676 74.718537 -91.859821 74.643438 -91.418616 74.631704 -91.141689 74.795982 -91.198013 74.709149 -90.953942 74.617623 -90.723952 74.608236 -90.400089 74.544871 -90.127856 74.502628 -90.127856 74.502628 # -b -89.937763 75.765225 -90.059798 75.784000 # -b -89.958884 75.849711 -90.193568 75.929504 -90.475188 75.903689 -90.681709 75.917770 -90.953942 75.915423 -91.413922 75.755838 -91.198013 75.894301 -90.878844 75.960013 -90.728646 76.009296 -91.019654 76.035111 -91.160464 76.084395 -91.714317 76.124291 -91.629831 76.201737 -91.066590 76.126638 -90.512737 76.072661 -90.268666 76.107863 -90.268666 76.107863 # -b -89.958884 76.283876 -90.324990 76.335506 -90.681709 76.342547 -91.000879 76.403564 -91.263724 76.429380 -91.629831 76.462235 -91.310661 76.466929 -91.019654 76.462235 -90.559674 76.441114 -90.709871 76.551415 -91.188626 76.631207 -91.498408 76.671104 -91.714317 76.682838 -92.089810 76.649982 -92.606114 76.614780 -93.056707 76.596005 -93.347714 76.518559 -93.591785 76.427033 -93.704433 76.450501 -93.582398 76.539681 -93.469750 76.671104 -93.497912 76.802526 -93.807694 76.945683 -94.155025 76.931602 -94.399096 76.908134 -94.746428 76.994967 -94.999886 76.211124 -95.253344 76.354281 -95.600676 76.391830 -96.107592 76.586618 -96.323501 76.654676 -96.567572 76.678144 -96.896129 76.722734 -96.961840 76.816607 -96.623896 76.781405 -96.361050 76.793139 -96.454924 76.818954 -96.867967 76.896400 -96.896129 76.992620 -96.520635 77.009048 -96.088818 77.086493 -95.572514 77.081800 -95.168858 77.025476 -94.999886 77.030169 # -b -94.999886 75.657271 -94.873157 75.619722 -94.281754 75.511767 -94.079927 75.420241 -93.826468 75.340448 -93.587091 75.234841 -93.596479 75.126886 -93.652803 75.023625 -93.563623 74.763127 -93.793613 74.636398 -94.488276 74.636398 -94.952949 74.704456 -95.051516 74.711496 -95.150083 74.772514 -95.328443 74.819451 -95.427010 74.781901 -95.581901 74.812410 -95.666387 74.873428 -95.901071 74.861694 -96.055962 74.990770 -96.088818 75.056481 -96.276564 74.957914 -96.506554 75.126886 -96.407987 75.216066 -96.295339 75.279430 -95.957395 75.305246 -95.901071 75.349835 -95.957395 75.429628 -95.802504 75.457790 -96.121673 75.457790 -95.722711 75.469524 -95.722711 75.582172 -95.337830 75.666658 -95.084372 75.690127 # -b -95.070291 74.073157 -94.835608 74.110707 -94.338079 74.091932 -93.488524 74.171724 -92.897122 74.110707 -92.742231 74.094279 -92.310413 73.955815 -92.047567 74.019180 -91.723704 74.019180 -91.216788 73.993365 -90.569061 73.915919 -90.348459 73.871329 -90.536206 73.692970 -90.874150 73.568588 -91.141689 73.540426 -91.094752 73.416043 -91.230869 73.272886 -91.428003 73.197788 -91.723704 72.951370 -91.902064 72.857497 -92.366737 72.704952 -92.840798 72.723727 -93.291390 72.796479 -93.929729 72.749542 -94.248899 72.714340 -93.896874 72.672097 -93.521380 72.460881 -93.699739 72.357621 -93.962585 72.256707 -94.150332 72.146406 -94.173800 72.078347 -94.427258 72.007942 -94.727653 72.005595 -94.990499 71.986821 -95.004580 72.014983 -95.225182 72.029064 -94.952949 72.144059 -95.215795 72.183955 -95.225182 72.406904 -94.938868 72.559449 -95.281506 72.557102 -95.525577 72.653322 -95.591288 72.754236 -95.689856 72.911474 -95.680468 73.047590 -95.600676 73.134423 -95.624144 73.235337 -95.657000 73.406656 -95.666387 73.589709 -95.713324 73.700010 -95.511496 73.793884 -95.290894 73.742253 -95.150083 73.707051 -94.859076 73.624912 -94.713572 73.667155 -94.990499 73.730519 -95.037435 73.840820 -95.272119 73.866636 -95.403542 73.955815 -95.281506 74.044995 -95.070291 74.073157 # -b -94.999886 71.937537 -94.877851 71.939884 -94.507051 71.895294 -94.624392 71.775606 -94.450727 71.714588 -94.216043 71.773259 -93.732595 71.747444 -93.709127 71.529188 -93.159967 71.336747 -92.939365 71.104411 -92.948752 70.848606 -92.793861 70.785241 -92.474691 70.667899 -92.333881 70.588107 -92.146134 70.400360 -92.066342 70.273631 -91.911451 70.341689 -91.747173 70.193839 -91.573507 70.121087 -91.892676 70.102312 -92.333881 70.175064 -92.441836 70.107006 -92.155522 70.050682 -92.155522 70.050682 # -b -89.958884 71.308585 -90.113775 71.529188 -90.127856 71.651223 # -b -89.949497 71.761525 -90.071532 72.054879 -90.071532 72.054879 # -b -89.970618 72.169874 -90.045717 72.367008 # -b -110.068914 72.540674 -109.979735 72.564142 # -b -110.003203 72.653322 -109.914023 72.695565 # -b -110.068914 72.974838 -109.824844 72.890352 -109.627709 72.859843 -109.341395 72.747195 -109.120793 72.707299 -109.041001 72.625160 -108.712444 72.524246 -108.712444 72.294256 -108.566940 72.106509 -108.383887 71.984474 -108.402661 71.796727 -108.304094 71.728669 -108.027168 71.655917 -107.886358 71.721628 -107.576575 71.855398 -107.534332 71.961006 -107.684530 72.132325 -107.853502 72.327112 -107.830034 72.397517 -107.905132 72.564142 -107.961456 72.711993 -108.125735 72.911474 -108.149203 73.024122 -108.271239 73.150851 -107.975537 73.209522 -108.083492 73.308089 -107.830034 73.322170 -107.553107 73.270540 -107.003948 73.160238 -106.891300 73.190747 -107.022722 73.270540 -106.736408 73.254112 -106.548662 73.200135 -106.384383 73.075752 -105.943178 72.995960 -105.703801 72.918514 -105.525442 72.841069 -105.445649 72.737808 -105.337695 72.655669 -105.304839 72.510165 -105.215659 72.411598 -105.159335 72.327112 -105.093624 72.151099 -105.018525 71.993861 -104.929345 71.862438 -104.511609 71.674692 -104.445897 71.540922 -104.380186 71.400112 -104.544464 71.308585 -104.600789 71.153694 -104.267538 71.015231 -103.981224 70.839218 -103.638586 70.768813 -103.394515 70.632697 -103.089427 70.583413 -102.943923 70.679634 -102.681077 70.566985 -102.183548 70.405054 -101.587452 70.308834 -101.512353 70.158636 -101.179103 70.151596 -100.902176 70.092925 -100.859933 70.013132 # -b -104.973935 73.080446 -104.734558 73.261152 -104.589054 73.519304 -104.753333 73.608484 -105.250862 73.742253 -105.804715 73.725826 -106.433667 73.723479 -106.818548 73.589709 -106.982826 73.441859 -106.583864 73.387881 -106.245920 73.279927 -105.959606 73.160238 -105.739004 73.014735 -105.363510 72.883312 -105.218006 72.927902 -104.988016 73.047590 -104.973935 73.080446 # -b -99.989258 71.881213 -100.191085 72.007942 -100.444544 72.106509 -100.716776 72.137018 -101.017171 72.153446 -101.500619 72.228545 -101.711834 72.345887 -102.120184 72.477309 -102.429966 72.641588 -102.340786 72.899740 -101.941824 72.953717 -101.655510 72.876271 -101.580412 72.796479 -101.280017 72.747195 -101.139207 72.604038 -100.641678 72.648628 -100.388219 72.653322 -100.275571 72.773011 -100.111293 72.805866 -100.101906 72.934942 -100.313121 72.998307 -100.430463 73.146157 -100.101906 73.146157 -100.003339 73.120342 # -b -99.890690 73.129729 -100.289652 73.303395 -100.552498 73.207175 -101.040640 73.251765 -101.369197 73.427778 -100.984316 73.484102 -100.632290 73.380841 -100.651065 73.526345 -100.993703 73.585015 -101.228386 73.653074 -100.885749 73.761028 -100.486787 73.735213 -100.191085 73.690623 -100.299040 73.772762 -100.275571 73.864289 -100.092518 73.885410 # -b -99.775696 74.997810 -100.446890 75.025972 -100.587700 75.112805 -100.667493 75.225453 -100.390566 75.241881 -100.291999 75.279430 -100.348323 75.349835 -100.723817 75.373304 -100.554845 75.422587 -100.620556 75.467177 -100.179351 75.495339 -100.062009 75.518808 # -b -99.850794 75.549316 -100.202819 75.549316 -100.047928 75.593906 # -b -99.841407 75.734716 -100.310774 75.706554 -100.611169 75.694820 -101.010131 75.650230 -101.502966 75.647884 -101.789280 75.626762 -102.211710 75.577478 -102.507412 75.537582 -102.826581 75.636149 -102.699852 75.683086 -102.390070 75.722982 -102.174161 75.739410 -102.343133 75.795734 -101.948865 75.898995 -101.610921 75.828590 -101.179103 75.795734 -101.319913 75.802775 -101.507660 75.896648 -101.432561 76.016337 -101.873766 75.997562 -102.023964 76.168881 -102.221098 76.222858 -102.136612 76.375402 -101.995802 76.455195 -101.639083 76.462235 -101.423174 76.450501 -101.376237 76.405911 -101.197878 76.363668 -101.207265 76.288570 -100.812997 76.164187 -100.625250 76.138372 -100.625250 76.091435 -100.137108 75.990521 -100.099559 75.978787 # -b -99.972830 76.042152 -100.235675 76.192349 -100.094865 76.204083 # -b -99.939974 76.204083 -100.446890 76.227552 -100.334242 76.288570 -100.259144 76.342547 -100.719123 76.384790 -101.075842 76.499785 -100.794222 76.600699 -100.296693 76.657023 -100.033847 76.645288 # -b -100.050275 78.736319 -100.069050 78.731625 -100.031501 78.724584 # -b -99.939974 77.835134 -100.259144 77.849215 -100.681574 77.914926 -100.869321 78.039309 -100.869321 78.126141 -101.075842 78.222362 -101.376237 78.203587 -101.554597 78.271645 -102.042738 78.297460 -102.643528 78.271645 -102.859437 78.384293 -103.432065 78.325622 -103.816946 78.278686 -104.070404 78.245830 -104.605482 78.306848 -104.830778 78.363172 -104.980976 78.461739 -104.896490 78.550919 -104.445897 78.553265 -103.901432 78.518063 -103.535325 78.548572 -103.816946 78.604896 -103.807558 78.656526 -103.507163 78.764481 -103.741847 78.757440 -103.901432 78.783255 -104.229989 78.757440 -104.192439 78.832539 -104.061016 78.870088 -104.154890 78.971002 -104.530383 78.935800 -104.736905 78.816111 -105.056075 78.806724 -104.943426 78.874782 -104.802616 78.956921 -105.027913 79.022632 -105.638090 78.989777 -105.703801 79.076610 -105.713188 79.186911 -105.544216 79.294865 -104.802616 79.297212 -104.220601 79.348843 -103.779396 79.294865 -103.629199 79.278437 -103.328804 79.189258 -103.385128 79.020286 -103.141057 78.954574 -103.065958 79.088344 -102.718627 79.198645 -102.239872 79.165789 -101.883153 79.060182 -101.695407 79.095384 -101.601533 78.938146 -101.451336 78.870088 -101.141554 78.914678 -100.784835 78.926412 -100.493827 78.893557 -100.249756 78.830192 -100.287306 78.738665 -100.071397 78.745706 -100.052622 78.736319 # -b -101.991108 77.947782 -101.765812 77.966557 -101.089923 77.790544 -101.718875 77.760035 -102.319665 77.795238 -102.610672 77.912579 -102.113143 77.950129 -101.991108 77.947782 # -b -105.023219 77.572288 -104.966895 77.461987 -104.769761 77.426785 -104.572627 77.365767 -104.356718 77.323524 -104.450591 77.271893 -104.272232 77.199142 -104.582014 77.109962 -105.135867 77.170980 -105.351776 77.300055 -105.605234 77.443212 -105.699107 77.544126 -105.839917 77.668509 -105.971340 77.764729 -105.577072 77.738914 -105.173416 77.633306 -105.023219 77.572288 -105.023219 77.572288 # -b -104.009386 76.603045 -103.896738 76.628861 -103.586956 76.523253 -103.173913 76.450501 -103.202075 76.356628 -103.662054 76.316732 -104.131422 76.319078 -104.103259 76.351934 -104.375492 76.394177 -104.413042 76.499785 -104.572627 76.504478 -104.694662 76.556109 -104.544464 76.628861 -103.999999 76.673450 -103.999999 76.614780 -104.009386 76.603045 # -b -101.021865 76.739162 -100.749632 76.764977 -100.674533 76.687532 -101.322260 76.563149 -101.688366 76.581924 -101.294098 76.680491 -101.021865 76.739162 -101.021865 76.739162 # -b -103.028409 76.323772 -102.925148 76.323772 -102.577817 76.248673 -102.859437 76.114904 -103.516551 76.060927 -103.995305 76.058580 -104.145503 76.058580 -104.464672 76.140719 -104.417735 76.239286 -103.723072 76.272142 -103.225543 76.321425 -103.028409 76.323772 # -b -103.049531 76.070314 -102.777298 76.100823 -102.392417 76.079701 -102.730361 75.983481 -103.500123 75.922463 -103.931941 75.906035 -103.753581 75.976440 -103.199728 76.051539 -103.049531 76.070314 # -b -103.061265 75.917770 -102.864131 75.955319 -102.422926 75.995215 -102.122531 75.950625 -102.526186 75.842671 -102.742095 75.784000 -103.136363 75.748797 -103.399209 75.805121 -103.145751 75.908382 -103.061265 75.917770 # -b -104.086832 75.446056 -103.955409 75.420241 -103.777049 75.284124 -103.791130 75.103418 -104.471713 75.075256 -104.903530 75.180863 -104.640685 75.373304 -104.232335 75.453096 -104.086832 75.446056 # -b -110.043099 76.506825 -109.705155 76.556109 -109.564345 76.682838 -109.357823 76.816607 -108.794583 76.854157 -108.531737 76.743856 -108.728872 76.649982 -108.597449 76.532640 -108.512963 76.431726 -108.128082 76.347240 -108.137469 76.262754 -108.325216 76.164187 -108.578674 76.098476 -108.362765 76.072661 -108.043596 76.082048 -107.696264 76.032765 -107.696264 75.936544 -108.024821 75.847365 -107.799525 75.896648 -107.330158 75.920116 -107.086087 75.861446 -106.870178 75.704208 -106.682431 75.814509 -106.851403 75.969400 -106.475910 76.053886 -106.091029 76.032765 -105.565338 75.849711 -105.443302 75.706554 -105.673292 75.530542 -105.781247 75.331061 -105.978381 75.155048 -106.288163 75.072909 -106.565090 75.037706 -107.217510 74.943833 -107.644634 75.009544 -107.776056 75.098724 -108.118694 74.971995 -108.681935 74.979036 -108.583368 75.035360 -108.780502 75.122192 -109.090284 75.009544 -109.508021 74.925058 -109.949226 74.887509 # -b -110.064221 75.577478 -109.148955 75.535235 -108.914271 75.622068 -108.975289 75.767572 -109.092631 75.849711 -109.294459 75.906035 -109.341395 75.936544 -109.102018 76.039805 -109.205279 76.206430 -109.407107 76.253367 -109.449350 76.262754 # -b -110.075955 78.093286 -109.869433 77.964210 -109.963307 77.929007 # -b -110.019631 78.604896 -109.738011 78.574387 -109.550264 78.478167 -109.503327 78.377253 -109.935145 78.290420 -109.935145 78.290420 # -b -120.017148 72.230892 -119.665123 72.294256 -119.355341 72.406904 -119.237999 72.564142 -118.848425 72.740155 -118.397832 72.838722 -117.726637 72.986573 -117.337063 73.054631 -116.942794 73.162585 -116.356086 73.279927 -115.849169 73.355026 -115.652035 73.401962 -115.389190 73.521651 -115.661422 73.655421 -116.060384 73.770415 -116.656481 73.955815 -116.952182 74.073157 -117.416855 74.218661 -117.989483 74.284372 -118.562111 74.277332 -119.026784 74.171724 -119.026784 74.030914 -119.158207 74.098972 -119.191063 74.216314 -119.557169 74.195193 -119.754303 74.080198 -119.852870 74.152950 -119.777771 74.242129 -119.909194 74.265598 # -b -117.369918 69.952115 -117.041362 70.092925 -115.994673 70.226694 -115.253073 70.285365 -114.624121 70.327608 -113.976395 70.311180 -113.014192 70.271284 -112.554213 70.252510 -112.418096 70.367505 -112.098927 70.374545 -112.366466 70.491887 -112.807671 70.557598 -113.291119 70.599841 -113.666613 70.656165 -113.943539 70.686674 -114.436375 70.653818 -114.858805 70.609229 -115.389190 70.555251 -115.652035 70.569332 -116.126096 70.599841 -116.609544 70.609229 -117.238496 70.660859 -117.590521 70.674940 -117.834592 70.733611 -118.111518 70.869727 -118.144374 71.078596 -117.557665 71.202978 -116.928713 71.259302 -116.290374 71.357869 -116.069772 71.341441 -115.774071 71.400112 -116.027529 71.435314 -115.675504 71.482251 -115.717747 71.536228 -116.323230 71.486945 -116.844227 71.447049 -117.318288 71.414193 -117.571746 71.463477 -117.571746 71.397765 -117.834592 71.397765 -118.252328 71.390725 -118.111518 71.519801 -117.834592 71.569084 -117.956627 71.651223 -118.454156 71.599593 -118.717002 71.655917 -118.970460 71.686426 -118.970460 71.961006 -118.618435 72.113550 -118.120906 72.223851 -118.200698 72.334152 -118.496399 72.371702 -118.233554 72.625160 -117.515422 72.857497 -116.844227 72.993613 -116.388941 73.115648 -115.792845 73.190747 -114.891661 73.326864 -114.483311 73.336251 -114.295564 73.242378 -114.107818 73.066365 -114.117205 72.850456 -114.426987 72.765970 -114.483311 72.674443 -114.746157 72.615773 -114.417600 72.620466 -114.065575 72.681484 -113.844972 72.648628 -113.708856 72.770664 -113.455397 72.951370 -113.347443 73.012388 -112.906238 72.988919 -112.455646 72.918514 -111.859550 72.812907 -111.502831 72.747195 -111.305696 72.580570 -111.638947 72.430373 -111.990972 72.315378 -111.723433 72.334152 -111.493443 72.423332 -111.315084 72.420985 -111.418345 72.345887 -111.197742 72.322418 -111.061626 72.451494 -110.808167 72.564142 -110.620421 72.559449 -110.413899 72.554755 -110.291864 72.503124 -110.226152 72.559449 -110.160441 72.559449 -110.071261 72.540674 # -b -109.982081 72.564142 -110.235540 72.665056 -110.113504 72.681484 -110.005550 72.653322 # -b -109.916370 72.695565 -110.146360 72.775357 -110.446755 72.876271 -110.390431 72.995960 -110.071261 72.974838 # -b -110.052487 76.502132 -110.043099 76.518559 -110.043099 76.506825 # -b -109.953919 74.887509 -110.427980 74.840572 -110.648583 74.772514 -110.836329 74.704456 -110.991221 74.666906 -111.376102 74.598848 -112.061377 74.500281 -112.657474 74.446304 -113.507028 74.462732 -114.023332 74.547218 -114.398825 74.650479 -114.398825 74.774861 -113.849666 74.871081 -113.427235 74.864041 -113.089291 75.018932 -112.183413 75.049441 -111.742208 74.993117 -111.432426 75.103418 -111.014689 75.263003 -111.455894 75.201985 -112.028522 75.183210 -112.380547 75.270043 -112.657474 75.279430 -112.920319 75.133927 -113.361524 75.115152 -114.046800 75.103418 -113.783954 75.211372 -113.868440 75.366263 -113.563352 75.457790 -114.070268 75.439015 -114.309645 75.241881 -114.610040 75.255962 -114.586572 75.101071 -114.872886 75.009544 -115.206136 75.185557 -115.633260 75.145661 -115.853863 75.004851 -116.163645 75.140967 -116.539139 75.206679 -117.003812 75.171476 -117.707863 75.277084 -117.496648 75.434322 -116.792597 75.518808 -116.121402 75.504727 -115.459595 75.633803 -115.206136 75.734716 -116.173033 75.600947 -117.013200 75.572785 -117.238496 75.795734 -116.844227 75.814509 -116.464040 75.866139 -116.238744 75.880220 -116.215276 75.922463 -116.539139 75.896648 -116.947488 75.870833 -117.111767 75.950625 -117.017893 76.049192 -116.844227 76.213471 -116.520364 76.208777 -116.257519 76.187656 -116.163645 76.199390 -116.506283 76.258061 -116.684643 76.344894 -116.384248 76.481010 -116.135483 76.513866 -115.806926 76.445807 -115.844476 76.330813 -115.684891 76.218164 -115.417352 76.279182 -115.187362 76.225205 -114.962066 76.147759 -114.793093 75.999909 -114.685139 75.924810 -114.713301 75.833284 -114.488005 75.856752 -114.488005 75.741757 -114.422294 75.629109 -114.150061 75.554010 -113.929458 75.586866 -113.497641 75.598600 -113.047048 75.577478 # -b -109.986775 76.262754 -110.399818 76.389483 -110.381043 76.459888 -110.052487 76.502132 -110.052487 76.502132 # -b -118.059888 76.049192 -118.041113 76.049192 -117.581134 76.112557 -117.843979 75.870833 -118.031726 75.720635 -118.477625 75.523501 -119.083108 75.584519 -119.406971 75.732370 -118.834344 75.896648 -118.289878 76.032765 -118.139680 76.049192 # -b -120.045311 77.041904 -119.688592 77.145164 -119.406971 77.229650 -119.209837 77.314136 -118.853118 77.358726 -118.515174 77.344645 -118.027032 77.372807 -117.914384 77.262506 -117.726637 77.316483 -117.388693 77.321177 -116.900551 77.356380 -117.210334 77.400969 -117.135235 77.469028 -116.675255 77.548820 -116.337311 77.487802 -116.027529 77.419744 -115.642648 77.323524 -115.755296 77.255466 -116.168339 77.196795 -116.496896 77.175673 -116.571995 77.119349 -116.252825 76.997314 -116.055691 76.901094 -116.496896 76.905787 -116.243438 76.795486 -116.243438 76.647635 -116.816065 76.572537 -117.182172 76.490397 -117.210334 76.300304 -117.679701 76.281529 -118.083356 76.445807 -118.036420 76.654676 -118.008258 76.811914 -118.468237 76.736815 -118.477625 76.654676 -118.646597 76.504478 -118.975154 76.539681 -118.853118 76.462235 -118.665371 76.349587 -119.012703 76.173575 -119.237999 76.121944 -119.547781 76.368362 -119.782465 76.304997 -119.688592 76.187656 -119.791852 76.138372 -119.641655 76.011643 -119.810627 75.903689 -119.970212 75.880220 # -b -114.154754 76.891706 -113.863747 76.865891 -113.647838 76.807220 -113.844972 76.729775 -114.276790 76.729775 -114.755544 76.748549 -114.520861 76.870585 -114.154754 76.891706 # -b -112.094233 78.034615 -111.972198 78.032268 -111.502831 78.074511 -111.155499 78.053390 -110.836329 78.090939 -110.244927 78.095633 -110.075955 78.093286 # -b -109.965654 77.929007 -110.341147 77.903192 -110.782352 77.877377 -111.148459 77.851562 -111.063972 77.816359 -111.477015 77.802278 -111.542727 77.750648 -111.383142 77.743607 -111.261107 77.757688 -111.063972 77.724833 -110.876226 77.767076 -110.341147 77.774116 -110.266049 77.663815 -110.331760 77.525352 -110.726028 77.459640 -111.204783 77.424438 -111.674150 77.393929 -112.331263 77.346992 -112.687982 77.452600 -113.241835 77.494843 -113.335709 77.612185 -113.438970 77.741260 -113.429582 77.872683 -113.063476 77.917273 -112.669208 77.978291 -112.359425 78.018187 -112.143517 78.025228 -112.096580 78.034615 # -b -115.070020 77.940741 -114.957372 77.954822 -114.816562 78.006453 -114.488005 78.020534 -114.450456 77.957169 -114.103124 77.884417 -113.802729 77.814012 -114.046800 77.717792 -114.478618 77.722486 -114.863499 77.846868 -115.060633 77.905539 -115.126344 77.943088 -115.070020 77.940741 # -b -110.129932 78.630711 -110.017284 78.604896 -110.017284 78.604896 # -b -109.932798 78.290420 -110.411552 78.285726 -111.012342 78.325622 -111.397223 78.405415 -111.538033 78.365519 -111.538033 78.271645 -111.913527 78.259911 -112.232696 78.346744 -112.598803 78.381946 -112.645739 78.353784 -112.927360 78.330316 -112.974296 78.288073 -113.349790 78.271645 -113.434276 78.351438 -113.077557 78.461739 -112.842874 78.471126 -112.533091 78.522757 -112.101274 78.541531 -111.594357 78.583774 -111.369061 78.679995 -111.059279 78.698769 -110.702560 78.731625 -110.505426 78.703463 -110.251968 78.672954 -110.129932 78.630711 -110.129932 78.630711 # -b -130.141395 70.074150 -129.855081 70.207920 -129.559380 70.146902 -129.615704 70.020173 -129.615704 70.020173 # -b -128.421165 69.949768 -128.299130 70.118740 -127.815682 70.184451 -127.979960 70.257203 -128.055059 70.381586 -128.266274 70.447297 -127.881393 70.503621 -127.341621 70.292406 -127.163261 70.036601 -127.163261 70.036601 # -b -124.858669 69.989664 -124.914993 70.001398 # -b -125.189573 69.942727 -125.091006 70.048335 -124.762449 70.027213 -124.762449 70.027213 # -b -124.703778 69.961502 -124.506644 70.064763 -124.736634 70.114046 -124.459707 70.095272 -124.426852 70.001398 # -b -124.286042 74.016833 -124.009115 73.915919 -124.074826 73.793884 -124.286042 73.603790 -124.506644 73.465327 -124.661535 73.326864 -124.769490 73.218909 -124.990092 73.134423 -124.778877 73.045243 -124.670923 72.960757 -125.055804 72.909127 -125.187226 72.848109 -125.112128 72.756583 -125.088659 72.655669 -125.299874 72.535980 -125.389054 72.500778 -125.506396 72.402211 -125.586188 72.303643 -125.576801 72.261400 -125.764548 72.230892 -125.741079 72.181608 -125.708224 72.078347 -125.985150 71.975087 -125.595576 71.963352 -125.102740 71.956312 -125.220082 71.916416 -124.792958 71.810808 -124.623986 71.862438 -124.516031 71.792033 -124.041971 71.695813 -123.732188 71.486945 -123.469343 71.214712 -123.014057 71.111451 -122.497753 71.256955 -122.065936 71.386031 -121.803090 71.519801 -121.648199 71.407152 -121.272705 71.407152 -121.084958 71.461130 -120.690690 71.543269 -120.502943 71.738056 -120.535799 71.916416 -120.371521 72.085388 -120.258873 72.263747 -120.014802 72.230892 -120.014802 72.230892 # -b -119.906847 74.265598 -120.423151 74.343043 -120.812726 74.462732 -121.075571 74.551912 -121.526163 74.591808 -121.835946 74.547218 -122.098791 74.549565 -122.497753 74.521403 -122.882634 74.509669 -123.136092 74.481506 -123.093849 74.373552 -123.234659 74.441610 -123.413019 74.453344 -123.666477 74.490894 -123.919935 74.469772 -124.187475 74.441610 -124.703778 74.401714 -124.525419 74.289066 -124.450320 74.211620 -124.351753 74.056729 -124.286042 74.016833 # -b -120.132143 77.011395 -120.047657 77.041904 -120.047657 77.041904 # -b -119.967865 75.880220 -120.277647 75.941238 -120.521718 75.903689 -120.681303 76.018683 -120.793951 76.190002 -121.094346 76.100823 -121.263318 75.950625 -121.789009 76.032765 -121.864108 76.107863 -121.995531 76.063273 -122.389799 75.950625 -122.699581 75.992868 -122.483672 76.168881 -122.934265 76.194696 -122.662032 76.279182 -122.380411 76.427033 -121.845333 76.424686 -121.601262 76.459888 -121.291480 76.603045 -121.225769 76.671104 -120.915986 76.711000 -120.606204 76.776711 -120.409070 76.858850 -120.211936 76.987926 -120.127450 77.011395 # -b -131.023805 69.970889 -130.751572 70.118740 -130.451177 70.139861 -130.141395 70.074150 -130.141395 70.074150 # -b -150.157552 70.423829 -149.570843 70.496580 -148.923117 70.426175 -148.557010 70.346383 -148.106418 70.315874 -147.796636 70.252510 -147.355431 70.203226 -146.839127 70.158636 -146.196094 70.177411 -145.670403 70.062416 -145.294910 70.048335 -145.327765 70.008439 # -b -144.952272 69.982624 -144.919416 70.024867 # -b -144.611981 69.982624 -144.381991 70.050682 -144.250568 70.055375 -143.785895 70.102312 -143.485500 70.050682 -143.311834 70.102312 -142.870629 70.064763 -142.560847 70.006092 # -b -160.061196 70.290059 -159.873449 70.367505 -159.727946 70.473112 -159.662234 70.496580 -159.896918 70.602188 # -b -160.105786 70.649125 -159.885184 70.745345 -159.181133 70.893196 -159.336024 70.841565 -159.443979 70.759426 -159.223376 70.667899 -159.101341 70.773507 -158.815027 70.773507 -158.373822 70.832178 -157.834050 70.869727 -157.482024 70.982375 -157.294278 71.085636 -157.162855 71.141960 -157.031432 71.207671 -156.951640 71.238180 -156.810830 71.315626 -156.646551 71.315626 -156.280445 71.273383 -156.083311 71.163082 -155.651493 71.172469 -155.576394 71.052780 -155.881483 70.961254 -156.214734 70.949520 -156.303913 70.855646 -155.947194 70.799322 -155.684349 70.775854 -155.454359 70.728917 -155.299468 70.841565 -155.308855 71.038699 -155.069478 71.057474 -154.759696 71.071555 -154.647048 70.879115 -154.219924 70.806363 -153.820962 70.900236 -153.600359 70.879115 -153.234253 70.935439 -152.915083 70.808710 -152.717949 70.775854 -152.473878 70.867380 -152.145321 70.752385 -152.056142 70.620963 -152.356537 70.574026 -151.779215 70.555251 -151.736972 70.456684 -151.065777 70.447297 -150.511924 70.503621 -150.183367 70.440256 -150.159899 70.423829 -150.159899 70.423829 # -b -162.532414 69.970889 -162.457315 70.031907 -162.293037 70.017826 # -b -161.903462 69.956808 -162.203857 70.137515 -161.894075 70.285365 -161.903462 70.245469 -161.983254 70.132821 -161.617148 70.219654 -161.067989 70.315874 -160.579847 70.440256 -160.734738 70.456684 -160.237209 70.583413 -160.030687 70.508315 -160.227822 70.329955 -160.063543 70.290059 # -b -159.896918 70.602188 -160.028341 70.616269 -160.103439 70.649125 # -b -179.000000 71.549461 -178.711495 71.498679 -178.195191 71.447049 -178.162336 71.376644 -177.829085 71.285117 -177.664807 71.111451 -178.228047 71.001150 -178.603541 70.970641 -179.000000 70.924468 -179.000000 70.924468 # -b 170.415433 69.930993 170.833170 70.055375 171.330699 70.017826 # -b 179.000000 70.853299 178.751576 70.874421 178.554442 70.970641 178.718721 71.141960 179.000000 71.268997 179.000000 71.268997 # -b 159.922733 70.451991 160.044768 70.299446 160.044768 70.226694 # -b 168.099107 69.994358 168.474600 70.020173 168.474600 70.020173 # -b 149.965112 72.017330 150.040210 71.843664 150.040210 71.843664 # -b 149.920522 71.653570 150.328871 71.545616 150.662122 71.437661 151.211281 71.421233 151.652486 71.393071 152.004511 71.254608 152.337762 71.078596 151.783909 70.970641 152.304906 70.888502 152.732030 70.834525 153.187316 70.881461 153.384450 70.907277 153.858511 70.916664 154.341959 70.897889 154.618886 70.963601 155.224369 70.935439 155.764141 70.977682 156.285139 71.005844 156.946946 71.012884 157.650997 71.012884 158.359741 70.968294 158.998080 70.874421 159.350105 70.740651 159.725599 70.602188 159.922733 70.451991 159.922733 70.451991 # -b 160.044768 70.226694 159.979057 70.165677 159.922733 70.095272 # -b 149.887666 75.201985 150.352339 75.138620 151.089246 75.096377 150.924967 74.927405 150.155205 74.753739 150.033170 74.732618 # -b 139.984022 71.442355 140.040346 71.493985 140.030958 71.564390 # -b 139.906576 72.094775 140.366556 72.183955 140.690419 72.397517 141.009589 72.557102 141.009589 72.641588 140.831229 72.780051 141.281822 72.819947 141.549361 72.749542 141.976485 72.709646 142.197087 72.700259 142.896444 72.693218 143.534783 72.690871 144.248221 72.660362 144.825543 72.589957 145.520206 72.552408 145.905087 72.519552 146.346292 72.430373 146.745254 72.374049 146.135077 72.371702 145.693872 72.420985 144.825543 72.467922 144.417193 72.486697 144.459436 72.327112 144.248221 72.169874 144.623715 72.125284 145.421639 72.172221 146.003654 72.270788 146.566894 72.317724 146.623218 72.207423 146.069365 71.921109 145.895699 72.045492 145.905087 72.207423 146.158545 72.162833 145.848763 72.214464 145.693872 72.003249 145.440413 71.918763 144.999208 71.939884 145.266748 71.874173 145.233892 71.820195 144.877173 71.749790 144.999208 71.623061 145.252667 71.585512 145.585917 71.686426 146.003654 71.834276 146.510570 71.972740 146.745254 72.193342 147.040955 72.301297 147.538484 72.367008 148.031319 72.359968 148.134580 72.343540 148.486605 72.364661 148.960666 72.277828 149.444114 72.223851 149.852463 72.085388 149.965112 72.017330 # -b 150.042557 71.843664 149.690532 71.846011 149.347894 71.874173 149.005256 71.709894 149.235246 71.674692 149.667064 71.646530 149.920522 71.653570 # -b 139.960553 75.793387 140.336047 75.802775 140.270336 75.720635 140.232786 75.650230 140.509713 75.598600 140.786639 75.607987 140.828882 75.732370 140.781946 75.812162 140.772558 76.009296 141.082341 76.079701 141.542320 76.006949 141.908427 75.873180 142.096173 75.734716 142.410649 75.647884 142.222902 75.492992 142.072705 75.361570 142.302695 75.159742 142.753287 75.056481 143.260204 74.981382 143.095925 74.913324 142.457586 74.955567 142.213515 74.845266 141.805166 74.976689 141.762923 75.072909 141.209070 74.962608 140.514407 74.847613 139.998103 74.795982 # -b 141.328758 76.143066 141.619766 76.105516 142.107908 75.974094 142.502176 75.852058 143.121740 75.845018 143.638044 75.873180 144.088636 75.744104 144.520454 75.678392 144.985127 75.607987 145.379396 75.530542 145.205730 75.500033 144.849011 75.453096 144.661264 75.385038 144.675345 75.239534 144.299852 75.089337 143.670900 75.054134 142.732166 75.138620 142.323816 75.403813 142.502176 75.598600 142.694616 75.769919 142.356672 75.842671 142.018728 75.955319 141.671396 76.058580 141.399163 76.138372 141.371001 76.143066 # -b 146.292315 75.558704 146.569241 75.514114 146.888411 75.422587 147.573687 75.415547 148.221413 75.375651 148.596907 75.331061 148.221413 75.251268 148.916076 75.255962 149.380750 75.274737 149.887666 75.201985 149.887666 75.201985 # -b 150.030823 74.732618 149.622474 74.732618 149.345547 74.737312 148.660271 74.831185 147.956221 74.908630 147.439917 74.997810 147.064423 75.117499 146.721785 75.342795 146.257112 75.523501 146.289968 75.558704 146.289968 75.558704 # -b 140.953265 74.138869 140.521447 74.307841 140.080242 74.159990 140.145953 74.002752 140.479204 73.892451 140.390024 73.946428 140.699806 73.988671 140.896941 74.033261 140.915715 74.098972 140.953265 74.138869 # -b 141.328758 73.892451 141.516505 73.899491 141.943629 73.922960 142.497482 73.838474 143.060723 73.667155 143.422135 73.453593 143.511315 73.225950 142.938687 73.232990 142.398915 73.279927 141.746495 73.352679 140.887553 73.418390 140.028612 73.362066 140.028612 73.362066 # -b 139.784541 73.472367 140.399412 73.521651 140.742050 73.768069 140.953265 73.887757 141.328758 73.892451 141.328758 73.892451 # -b 139.972288 72.472616 140.178809 72.460881 140.676338 72.489043 140.587158 72.359968 140.446348 72.294256 140.347781 72.270788 140.136566 72.237932 # -b 129.946608 71.038699 130.232922 71.012884 130.462912 70.895542 130.838405 70.862687 130.993296 70.848606 131.213899 70.707796 131.580005 70.855646 131.899175 71.139613 132.007129 71.367256 132.218344 71.625408 132.514046 71.874173 132.758116 71.949271 132.903620 71.747444 133.157078 71.646530 133.419924 71.522147 133.837661 71.400112 134.358658 71.409499 134.720071 71.378990 134.776395 71.451742 135.020465 71.618368 135.583706 71.639489 136.057767 71.543269 136.508359 71.522147 136.728961 71.486945 137.245265 71.395418 137.634840 71.282770 137.855442 71.184203 138.273179 71.177163 138.582961 71.332054 138.756627 71.381337 138.977229 71.400112 139.333948 71.402459 139.451290 71.512760 139.981675 71.442355 139.981675 71.442355 # -b 140.028612 71.564390 139.728217 71.738056 139.883108 71.853051 139.751685 71.984474 139.906576 72.094775 # -b 136.013177 74.054382 136.182149 73.998058 136.215005 73.876023 135.750331 74.028567 135.417081 74.169377 135.684620 74.148256 136.013177 74.054382 136.013177 74.054382 # -b 135.848898 75.549316 135.726863 75.467177 135.717476 75.345142 135.417081 75.427281 135.464017 75.544623 135.478098 75.744104 135.487486 75.821549 135.623602 75.673699 135.853592 75.598600 135.755025 75.549316 # -b 139.918310 75.837977 139.955860 75.823896 139.965247 75.793387 # -b 140.005143 74.795982 139.817396 74.833532 139.639037 74.960261 139.563938 75.049441 139.366804 74.955567 139.409047 74.859347 139.042941 74.688028 138.568880 74.742005 137.939928 74.817104 137.719326 74.976689 137.282815 75.054134 136.949564 75.126886 136.705493 75.321673 137.038744 75.338101 136.991807 75.406160 137.146698 75.446056 136.818141 75.577478 136.916708 75.575132 137.062212 75.600947 136.982420 75.746451 137.221797 75.793387 137.132617 75.826243 137.080987 75.945932 137.278121 75.990521 137.479949 76.077354 137.601984 76.136025 137.822587 76.204083 137.897685 76.159494 138.066657 76.030418 138.287260 75.978787 138.320116 75.873180 138.446845 75.837977 138.446845 75.837977 # -b 140.028612 73.362066 139.653118 73.437165 139.784541 73.472367 # -b 137.038744 71.613674 137.193635 71.566737 137.512804 71.585512 137.977478 71.533882 137.620759 71.456436 137.203022 71.472864 136.738349 71.559697 136.949564 71.599593 137.038744 71.613674 # -b 138.043189 71.526841 138.249711 71.578471 138.517250 71.578471 138.803564 71.618368 138.958455 71.493985 138.822338 71.414193 138.437457 71.350828 138.108900 71.325013 137.864830 71.400112 138.029108 71.508066 138.043189 71.526841 138.043189 71.526841 # -b 139.972288 72.472616 139.972288 72.472616 # -b 140.138913 72.237932 139.599141 72.233238 139.387926 72.176914 139.233035 72.294256 139.378538 72.388130 139.467718 72.486697 139.894842 72.503124 139.974634 72.472616 # -b 119.977252 73.021775 120.460700 72.995960 121.047409 72.920861 121.244543 72.946676 121.718604 72.970145 122.094098 72.953717 122.347556 72.972491 122.732437 73.012388 123.239353 73.033509 123.352001 73.200135 123.173642 73.399615 123.154867 73.472367 123.319146 73.751641 123.525667 73.702357 123.858918 73.709398 123.858918 73.836127 124.187475 73.784496 124.642761 73.744600 124.938462 73.709398 125.173145 73.688276 125.281100 73.582669 125.558026 73.577975 125.788016 73.549813 126.088411 73.533385 126.407581 73.486448 126.614102 73.401962 126.801849 73.465327 127.045920 73.533385 127.275910 73.505223 127.454269 73.493489 127.764051 73.493489 128.139545 73.458286 128.191175 73.397269 128.491570 73.366760 128.646461 73.256459 128.932775 73.183707 129.341124 73.047590 129.514790 72.972491 129.430304 72.883312 129.317656 72.791785 129.359899 72.730767 129.251945 72.634547 129.397448 72.540674 129.228476 72.463228 129.627438 72.376395 129.463160 72.219157 129.416223 72.153446 129.219089 72.092428 129.176846 72.026717 128.965631 72.003249 128.712173 71.888254 128.843595 71.738056 128.942162 71.594899 129.139297 71.653570 129.195621 71.585512 129.317656 71.458783 129.505403 71.247568 129.749474 71.160735 129.946608 71.038699 129.946608 71.038699 # -b 109.942185 76.661716 110.251968 76.718040 110.627461 76.699266 111.078053 76.713347 111.134378 76.638248 111.472322 76.619473 111.500484 76.574883 111.857203 76.509172 112.073112 76.422339 112.354732 76.375402 112.673901 76.295610 112.551866 76.211124 112.664514 76.152453 112.795937 76.065620 113.077557 76.138372 113.058782 76.211124 113.340403 76.138372 113.424889 75.992868 113.631410 75.898995 113.809770 75.793387 113.603248 75.622068 113.424889 75.589213 112.993071 75.690127 112.617577 75.769919 112.242084 75.802775 112.608190 75.708901 112.631658 75.605641 112.828792 75.626762 113.040008 75.568091 113.424889 75.507073 113.556311 75.422587 113.457744 75.375651 113.499987 75.284124 113.227754 75.178517 113.072863 75.082296 112.763081 75.028319 112.706757 74.964955 112.345344 74.873428 112.124742 74.896896 112.054337 74.835879 111.890058 74.798329 111.636600 74.756086 111.613132 74.638744 111.293962 74.692722 110.918469 74.622317 110.665011 74.537831 110.547669 74.540177 110.223805 74.483853 110.073608 74.399367 109.853006 74.333656 # -b 109.986775 73.491142 110.230846 73.549813 110.625114 73.624912 110.714294 73.744600 110.287170 73.702357 110.151054 73.653074 # -b 109.787294 73.974590 110.491345 73.965203 110.866838 73.913572 111.265800 74.028567 111.308043 73.934694 111.200089 73.857248 111.641294 73.707051 112.115355 73.678889 112.828792 73.775109 112.777162 74.002752 113.138575 73.805618 113.359177 73.620218 113.185511 73.420737 113.326322 73.310436 113.185511 73.263499 113.734671 73.263499 114.250975 73.200135 114.626468 73.148504 114.044453 73.364413 113.546924 73.495836 114.185263 73.568588 114.673405 73.554507 115.034818 73.582669 115.321131 73.660114 115.818660 73.685929 116.358433 73.627258 117.020240 73.599096 117.705516 73.538079 118.235901 73.531038 118.728736 73.533385 118.916483 73.465327 # -b 113.018886 74.512015 113.305200 74.462732 113.328668 74.312534 113.051742 74.181112 112.577681 74.117747 111.981585 74.211620 111.474669 74.307841 111.685884 74.340696 112.005053 74.411101 112.005053 74.547218 112.446258 74.504975 112.812365 74.493241 113.018886 74.512015 # -b 118.942298 73.467674 118.810875 73.465327 118.580885 73.434818 118.458850 73.338598 118.435382 73.275233 118.444769 73.209522 118.867199 73.110955 119.392890 73.059324 119.758997 72.981879 119.979599 73.021775 119.979599 73.021775 # -b 99.864875 79.665665 100.230982 79.653931 100.230982 79.653931 # -b 99.975176 78.431230 100.087825 78.487554 100.228635 78.635405 100.604128 78.773868 101.064108 78.729278 100.791875 78.860701 100.895136 78.996817 101.148594 79.024979 101.148594 79.107119 101.233080 79.177524 101.617961 79.278437 101.815095 79.294865 102.153039 79.215073 102.153039 79.372311 102.444047 79.416901 102.866477 79.384045 102.904027 79.327721 103.119936 79.283131 102.922801 79.104772 103.054224 79.055488 103.307682 79.203339 103.598690 79.158749 103.795824 79.125893 104.039895 79.163443 104.114994 79.100078 104.199480 78.978043 104.330902 79.034367 104.499875 78.956921 104.865981 78.841926 105.269637 78.790296 105.457383 78.675301 105.457383 78.525103 105.128826 78.330316 104.650072 78.297460 103.992958 78.238790 103.260746 78.201240 102.950963 78.170731 102.537920 78.215321 102.040391 78.180119 101.467764 78.182465 100.998397 78.116754 100.529030 78.041655 100.069050 77.968903 # -b 99.986911 78.339703 100.033847 78.365519 # -b 107.022722 78.175425 107.219857 78.135529 107.604737 78.173078 107.801872 78.119101 107.473315 78.051043 106.910074 78.088592 106.600292 78.130835 106.966398 78.168384 107.022722 78.175425 # -b 99.951708 76.450501 100.439850 76.450501 100.862280 76.499785 101.134513 76.537334 101.068802 76.631207 101.228386 76.621820 101.228386 76.652329 101.059414 76.722734 100.852893 76.802526 100.984316 76.889359 101.172062 76.957418 101.294098 77.070066 101.510007 77.149858 101.707141 77.222610 101.988761 77.274240 102.110796 77.302402 102.289156 77.382195 102.542614 77.471374 102.777298 77.534739 102.993206 77.609838 103.425024 77.595757 103.640933 77.642693 103.903778 77.689630 104.157237 77.691977 104.279272 77.638000 104.523343 77.670855 104.823738 77.565248 105.293105 77.508924 105.593500 77.530045 105.800021 77.424438 106.044092 77.321177 105.612274 77.339952 105.452690 77.239038 104.945773 77.152205 104.607829 77.034863 104.260497 76.938643 104.720477 77.002007 105.152295 77.046597 105.518401 77.060678 105.734310 77.128737 105.668599 77.004354 105.968993 77.044250 106.175515 77.011395 106.466522 77.023129 106.663657 76.985580 106.804467 76.990273 107.133024 76.971499 107.217510 76.917521 107.179960 76.879972 107.057925 76.804873 107.086087 76.783752 107.179960 76.788445 106.842016 76.718040 106.560396 76.570190 106.306938 76.506825 106.119191 76.471623 106.306938 76.448154 106.748143 76.424686 107.189348 76.443461 107.414644 76.492744 107.733813 76.544375 107.865236 76.591311 107.799525 76.628861 107.940335 76.711000 108.128082 76.741509 108.193793 76.696919 108.343991 76.701613 108.606836 76.678144 108.991717 76.696919 109.310887 76.734468 109.592507 76.687532 109.808416 76.673450 109.939838 76.661716 # -b 110.031365 74.333656 109.984428 74.319575 109.730970 74.157643 108.937740 73.991018 108.505922 73.791537 108.144510 73.587362 107.604737 73.606137 107.107208 73.573281 107.064965 73.514610 106.806814 73.397269 106.332753 73.275233 105.980728 73.157891 105.792981 73.040550 105.595847 72.909127 105.196885 72.784745 104.779148 72.756583 104.427123 72.658016 104.164277 72.550061 104.558545 72.594651 104.657113 72.585264 105.131173 72.726074 105.652171 72.798826 106.013583 72.941983 106.609679 72.857497 106.886606 72.866884 106.290510 72.951370 106.248267 73.129729 106.853750 73.125036 107.515558 73.148504 107.956763 73.232990 108.243077 73.251765 108.660813 73.317476 109.191198 73.385534 109.336702 73.406656 109.116099 73.526345 109.435269 73.416043 109.984428 73.491142 109.984428 73.491142 # -b 110.151054 73.653074 109.691074 73.678889 109.667606 73.601443 109.447003 73.791537 109.789641 73.974590 109.789641 73.974590 # -b 92.366737 80.010650 92.948752 79.987182 93.465056 79.926164 93.540155 79.829944 93.258534 79.778313 92.761005 79.703215 92.301026 79.689134 91.775335 79.642197 91.324742 79.714949 91.615750 79.726683 91.925532 79.707908 92.216540 79.712602 91.963081 79.783007 91.456165 79.815863 91.446778 79.848718 91.296580 79.921470 91.193319 79.970754 91.268418 79.998916 # -b 94.030643 80.003610 93.833509 79.996569 # -b 98.057812 80.020037 98.114136 79.895655 97.672931 79.829944 97.372536 79.768926 96.893782 79.703215 97.325600 79.724336 97.729255 79.757192 97.992101 79.836984 98.405144 79.898002 98.452080 79.989529 98.452080 79.989529 # -b 98.862777 80.001263 98.937875 79.989529 99.097460 79.991875 # -b 99.280513 80.010650 99.656007 79.902696 99.843754 79.790048 99.853141 79.710255 99.862528 79.665665 # -b 100.228635 79.653931 99.815592 79.548324 99.665394 79.470878 99.674782 79.332415 99.421323 79.250275 98.970731 79.306600 99.327450 79.144668 99.590296 79.064875 99.665394 78.928759 99.233577 78.823151 98.782984 78.748053 98.069546 78.771521 97.581405 78.813764 97.083876 78.867741 96.426762 78.949881 96.041881 79.001511 95.760261 79.055488 95.591288 79.123546 95.028048 78.994470 94.708878 79.085997 94.230124 79.226807 94.220737 79.372311 94.136251 79.477918 93.779532 79.454450 93.516686 79.482612 93.216291 79.524855 93.141193 79.449756 92.822023 79.553017 93.272615 79.578832 93.695046 79.658625 93.882792 79.752498 94.474195 79.797088 94.239511 79.898002 94.492970 79.970754 94.577456 79.984835 # -b 99.942321 78.424190 99.970483 78.431230 # -b 100.064356 77.968903 99.632539 77.924314 99.557440 78.008800 99.379080 78.076858 99.594989 78.203587 99.942321 78.323276 99.979870 78.339703 # -b 100.031501 78.365519 99.947014 78.424190 99.947014 78.424190 # -b 89.914294 75.462484 90.078573 75.481258 90.003474 75.488299 # -b 89.980006 75.551663 90.463454 75.582172 90.904659 75.622068 91.303621 75.650230 91.524223 75.626762 91.580547 75.706554 91.744826 75.727676 91.956041 75.753491 92.162562 75.798081 92.444183 75.840324 92.481732 75.915423 92.416021 75.929504 92.373778 75.913076 92.181337 75.920116 92.148481 76.018683 92.223580 75.985828 92.406633 76.051539 92.523975 76.025724 92.566218 76.065620 92.744577 76.086742 92.908856 76.044499 93.007423 76.100823 93.171701 76.086742 93.321899 76.075008 93.420466 76.114904 93.631681 76.126638 93.763104 76.032765 93.575357 75.906035 93.669230 75.873180 93.903914 75.960013 94.054111 75.957666 93.960238 75.863792 94.147985 75.894301 94.265327 75.971747 94.331038 75.948278 94.438992 75.952972 94.593884 75.955319 94.607965 76.023377 94.617352 76.075008 94.762856 76.058580 94.725306 76.133678 94.903666 76.190002 95.119575 76.246327 95.274466 76.208777 95.260385 76.143066 95.448132 76.112557 95.532618 76.013990 95.626491 76.096129 95.635878 76.159494 95.654653 76.236939 95.424663 76.255714 95.293240 76.326119 95.189980 76.410605 95.161818 76.464582 95.161818 76.464582 # -b 98.804106 76.464582 99.001240 76.459888 99.376734 76.431726 99.817939 76.438767 99.958749 76.450501 99.958749 76.450501 # -b 96.321154 76.274489 96.283605 76.215818 96.321154 76.128985 95.926886 76.138372 95.504456 76.175921 95.288547 76.239286 95.373033 76.248673 95.513843 76.248673 95.776688 76.274489 96.030147 76.236939 96.424415 76.276835 96.574612 76.185309 96.490126 76.236939 96.321154 76.274489 # -b 96.300033 77.004354 96.084124 76.931602 95.736792 76.861197 95.755567 76.896400 95.736792 76.926909 95.239263 76.896400 95.483334 76.997314 96.027800 77.067719 96.337582 77.117002 96.365744 77.009048 96.300033 77.004354 96.300033 77.004354 # -b 80.341554 73.164932 80.585625 73.261152 80.341554 73.315129 80.552769 73.329210 80.782759 73.418390 80.707660 73.437165 80.552769 73.526345 80.839083 73.547466 81.148865 73.568588 81.303756 73.596750 81.599457 73.620218 81.965564 73.657767 82.294121 73.641340 82.716551 73.648380 83.176531 73.646033 83.918131 73.676542 84.368723 73.714091 84.819315 73.751641 85.194809 73.695317 85.626627 73.812658 85.969264 73.838474 86.264966 73.852555 86.673315 73.918266 86.631072 73.974590 86.696783 74.021527 86.893917 74.037955 86.682702 74.148256 86.354145 74.253863 85.969264 74.284372 85.889472 74.380593 86.067832 74.399367 86.241497 74.439263 86.377614 74.467425 86.584135 74.469772 86.509037 74.523750 86.462100 74.561299 86.020895 74.608236 85.668870 74.650479 85.814373 74.723231 85.912940 74.786595 85.955183 74.817104 86.189867 74.781901 86.476181 74.697415 86.649847 74.619970 86.715558 74.737312 86.917386 74.786595 87.091052 74.880468 87.170844 74.967301 87.400834 74.934446 87.522869 75.011891 87.114520 75.042400 86.917386 75.101071 87.490014 75.115152 87.734084 75.068215 87.987543 75.096377 88.039173 75.166782 88.395892 75.267696 88.616494 75.307592 88.968520 75.368610 88.846484 75.415547 89.189122 75.469524 89.475436 75.403813 89.916641 75.462484 89.916641 75.462484 # -b 90.003474 75.488299 89.980006 75.551663 89.980006 75.551663 # -b 89.496558 77.304749 89.440234 77.260159 89.590431 77.199142 89.336973 77.152205 89.139839 77.208529 89.365135 77.293015 89.496558 77.304749 # -b 82.188513 75.413200 82.230756 75.340448 82.052397 75.232494 81.920974 75.352182 81.611192 75.382691 81.690984 75.201985 81.493850 75.370957 81.681597 75.424934 81.888118 75.460137 81.855262 75.509420 82.155657 75.457790 82.188513 75.413200 # -b 82.319936 70.398013 82.441971 70.515355 82.714204 70.379239 82.747060 70.214960 82.427890 70.231388 82.319936 70.360464 82.319936 70.398013 # -b 79.961367 72.198036 80.590318 72.068960 80.918875 71.937537 81.327225 71.780299 81.669862 71.702854 82.167392 71.681732 82.716551 71.723975 83.106126 71.695813 83.270404 71.557350 83.059189 71.407152 82.430237 71.249915 82.355138 71.015231 82.322283 70.759426 82.242490 70.543517 82.242490 70.329955 82.387994 70.137515 82.796343 70.102312 83.246936 70.048335 83.148369 70.226694 83.523862 70.273631 83.800789 70.444950 83.678753 70.738304 83.448764 70.994109 83.270404 71.228793 83.613042 71.468170 83.655285 71.674692 83.425295 71.789687 82.894910 71.864785 82.477174 72.029064 82.430237 72.139365 82.054743 72.254360 81.482116 72.308337 80.975199 72.423332 80.900101 72.580570 80.834389 72.763623 80.951731 72.864537 80.867245 72.979532 80.754597 73.038203 80.580931 73.110955 80.444815 73.136770 80.341554 73.164932 # -b 70.243122 73.014735 70.275978 73.134423 70.341689 73.343291 71.092677 73.432471 71.083289 73.249418 71.524494 73.235337 71.181856 73.085140 70.520049 73.040550 70.341689 73.040550 70.243122 73.014735 # -b 74.202233 73.019428 74.634051 73.064018 74.732618 73.005347 74.469772 72.902086 74.202233 73.019428 # -b 79.276091 73.012388 79.496693 72.892699 79.445063 72.672097 78.834886 72.756583 78.971002 72.944329 79.243235 73.040550 79.276091 73.012388 # -b 77.368114 72.500778 77.588716 72.575876 78.184812 72.526593 78.086245 72.364661 77.321177 72.254360 76.969152 72.291909 77.368114 72.500778 77.368114 72.500778 # -b 69.947421 72.871578 70.473112 72.876271 71.289811 72.883312 71.829583 72.824641 72.505471 72.740155 72.589957 72.723727 # -b 72.592304 72.723727 72.550061 72.683831 72.592304 72.566489 72.681484 72.345887 72.526593 72.120590 72.254360 71.862438 72.118244 71.709894 71.799074 71.592552 71.756831 71.498679 72.188649 71.280423 72.540674 71.127879 72.770664 70.853299 72.695565 70.536477 72.573530 70.360464 72.442107 70.177411 72.526593 70.006092 72.526593 70.006092 # -b 73.641340 69.942727 73.796231 70.196186 74.237436 70.482499 74.134175 70.787588 73.796231 71.113798 73.387881 71.357869 72.998307 71.540922 73.355026 71.702854 73.528691 71.878866 74.101319 71.993861 74.279679 72.029064 74.983729 72.268441 74.899243 72.632200 75.016585 72.845762 75.392079 72.700259 75.570438 72.540674 75.481258 72.397517 75.561051 72.200383 75.204332 71.991514 75.251268 71.789687 75.471871 71.601940 75.218413 71.440008 75.359223 71.334401 75.978787 71.235834 76.485704 71.202978 77.170980 71.160735 77.574635 71.141960 77.950129 70.982375 78.414802 70.996456 78.151957 71.263996 77.907886 71.369603 77.555861 71.280423 77.288321 71.322666 76.617126 71.486945 76.297957 71.627755 76.002256 71.871826 76.551415 71.862438 77.203835 71.716935 78.029921 71.895294 77.654428 72.052532 77.598104 72.176914 78.095633 72.324765 79.010898 72.334152 79.813516 72.256707 79.959020 72.198036 # -b 59.933476 75.999909 60.215096 76.072661 60.599977 76.100823 60.440392 75.964706 60.881597 76.032765 60.984858 76.114904 60.919146 76.225205 61.022407 76.281529 61.623197 76.262754 62.242761 76.246327 62.590093 76.190002 63.050073 76.201737 63.500665 76.281529 63.876159 76.267448 64.185941 76.293263 64.542660 76.328466 65.058963 76.415299 65.406295 76.518559 65.838113 76.539681 65.847500 76.708653 66.241768 76.781405 66.391966 76.781405 66.664199 76.882319 67.171115 76.903440 67.771905 76.945683 68.269434 76.910481 68.710639 76.823648 68.879611 76.718040 69.029808 76.579577 68.898386 76.478663 68.795125 76.410605 68.551054 76.328466 68.344533 76.234592 68.372695 76.145413 67.912715 76.180615 67.387024 76.082048 66.880108 75.999909 66.269930 75.945932 65.659753 75.908382 65.321809 75.821549 64.871217 75.758185 63.857384 75.600947 63.528827 75.694820 63.392711 75.610334 62.810695 75.424934 62.313166 75.359223 62.036240 75.307592 61.651359 75.155048 61.135055 75.030666 60.726706 74.990770 60.407536 75.051787 60.571815 74.934446 60.262032 74.795982 60.130610 74.664560 59.999187 74.659866 # -b 59.766850 70.146902 60.020308 70.050682 # -b 66.858986 69.888750 66.910616 70.036601 # -b 67.211011 69.975583 67.178156 70.285365 67.318966 70.616269 67.032652 70.801669 66.638383 70.721877 66.802662 70.935439 67.032652 71.076249 66.858986 71.071555 66.690014 71.076249 66.934085 71.294504 68.013629 71.583165 68.445447 71.888254 68.666049 72.247319 68.886652 72.589957 69.262145 72.838722 69.360712 72.927902 69.858241 72.944329 69.947421 72.871578 # -b 58.797607 80.001263 58.581698 79.973101 58.562924 79.942592 58.750671 79.921470 58.806995 79.879227 58.957192 79.900349 59.051066 79.862799 59.276362 79.853412 59.473496 79.867493 59.473496 79.900349 59.698792 79.898002 59.689405 79.956673 59.651855 79.996569 # -b 53.744871 73.261152 54.054654 73.251765 54.636669 73.333904 55.298476 73.315129 55.918041 73.251765 56.500056 73.127383 56.260679 73.047590 56.091706 73.019428 56.345165 72.970145 55.716213 72.911474 56.302922 72.934942 56.091706 72.780051 55.575403 72.775357 55.819474 72.733114 55.753762 72.604038 55.519079 72.507818 55.453367 72.418638 55.462755 72.209770 55.420512 71.977433 55.551934 71.747444 55.716213 71.491639 56.082319 71.252261 56.523524 70.994109 57.039828 70.841565 57.438790 70.773507 57.518582 70.639737 57.175944 70.623310 56.974116 70.588107 57.143089 70.550558 56.955342 70.534130 56.598623 70.656165 56.302922 70.696061 56.359246 70.606882 56.326390 70.566985 55.936815 70.602188 55.786618 70.660859 55.476836 70.689021 55.298476 70.616269 54.979307 70.606882 54.937064 70.719530 54.528714 70.740651 54.218932 70.712489 53.923231 70.754732 53.744871 70.855646 53.679160 71.003497 53.998329 71.010537 54.308112 71.050434 54.195464 71.120839 53.843438 71.149001 53.566512 71.263996 53.754259 71.343788 53.744871 71.397765 53.458557 71.350828 53.458557 71.519801 53.237955 71.447049 52.918785 71.449395 52.796750 71.578471 52.496355 71.529188 52.388401 71.547963 52.055150 71.456436 51.759449 71.498679 51.529459 71.674692 51.515378 71.904682 51.768836 72.083041 52.078618 72.092428 52.332077 72.014983 52.510436 72.132325 52.641859 72.256707 52.651246 72.355274 52.820218 72.446800 53.040821 72.566489 52.820218 72.589957 52.562066 72.641588 52.477580 72.780051 53.003271 72.885659 53.191018 72.909127 53.294279 72.984226 53.125307 73.092180 53.669773 73.235337 53.744871 73.261152 # -b 53.669773 73.763375 53.974861 73.782150 54.481778 73.915919 54.768091 74.047342 55.279701 74.087238 56.105787 74.002752 55.378269 74.171724 55.551934 74.209274 55.190522 74.331309 55.852329 74.378246 55.664582 74.455691 55.453367 74.605889 55.772537 74.622317 56.415570 74.624663 56.312309 74.671600 55.852329 74.730271 55.598871 74.772514 55.903960 74.925058 55.716213 74.986076 55.429899 75.016585 55.598871 75.145661 55.927428 75.065868 56.467200 75.098724 56.866162 75.263003 57.260430 75.284124 57.626537 75.305246 57.790815 75.467177 57.978562 75.500033 58.288344 75.607987 58.565271 75.629109 58.574658 75.751144 58.804648 75.835630 59.053412 75.887261 59.236465 75.999909 59.236465 75.999909 # -b 60.076632 74.659866 59.447681 74.720884 59.823174 74.549565 59.677670 74.544871 59.039331 74.617623 59.128511 74.502628 58.983007 74.486200 59.058106 74.399367 58.973620 74.373552 58.565271 74.469772 58.466704 74.420489 58.738936 74.260904 58.616901 74.176418 58.443235 74.164684 58.419767 74.059076 58.246101 74.014486 58.124066 73.962856 57.837752 74.080198 57.504501 74.164684 57.504501 74.059076 57.363691 74.019180 57.701635 73.913572 57.823671 73.833780 57.790815 73.723479 57.405934 73.810312 56.776982 73.819699 57.373078 73.707051 57.462258 73.568588 57.129008 73.566241 56.931873 73.559200 57.152476 73.458286 57.039828 73.371453 56.842694 73.298702 56.711271 73.225950 56.359246 73.258805 55.918041 73.303395 55.443980 73.331557 54.922983 73.401962 54.481778 73.343291 54.106284 73.331557 54.397291 73.425431 54.373823 73.528691 54.838496 73.599096 55.077874 73.671848 54.636669 73.655421 54.242400 73.589709 53.866907 73.676542 53.679160 73.753988 53.669773 73.763375 # -b 52.310955 71.287464 52.578494 71.355522 52.963375 71.299198 53.193365 71.120839 53.151122 70.956560 53.005618 71.008190 52.620737 71.207671 52.310955 71.287464 # -b 58.764752 69.968543 58.666185 70.125780 58.699040 70.182105 58.633329 70.273631 58.863319 70.412094 59.360848 70.290059 59.769197 70.146902 59.769197 70.146902 # -b 47.624325 80.005956 47.727586 79.961367 47.915333 79.989529 47.915333 79.989529 # -b 29.957350 70.705449 30.332844 70.590454 30.605077 70.524742 30.971183 70.405054 30.661401 70.247816 30.196728 70.130474 29.999593 70.069456 # -b 19.987995 78.968655 20.354101 78.909984 20.861017 78.874782 21.358547 78.858354 21.424258 78.785602 21.377321 78.701116 21.161412 78.658873 20.738982 78.679995 20.457362 78.635405 20.119418 78.614283 20.025544 78.588468 # -b 21.389055 78.604896 21.398443 78.581427 21.614352 78.574387 22.121268 78.588468 22.337177 78.503982 22.215141 78.431230 22.121268 78.316235 21.933521 78.252871 21.548640 78.229402 21.144985 78.182465 20.788266 78.224709 20.647455 78.306848 20.638068 78.417149 20.178088 78.471126 20.675617 78.508676 21.013562 78.541531 21.276407 78.614283 21.389055 78.604896 # -b 22.888683 78.281033 22.926232 78.248177 22.982556 78.220015 23.076430 78.203587 23.170303 78.208281 23.254789 78.170731 23.358050 78.137876 23.292339 78.119101 23.311113 78.083898 23.104592 78.067471 23.048268 78.015840 23.113979 77.957169 23.273564 77.924314 23.498860 77.875030 23.714769 77.835134 24.033939 77.844521 24.202911 77.886764 24.428207 77.842174 24.522080 77.802278 24.615954 77.781157 24.691052 77.745954 24.888187 77.734220 24.831862 77.701364 24.691052 77.703711 24.493918 77.691977 24.202911 77.663815 24.127812 77.621572 24.005777 77.595757 23.864966 77.544126 23.818030 77.497190 23.714769 77.459640 23.611508 77.422091 23.461311 77.405663 23.367437 77.377501 23.273564 77.361073 23.160916 77.393929 23.057655 77.361073 22.879296 77.325871 22.869908 77.288321 22.757260 77.260159 22.663387 77.278934 22.550739 77.257812 22.438091 77.290668 22.503802 77.344645 22.578901 77.408010 22.672774 77.464334 22.804197 77.497190 22.832359 77.539433 22.663387 77.490149 22.578901 77.518311 22.616450 77.553514 22.381767 77.548820 22.259731 77.487802 22.071984 77.480762 21.884238 77.469028 21.658941 77.461987 21.424258 77.457293 21.245898 77.433825 21.114476 77.443212 20.926729 77.447906 20.870405 77.497190 20.907954 77.534739 20.954891 77.569942 21.217736 77.612185 21.236511 77.659121 21.255286 77.727179 21.367934 77.788197 21.499357 77.872683 21.555681 77.914926 21.302222 77.947782 21.152025 77.990025 20.992440 78.018187 20.842243 78.051043 20.898567 78.095633 21.161412 78.128488 21.499357 78.170731 21.780977 78.194200 22.062597 78.173078 22.306668 78.184812 22.541351 78.205934 22.578901 78.220015 22.719711 78.227055 22.813584 78.238790 22.888683 78.281033 22.888683 78.281033 # -b 26.427710 78.703463 26.465260 78.694076 26.540358 78.654179 26.737493 78.626017 26.897077 78.665914 26.887690 78.687035 26.671781 78.736319 26.615457 78.773868 26.446485 78.806724 26.399548 78.776215 26.380774 78.748053 26.408936 78.722238 26.427710 78.703463 # -b 28.976373 78.839579 29.023310 78.839579 29.201670 78.823151 29.304930 78.851313 29.502064 78.865395 29.549001 78.893557 29.483290 78.893557 29.304930 78.874782 29.098409 78.893557 28.966986 78.902944 28.976373 78.921719 28.685366 78.935800 28.600880 78.954574 28.441295 78.942840 28.460070 78.919372 28.394358 78.912331 28.291097 78.893557 28.150287 78.895903 28.000090 78.874782 27.981315 78.837232 27.793568 78.858354 27.802956 78.825498 27.849892 78.806724 28.037639 78.806724 28.150287 78.841926 28.338034 78.863048 28.347422 78.863048 28.478844 78.856007 28.535168 78.884169 28.713528 78.884169 28.901275 78.858354 28.976373 78.839579 # -b 27.112986 80.005956 27.037888 79.935551 27.075437 79.907389 27.169310 79.860453 27.037888 79.818210 26.775042 79.808822 26.587295 79.750151 26.587295 79.724336 26.446485 79.682093 26.324450 79.684440 26.221189 79.642197 26.052217 79.651584 25.958343 79.630463 25.826921 79.567098 25.948956 79.517815 25.902019 79.487306 25.817533 79.470878 25.761209 79.447410 25.695498 79.409860 25.657948 79.377005 25.442040 79.351189 25.338779 79.332415 25.207356 79.332415 25.122870 79.313640 25.019609 79.332415 24.869412 79.351189 24.784926 79.341802 24.531468 79.301906 24.296784 79.290172 24.240460 79.252622 24.155974 79.210379 24.052713 79.172830 23.949452 79.175177 23.827417 79.154055 23.686607 79.147015 23.592734 79.147015 23.386212 79.147015 23.367437 79.154055 23.236015 79.154055 23.170303 79.170483 22.935620 79.177524 22.954394 79.198645 22.804197 79.226807 22.813584 79.238541 22.672774 79.254969 22.607063 79.323027 22.700936 79.365270 22.644612 79.372311 22.494415 79.367617 22.231569 79.384045 22.090759 79.386392 21.921787 79.358230 21.734040 79.369964 21.565068 79.377005 21.555681 79.395779 21.461807 79.386392 21.377321 79.374658 21.255286 79.372311 21.095701 79.369964 21.029990 79.351189 20.879792 79.339455 20.729595 79.369964 20.720207 79.416901 20.598172 79.433329 20.344714 79.430982 20.166354 79.454450 20.091256 79.484959 # -b 19.931671 79.614035 20.185129 79.597607 20.325939 79.553017 20.682658 79.553017 20.898567 79.553017 21.095701 79.548324 21.039377 79.578832 20.814081 79.588220 20.682658 79.602301 20.607559 79.628116 20.579397 79.658625 20.767144 79.679746 20.936116 79.658625 21.114476 79.679746 21.311610 79.693827 21.508744 79.679746 21.809139 79.682093 21.818526 79.707908 21.940562 79.710255 21.996886 79.752498 21.799752 79.759539 21.931174 79.794741 21.846688 79.787701 21.649554 79.799435 21.443033 79.775967 21.217736 79.773620 20.870405 79.775967 20.785919 79.780660 20.466749 79.764232 20.354101 79.750151 20.138192 79.750151 20.025544 79.721989 # -b 22.128308 80.010650 22.325443 79.982488 22.438091 79.991875 # -b 21.320997 69.888750 21.255286 70.013132 # -b 21.973417 69.989664 21.696491 70.088231 21.541600 70.283018 21.795058 70.137515 21.940562 70.245469 22.161164 70.231388 22.358298 70.107006 22.564820 70.193839 22.940313 70.170370 22.841746 70.095272 22.987250 70.048335 # -b 23.228974 69.956808 23.252442 70.168024 23.505901 70.297099 24.111384 70.447297 24.346068 70.602188 24.421166 70.721877 24.566670 70.773507 24.730949 70.921358 24.984407 70.916664 25.195622 70.775854 25.622746 70.860340 25.669683 70.733611 25.270721 70.555251 25.172154 70.405054 25.129911 70.252510 24.909308 70.111699 25.214397 70.125780 25.327045 70.226694 25.711926 70.496580 26.012321 70.653818 26.439445 70.893196 26.674128 70.834525 26.495769 70.653818 26.584948 70.459031 26.824326 70.451991 27.091865 70.602188 27.246756 70.726570 27.500214 70.926051 27.673880 71.043393 28.129166 71.057474 28.448335 70.963601 27.974275 70.799322 27.753672 70.609229 28.284057 70.616269 27.974275 70.444950 28.284057 70.426175 28.523434 70.543517 28.734649 70.834525 29.166467 70.846259 29.297890 70.726570 29.316664 70.656165 29.715626 70.672593 29.959697 70.705449 29.959697 70.705449 # -b 30.001940 70.069456 29.372988 70.102312 28.922396 70.151596 28.645470 70.125780 29.063206 70.043641 29.175854 70.001398 # -b 19.999729 70.095272 20.065440 70.074150 # -b 20.682658 70.214960 20.790612 70.175064 20.701433 70.027213 20.560623 70.062416 20.527767 70.196186 20.682658 70.214960 # -b 22.733792 70.226694 22.466253 70.285365 22.602369 70.353423 22.822972 70.327608 22.888683 70.231388 22.733792 70.226694 # -b 22.358298 70.646778 22.433397 70.674940 22.555432 70.689021 22.564820 70.623310 22.776035 70.681980 22.921539 70.672593 23.085817 70.583413 22.888683 70.508315 22.564820 70.484846 22.301974 70.522396 22.179939 70.574026 22.170551 70.632697 22.358298 70.646778 # -b 23.383865 70.327608 23.243055 70.283018 22.989597 70.334649 22.966129 70.433216 23.111632 70.466072 23.332235 70.510661 23.562225 70.496580 23.383865 70.327608 23.383865 70.327608 # -b 23.935371 70.517702 23.747625 70.602188 23.789868 70.681980 24.033939 70.590454 24.043326 70.524742 23.935371 70.517702 # -b 25.831614 71.062168 25.977118 70.989416 25.920794 70.954213 25.723660 70.916664 25.503057 70.933092 25.423265 70.928398 25.568769 71.017578 25.301230 71.043393 25.653255 71.078596 25.831614 71.062168 25.831614 71.062168 # -b 14.749859 79.740764 15.031479 79.719642 15.115965 79.682093 15.228613 79.616382 15.284937 79.534243 15.341261 79.445063 15.369423 79.416901 15.388198 79.358230 15.491459 79.247929 15.435135 79.175177 15.472684 79.137627 15.632269 79.165789 15.885727 79.057835 16.082861 78.961615 16.458355 78.900597 16.289383 79.008551 16.064086 79.114159 15.979600 79.233848 15.876340 79.360577 15.829403 79.459144 15.791854 79.574139 15.754304 79.691480 15.669818 79.724336 15.735530 79.820556 16.035924 79.867493 15.970213 79.928511 15.998375 79.998916 # -b 16.556922 80.010650 16.575697 79.937898 16.575697 79.867493 16.857317 79.848718 16.951190 79.919123 17.251585 79.895655 17.683403 79.808822 17.871150 79.705561 17.749114 79.630463 17.570755 79.536589 17.645853 79.499040 17.702177 79.421594 17.570755 79.332415 17.758501 79.386392 18.049509 79.459144 17.983798 79.527202 18.115220 79.590567 18.453165 79.571792 18.650299 79.475572 18.781722 79.393432 18.781722 79.313640 18.725397 79.208032 19.044567 79.165789 19.504547 79.128240 19.673519 79.093038 19.842491 78.992124 19.983301 78.968655 # -b 20.020850 78.588468 19.758005 78.579081 19.589033 78.534491 19.354349 78.461739 19.016405 78.414802 19.035180 78.276339 19.016405 78.227055 18.969468 78.140222 18.969468 78.008800 18.687848 78.025228 18.425003 77.975944 18.434390 77.882071 18.462552 77.776463 18.387453 77.670855 18.387453 77.598104 18.331129 77.555861 18.274805 77.469028 17.946248 77.469028 17.608304 77.400969 17.814825 77.363420 17.467494 77.311790 17.383008 77.215569 17.392395 77.138124 17.354846 77.063025 17.383008 76.994967 17.354846 76.933949 17.082613 76.851810 17.063838 76.788445 17.120162 76.675797 17.045064 76.603045 16.678957 76.553762 16.538147 76.610086 16.331626 76.556109 16.331626 76.657023 15.965519 76.755590 15.599413 76.882319 15.918583 76.922215 16.218978 76.891706 16.256527 76.976192 15.909195 77.006701 15.608800 76.983233 15.195757 77.002007 14.970461 77.091187 14.416608 77.152205 14.228861 77.239038 14.088051 77.330564 14.097439 77.433825 14.275798 77.560554 14.548031 77.513617 14.773327 77.492496 15.026785 77.506577 15.374117 77.515964 15.571251 77.494843 15.993681 77.499536 15.571251 77.569942 15.045560 77.586369 14.895363 77.656774 15.242694 77.677896 15.599413 77.715445 15.890421 77.710752 16.078167 77.752995 16.303464 77.781157 16.509985 77.771769 16.829155 77.767076 16.791605 77.865643 16.810380 77.903192 16.538147 77.842174 16.068780 77.821053 15.796547 77.799931 15.543089 77.825747 15.242694 77.778810 15.092497 77.762382 14.895363 77.769423 14.688841 77.767076 14.519869 77.741260 14.238249 77.757688 13.890917 77.710752 13.797044 77.776463 13.703170 77.860949 13.646846 77.947782 13.721945 78.029921 14.022340 78.013493 14.275798 77.980638 14.369671 78.065124 14.867201 78.067471 15.111271 78.144916 15.355342 78.227055 15.683899 78.229402 15.730836 78.313888 16.059393 78.342050 16.284689 78.339703 16.613246 78.318582 16.885479 78.344397 17.110775 78.377253 17.307909 78.433577 16.894866 78.386640 16.660183 78.433577 16.425499 78.431230 16.472436 78.518063 16.697732 78.616630 16.669570 78.710503 16.378562 78.665914 16.265914 78.525103 15.881033 78.459392 15.496152 78.464086 15.289631 78.574387 15.543089 78.715197 15.252082 78.762134 15.111271 78.626017 14.857813 78.633058 14.754552 78.722238 14.529256 78.597855 14.416608 78.445311 14.688841 78.367865 14.369671 78.363172 14.181925 78.283379 13.994178 78.224709 13.703170 78.189506 13.515424 78.187159 13.355839 78.191853 13.074219 78.220015 13.036669 78.281033 12.877084 78.337357 12.623626 78.374906 12.473429 78.473473 12.970958 78.478167 12.989732 78.525103 12.567302 78.539184 12.032224 78.597855 11.910188 78.679995 11.675505 78.738665 11.910188 78.802030 11.788153 78.839579 11.346948 78.949881 11.938350 78.909984 12.417105 78.917025 12.126097 78.942840 11.844477 79.006205 11.853864 79.095384 12.004062 79.193951 12.022836 79.269050 11.769378 79.215073 11.365723 79.264356 11.450209 79.109465 11.159201 79.161096 10.999616 79.278437 10.933905 79.323027 10.830644 79.294865 10.811869 79.428635 10.671059 79.517815 11.009004 79.543630 10.774320 79.656278 10.990229 79.646891 11.309398 79.628116 11.140426 79.743111 11.403272 79.724336 11.459596 79.787701 11.637955 79.815863 11.844477 79.724336 12.079160 79.686787 12.201196 79.705561 12.135484 79.820556 12.323231 79.764232 12.623626 79.738417 12.970958 79.775967 13.477874 79.822903 13.797044 79.787701 13.768882 79.693827 13.337064 79.693827 12.961570 79.642197 12.435879 79.564751 12.595464 79.517815 13.102381 79.562405 13.393388 79.534243 13.271353 79.447410 13.421550 79.416901 13.740720 79.327721 14.228861 79.200992 14.012953 79.323027 13.872142 79.487306 14.088051 79.611688 14.303960 79.721989 14.519869 79.773620 14.745165 79.740764 # -b 10.513821 78.874782 10.757892 78.851313 10.992576 78.762134 11.161548 78.665914 11.283583 78.572040 11.368069 78.525103 11.630915 78.454698 11.874986 78.398374 11.940697 78.311541 12.072120 78.250524 12.025183 78.201240 11.818662 78.257564 11.649690 78.337357 11.443168 78.398374 11.264809 78.431230 11.020738 78.464086 10.832991 78.616630 10.570145 78.731625 10.513821 78.846620 10.513821 78.874782 # -b 18.884982 74.453344 18.894370 74.436917 19.025792 74.394674 19.016405 74.345390 19.204152 74.373552 19.237008 74.429876 19.227620 74.476813 19.049261 74.519056 18.960081 74.486200 18.870901 74.469772 18.884982 74.453344 # -b 20.086562 79.484959 19.889428 79.515468 19.729843 79.553017 19.701681 79.588220 19.917590 79.606994 19.926977 79.614035 # -b 20.020850 79.721989 19.739230 79.726683 19.664132 79.707908 19.438835 79.689134 19.298025 79.710255 19.129053 79.710255 18.941306 79.717296 18.809884 79.710255 18.678461 79.729030 18.678461 79.757192 18.622137 79.780660 18.490714 79.768926 18.425003 79.804129 18.312355 79.832291 18.274805 79.867493 18.190319 79.893308 18.453165 79.928511 18.500101 79.949632 18.565813 79.961367 18.706623 79.980141 18.725397 79.989529 # -b 18.863861 70.020173 18.863861 70.020173 # -b 18.786415 69.989664 18.739479 70.081191 19.114972 70.055375 19.147828 70.031907 # -b 19.215886 69.987317 19.347309 70.006092 # -b 18.884982 69.975583 18.917838 70.017826 18.861514 70.020173 # -b 19.821369 70.158636 19.943405 70.137515 19.999729 70.095272 # -b 20.065440 70.074150 19.722802 70.062416 19.549137 70.231388 19.713415 70.193839 19.821369 70.158636 # -b -14.205393 -7.918222 -14.228861 -7.962812 -14.205393 -7.918222 # -b -36.157689 -10.150062 -35.892496 -9.856708 -35.385580 -9.298161 -35.010086 -8.465034 -34.834074 -7.819655 -34.878664 -6.817556 -35.188446 -5.585468 -35.904231 -5.120794 -36.643484 -5.177118 -37.270089 -4.768769 -38.152499 -4.125736 -38.539726 -3.761977 -39.386934 -3.163534 -39.983030 -2.886607 # -b -50.048606 0.037549 -49.917183 -0.018775 # -b -39.983030 -2.886607 -40.832584 -2.910076 -42.001308 -2.820896 -42.904840 -2.588559 -43.313189 -2.489992 -43.545526 -2.400812 -43.864695 -2.600293 -44.249576 -2.755184 -44.371612 -2.788040 -44.493647 -2.600293 -44.327022 -2.257655 -44.603948 -2.201331 -44.493647 -1.990116 -44.747105 -1.513709 -45.033419 -1.546564 -45.340855 -1.492587 -45.782060 -1.203926 -45.993275 -1.126481 -46.631614 -0.938734 -47.138530 -0.694663 -47.403723 -0.661808 -47.943495 -0.694663 -47.999819 -0.793230 -48.142976 -1.081891 -48.340110 -1.260250 -48.527857 -1.546564 -48.980796 -1.736658 -49.156809 -2.177863 -49.278844 -2.511114 -49.365677 -2.245921 -49.222520 -1.846959 -49.332821 -1.724924 -48.804783 -1.424529 -48.462145 -0.837820 -48.372966 -0.295701 -49.091097 -0.218256 -49.222520 -0.307435 -49.938305 -0.206521 -50.015750 -0.239377 -50.280943 -0.373147 -50.337267 -0.938734 -50.665824 -0.983324 -51.196208 -1.192192 -51.261920 -0.894144 -51.362834 -0.438858 -50.931016 -0.007041 -50.931016 -0.007041 # -b -80.017691 -2.290511 -79.907389 -2.257655 -79.862799 -2.555703 -79.752498 -2.555703 -79.862799 -2.966400 -79.982488 -3.240979 -79.982488 -3.240979 # -b -80.038812 -6.808169 -79.618729 -7.369062 -79.323027 -7.939343 -78.914678 -8.324224 -78.748053 -8.730227 -78.539184 -9.155004 -78.374906 -9.582128 -78.229402 -9.985783 -78.229402 -9.985783 # -b -89.355748 -0.748640 -89.355748 -0.870676 -89.609206 -0.959856 -89.466049 -0.783843 -89.355748 -0.748640 # -b -80.059934 0.171319 -80.402572 -0.361413 -80.468283 -0.715785 -80.864898 -1.081891 -80.864898 -1.692068 -80.832042 -2.189597 -80.843777 -2.335101 -80.512873 -2.543969 -80.313392 -2.677739 -80.160847 -2.511114 -80.017691 -2.290511 -80.017691 -2.290511 # -b -79.982488 -3.240979 -80.259415 -3.395870 -80.346247 -3.508519 -80.799187 -3.851156 -81.174680 -4.203182 -81.284982 -4.691323 -81.130090 -5.087939 -80.986933 -5.451698 -81.040911 -5.848313 -80.888366 -6.212073 -80.226559 -6.632156 -80.038812 -6.808169 # -b -91.460859 -0.328557 -91.428003 -0.528038 -91.648605 -0.429471 -91.472593 -0.340291 -91.460859 -0.328557 # -b -91.371679 0.103261 -91.097099 -0.417737 -90.942208 -0.682929 -91.040775 -1.016180 -91.428003 -1.081891 -91.371679 -0.772109 -91.219135 -0.506916 -91.395147 -0.185400 -91.526570 -0.051630 -91.526570 -0.051630 # -b -90.712218 -0.206521 -90.876497 -0.373147 -90.667628 -0.417737 -90.712218 -0.206521 -90.712218 -0.206521 # -b -90.346112 -0.528038 -90.524471 -0.572628 -90.524471 -0.572628 -90.346112 -0.528038 # -b -140.030958 -8.727880 -139.965247 -8.903892 -139.965247 -8.903892 # -b -138.960802 -9.713551 -138.871622 -9.692429 -138.751933 -9.746406 -138.949067 -9.767528 -138.960802 -9.713551 # -b -140.087283 -8.727880 -140.054427 -8.718493 -140.030958 -8.727880 # -b -139.965247 -8.903892 -140.120138 -8.892158 -140.087283 -8.727880 -140.087283 -8.727880 # -b -157.906802 -9.002460 -157.784766 -9.014194 -157.805888 -9.089292 -157.906802 -9.002460 # -b -173.062663 -2.776306 -173.062663 -2.776306 -173.062663 -2.776306 # -b -170.668891 -3.705653 -170.657157 -3.693918 -170.668891 -3.705653 # -b -171.804759 -9.145616 -171.750782 -9.232449 -171.804759 -9.145616 # -b 174.318220 -0.635992 174.383931 -0.814352 174.318220 -0.635992 174.318220 -0.635992 # -b 160.816877 -8.389936 160.969421 -8.422791 161.091457 -8.772470 161.389505 -9.155004 161.478685 -9.319282 161.675819 -9.570394 161.445829 -9.483561 161.014011 -8.957870 160.837999 -8.422791 160.816877 -8.389936 # -b 160.263024 -8.990725 160.441384 -8.969604 160.417915 -9.133882 160.263024 -8.990725 # -b 159.932120 -9.331016 160.209047 -9.363872 160.352204 -9.375606 160.671373 -9.537538 160.969421 -9.701816 160.694842 -9.887216 160.220781 -9.833239 160.075277 -9.833239 # -b 169.537717 -0.835473 169.558838 -0.802618 169.549451 -0.924653 169.537717 -0.835473 169.537717 -0.835473 # -b 150.129390 -2.475911 150.371114 -2.410200 150.549474 -2.642536 150.206836 -2.576825 150.129390 -2.475911 # -b 150.957823 -2.642536 151.145570 -2.698860 151.563306 -2.964053 152.126547 -3.240979 152.558364 -3.583617 152.889268 -3.905134 153.220172 -4.191448 153.220172 -4.545820 152.910390 -4.578675 152.713256 -3.905134 152.403473 -3.485050 151.938800 -3.318425 151.521063 -3.029764 151.100980 -2.764572 150.957823 -2.642536 150.957823 -2.642536 # -b 149.908788 -5.517409 150.084800 -5.240483 150.293668 -5.085592 150.293668 -5.496288 150.746608 -5.517409 151.187813 -5.273339 151.640752 -4.954169 151.786256 -4.512964 151.873089 -4.224303 152.150015 -4.236037 152.403473 -4.257159 152.480919 -4.843868 152.203992 -5.130182 152.006858 -5.583121 151.697076 -5.770868 151.035268 -6.190951 150.472028 -6.277784 150.105922 -6.322374 # -b 154.677557 -4.954169 154.743268 -5.076204 154.743268 -5.296807 154.677557 -4.954169 154.677557 -4.954169 # -b 154.832448 -5.418842 155.097640 -5.484554 155.494255 -5.970349 156.012906 -6.432675 156.024640 -6.740110 155.592822 -6.796435 155.318242 -6.244928 154.865303 -5.770868 154.832448 -5.418842 154.832448 -5.418842 # -b 156.587880 -6.596954 156.874194 -6.751845 157.195711 -6.972447 157.568857 -7.157847 157.249688 -7.202437 156.674713 -6.718989 156.587880 -6.596954 # -b 156.653592 -7.500485 156.862460 -7.709353 156.752159 -7.775065 156.653592 -7.500485 156.653592 -7.500485 # -b 157.205098 -7.850164 157.172242 -8.082500 157.151121 -7.796186 157.205098 -7.850164 # -b 157.371723 -8.181067 157.493759 -7.960465 157.702627 -8.148212 157.834050 -8.488503 157.449169 -8.246779 157.371723 -8.181067 # -b 157.383457 -8.554214 157.449169 -8.422791 157.458556 -8.608191 157.383457 -8.554214 # -b 158.045265 -8.608191 158.089855 -8.509624 158.176688 -8.641047 158.045265 -8.608191 # -b 158.629627 -7.509872 158.915941 -7.653029 159.326637 -7.906488 159.699784 -8.103622 159.932120 -8.324224 159.821819 -8.399323 159.368880 -8.103622 158.915941 -7.873632 158.629627 -7.509872 158.629627 -7.509872 # -b 159.678662 -9.277039 159.932120 -9.331016 159.932120 -9.331016 # -b 160.075277 -9.833239 159.666928 -9.504682 159.678662 -9.277039 # -b 152.722643 -8.948482 153.065281 -9.166738 152.811823 -9.145616 152.722643 -8.948482 # -b 150.648041 -9.342751 150.889765 -9.396728 151.077511 -9.701816 150.659775 -9.528151 150.648041 -9.342751 # -b 150.967210 -9.800383 151.187813 -9.952928 151.375559 -9.964662 # -b 151.122101 -10.018639 150.967210 -9.800383 150.967210 -9.800383 # -b 149.953377 -9.593862 150.150512 -9.692429 150.019089 -9.767528 # -b 146.695970 -1.999504 146.850861 -2.032359 147.116054 -2.210719 146.895451 -2.198985 146.728826 -2.067562 146.695970 -1.999504 # -b 149.664717 -1.335349 149.852463 -1.511362 149.643595 -1.379939 149.664717 -1.335349 # -b 147.181765 -5.252217 147.357778 -5.395374 147.170031 -5.341397 147.181765 -5.252217 # -b 147.921018 -5.538531 148.031319 -5.529144 148.207332 -5.738012 148.019585 -5.726278 147.921018 -5.538531 147.921018 -5.538531 # -b 148.451403 -5.517409 148.650884 -5.496288 149.235246 -5.538531 149.599005 -5.538531 149.908788 -5.517409 # -b 150.105922 -6.322374 149.509826 -6.134627 148.925464 -5.937493 148.451403 -5.529144 148.451403 -5.517409 # -b 141.119890 -2.576825 141.495384 -2.731716 142.025768 -2.919463 142.577275 -3.172921 143.128781 -3.318425 143.703755 -3.506172 144.323320 -3.759630 144.764525 -4.081146 145.438067 -4.468374 145.956717 -5.076204 146.022429 -5.505675 146.663115 -5.726278 147.214621 -5.946880 147.777861 -6.090037 147.998464 -6.718989 147.500935 -6.805822 147.268598 -7.049893 147.590114 -7.542728 148.075909 -7.972199 148.141621 -8.049644 # -b 148.129886 -8.049644 148.308246 -8.115356 148.451403 -8.608191 148.871486 -9.079905 149.312691 -9.023581 149.357281 -9.441318 149.953377 -9.593862 149.953377 -9.593862 # -b 150.019089 -9.767528 149.953377 -9.898951 # -b 147.899897 -10.051495 147.479813 -9.570394 147.202887 -9.396728 147.083198 -9.220715 146.773416 -9.035315 146.409656 -8.476768 145.966105 -8.049644 145.438067 -7.861898 145.259707 -7.817308 144.940538 -7.664764 144.687079 -7.620174 144.377297 -7.643642 143.903236 -7.554462 143.870381 -8.026176 143.605188 -8.190455 143.128781 -8.366467 143.426829 -8.793591 143.262550 -9.035315 142.908178 -9.253571 142.544419 -9.211328 142.290961 -9.178472 141.805166 -9.220715 141.518852 -9.133882 141.119890 -9.056437 140.502672 -8.488503 140.115445 -8.136477 140.028612 -8.059032 # -b 139.927698 -2.344488 140.336047 -2.353876 140.612974 -2.398466 140.833576 -2.499379 140.964999 -2.586212 141.119890 -2.576825 141.119890 -2.576825 # -b 140.028612 -8.059032 139.420781 -8.148212 139.024166 -8.169333 138.956108 -8.357080 138.538371 -8.357080 138.007987 -8.432179 137.975131 -8.059032 138.383480 -7.455895 138.934986 -7.509872 138.878662 -7.258761 138.836419 -7.103870 138.768361 -6.730723 138.503169 -6.256662 138.449192 -5.803723 138.183999 -5.451698 137.864830 -5.296807 137.752182 -5.174771 137.400156 -5.043349 136.893240 -4.897845 136.252554 -4.688977 135.701048 -4.534085 135.257496 -4.468374 135.060362 -4.379194 134.750579 -4.003701 134.396207 -4.102268 134.065304 -3.837075 133.811845 -3.527293 133.877557 -2.975787 133.746134 -3.428726 133.570121 -3.837075 133.194628 -4.114002 132.896580 -4.024822 132.851990 -3.562496 132.575063 -3.118944 131.990701 -2.952319 132.443640 -2.698860 133.060858 -2.553357 133.645220 -2.565091 133.889291 -2.187250 133.382375 -2.243574 132.521086 -2.276430 132.044679 -2.067562 131.802955 -1.600542 131.317160 -1.457385 130.986256 -1.457385 131.007377 -1.314228 131.251448 -0.868329 131.648063 -0.781496 132.166714 -0.427124 132.905967 -0.415390 133.415230 -0.790883 134.023061 -0.790883 134.231929 -1.555952 134.187339 -2.243574 134.473653 -2.797427 134.705990 -2.609681 134.938326 -3.184655 135.379531 -3.384136 135.853592 -3.086088 136.097663 -2.776306 136.473156 -2.264696 136.881506 -2.198985 137.245265 -1.889202 137.555047 -1.612276 138.017374 -1.469119 138.437457 -1.689721 138.845807 -1.889202 139.409047 -2.121539 139.817396 -2.321020 139.927698 -2.344488 # -b 135.489832 -0.748640 135.665845 -0.704051 136.020217 -0.826086 136.329999 -1.147602 135.942772 -1.135868 135.588400 -0.826086 135.489832 -0.748640 # -b 135.611868 -1.633397 135.755025 -1.600542 136.207964 -1.689721 136.747736 -1.722577 136.660903 -1.910324 136.074194 -1.811757 135.632989 -1.677987 135.611868 -1.633397 # -b 130.423015 -0.114995 130.500461 -0.070405 131.260836 -0.337944 130.852486 -0.436511 130.455871 -0.281620 130.423015 -0.114995 130.423015 -0.114995 # -b 130.699942 -0.990364 130.908810 -0.912919 131.007377 -1.269638 130.732798 -1.091278 130.699942 -0.990364 # -b 129.958342 -1.800023 130.300980 -1.710843 130.390160 -1.999504 130.047522 -2.088683 # -b 129.892631 -3.018030 130.345570 -3.008643 130.631884 -3.363015 130.864220 -3.726774 130.512195 -3.738508 130.035788 -3.473316 130.035788 -3.473316 # -b 133.072592 -5.395374 133.194628 -5.362518 133.028002 -5.681688 133.072592 -5.395374 # -b 134.297640 -5.803723 134.506509 -5.451698 134.762314 -5.726278 134.738845 -6.003204 134.705990 -6.376351 134.407941 -6.212073 134.431410 -5.836579 134.297640 -5.803723 # -b 134.231929 -6.212073 134.199073 -6.101771 134.309374 -6.179217 134.518243 -6.310640 134.595688 -6.498386 134.452531 -6.432675 134.253050 -6.244928 134.231929 -6.212073 # -b 134.175605 -6.233194 134.375086 -6.432675 134.485387 -6.674399 134.264785 -6.939591 134.098159 -6.653278 134.243663 -6.695521 134.175605 -6.355230 134.175605 -6.233194 # -b 131.183390 -7.784452 131.239714 -7.653029 131.460317 -7.345594 131.713775 -7.202437 131.594086 -7.763331 131.317160 -7.972199 131.183390 -7.784452 # -b 129.782329 -1.856347 129.880897 -1.856347 129.958342 -1.800023 # -b 130.047522 -2.088683 129.782329 -1.856347 129.782329 -1.856347 # -b 127.982307 -3.527293 127.961185 -3.130678 128.238112 -2.863139 128.700438 -2.907729 129.197968 -2.907729 129.728352 -2.898341 129.892631 -3.018030 # -b 130.035788 -3.473316 129.540605 -3.363015 129.242557 -3.449848 128.899919 -3.285569 128.536160 -3.485050 128.160666 -3.196389 128.026897 -3.461582 127.982307 -3.527293 # -b 129.650907 -7.906488 129.838654 -7.850164 129.716618 -8.026176 129.650907 -7.906488 # -b 128.590137 -7.181315 128.688704 -7.148460 128.590137 -7.181315 128.590137 -7.181315 # -b 125.907705 -8.026176 125.961682 -7.697619 126.393500 -7.664764 126.679813 -7.608439 126.658692 -7.850164 126.161163 -7.983933 125.907705 -8.026176 # -b 124.781224 -9.068171 124.990092 -8.903892 125.278753 -8.652781 125.797403 -8.563601 126.217487 -8.521358 126.780727 -8.432179 127.198464 -8.411057 126.834705 -8.793591 126.128307 -9.089292 125.511090 -9.286427 125.112128 -9.417849 125.067538 -9.603249 124.825814 -9.887216 124.825814 -9.887216 # -b 123.722801 -10.009252 123.711067 -9.626718 124.053705 -9.352138 124.307163 -9.232449 124.616945 -9.133882 124.781224 -9.068171 # -b 124.494910 -8.190455 124.670923 -8.190455 125.112128 -8.267900 124.748368 -8.455647 124.527766 -8.300756 124.494910 -8.190455 # -b 124.020849 -8.465034 124.164006 -8.267900 124.173394 -8.554214 124.020849 -8.465034 # -b 123.356695 -8.521358 123.466996 -8.223310 123.666477 -8.202189 123.722801 -8.432179 123.413019 -8.575336 123.356695 -8.521358 # -b 120.000721 -8.443913 120.254179 -8.324224 120.662528 -8.213923 121.138936 -8.345346 121.490961 -8.575336 121.955634 -8.443913 122.230214 -8.563601 122.638563 -8.411057 122.915490 -8.256166 122.870900 -8.037910 122.960080 -8.399323 122.596320 -8.706758 121.976756 -8.849915 121.336070 -8.903892 120.772829 -8.838181 120.188467 -8.805325 120.033576 -8.817060 # -b 119.878685 -8.488503 120.000721 -8.443913 # -b 120.000721 -9.277039 120.244791 -9.462439 120.608551 -9.713551 120.796298 -9.931806 # -b 119.902154 -9.352138 120.000721 -9.277039 # -b 120.188467 0.028162 120.155612 -0.758028 120.629672 -1.201580 121.138936 -1.379939 121.469839 -0.957509 121.899310 -0.924653 122.286538 -0.802618 122.838044 -0.790883 123.037525 -0.582015 123.478730 -0.692316 123.114971 -0.903532 122.518875 -1.412795 121.943900 -1.734311 121.413515 -1.800023 121.899310 -2.421934 122.298272 -2.898341 122.417961 -3.327812 122.286538 -3.637594 122.605708 -4.081146 122.894368 -4.280627 122.495406 -4.435518 121.932166 -4.864989 121.547285 -4.379194 121.314948 -3.860544 121.127202 -3.118944 121.049756 -2.642536 120.387948 -2.919463 120.441926 -3.649329 120.420804 -4.578675 120.387948 -5.285073 120.155612 -5.615976 120.155612 -5.615976 # -b 121.866455 -5.198240 122.033080 -5.130182 122.009612 -5.439964 121.866455 -5.198240 121.866455 -5.198240 # -b 122.375718 -4.721832 122.450817 -4.733566 122.694887 -4.667855 122.727743 -5.052736 122.596320 -5.317928 122.331128 -5.120794 122.375718 -4.721832 122.375718 -4.721832 # -b 122.805189 -4.998759 122.861513 -4.677242 122.981201 -4.358073 123.201804 -4.754688 123.014057 -4.965903 123.168948 -5.240483 122.948346 -5.538531 122.673766 -5.439964 122.805189 -4.998759 122.805189 -4.998759 # -b 123.037525 -4.015435 123.114971 -3.991967 123.213538 -4.224303 123.025791 -4.036556 123.037525 -4.015435 # -b 123.070381 -1.156990 123.201804 -1.213314 123.014057 -1.555952 122.861513 -1.290759 123.070381 -1.156990 123.070381 -1.156990 # -b 123.225272 -1.379939 123.511586 -1.269638 123.457609 -1.555952 123.213538 -1.511362 123.225272 -1.379939 # -b 124.417464 -1.668600 124.616945 -1.668600 124.957236 -1.746045 125.213041 -1.734311 125.213041 -1.823491 124.769490 -1.910324 124.450320 -1.910324 124.417464 -1.668600 124.417464 -1.668600 # -b 125.421910 -1.823491 125.630778 -1.856347 125.996884 -1.800023 126.304320 -1.788288 125.907705 -1.910324 125.466500 -1.877468 125.421910 -1.823491 # -b 125.907705 -2.011238 125.973416 -2.177863 125.996884 -2.377344 125.907705 -2.011238 125.907705 -2.011238 # -b 126.062596 -3.086088 126.238608 -3.140065 126.736137 -3.018030 127.088163 -3.327812 127.165608 -3.693918 126.548391 -3.804220 126.095451 -3.372402 126.062596 -3.086088 126.062596 -3.086088 # -b 127.928330 0.061018 128.170054 -0.647726 128.280355 -0.891797 127.749970 -0.269886 127.749970 -0.269886 # -b 127.353355 -0.359066 127.597426 -0.459980 127.839150 -0.781496 127.519980 -0.802618 127.365089 -0.427124 127.353355 -0.359066 # -b 127.409679 -1.445650 127.794560 -1.391673 128.160666 -1.600542 127.707727 -1.701455 127.397945 -1.591154 127.409679 -1.445650 # -b 128.059752 -3.815954 128.005775 -3.705653 128.238112 -3.517906 128.247499 -3.750243 128.005775 -3.783098 128.005775 -3.783098 # -b 112.150557 -8.256166 111.843122 -8.324224 111.554461 -8.291369 111.268147 -8.157599 110.859798 -8.181067 110.418593 -8.005055 110.010244 -7.763331 110.010244 -7.763331 # -b 109.944532 -6.838678 110.418593 -6.939591 110.704907 -6.608688 111.002955 -6.388085 111.411304 -6.662665 111.753942 -6.662665 112.051990 -6.796435 112.117701 -6.838678 112.427484 -6.829290 112.713798 -7.169581 112.892157 -7.566196 113.455397 -7.697619 114.084349 -7.631908 114.448109 -8.016789 114.436375 -8.509624 114.469230 -8.751348 113.753446 -8.476768 112.978990 -8.357080 112.284327 -8.291369 112.150557 -8.256166 112.150557 -8.256166 # -b 117.583480 0.007041 117.517769 -0.481101 117.142275 -1.180458 116.787903 -1.401061 116.325577 -1.767167 116.489855 -2.022972 116.689336 -2.255309 116.489855 -2.532235 116.346698 -2.964053 116.248131 -3.151800 116.104974 -3.318425 115.982939 -3.571883 115.771724 -3.705653 115.574590 -3.815954 115.100529 -4.036556 114.725035 -4.092880 114.656977 -3.715040 114.469230 -3.485050 114.194651 -3.363015 113.762833 -3.440460 113.521109 -3.208124 113.166737 -3.062620 113.044701 -3.184655 112.516663 -3.395870 112.218615 -3.395870 112.040256 -3.440460 111.962810 -3.485050 111.908833 -3.372402 111.831388 -2.996908 111.688231 -2.863139 111.545074 -2.931197 111.235291 -2.996908 110.892654 -3.008643 110.639195 -2.964053 110.329413 -2.952319 110.275436 -2.520501 110.132279 -2.145007 110.010244 -1.767167 110.043099 -1.347083 110.043099 -1.347083 # -b 116.269253 -3.285569 116.334964 -3.440460 116.358433 -3.750243 116.367820 -3.914521 116.158952 -3.914521 116.126096 -3.527293 116.215276 -3.294957 116.269253 -3.285569 # -b 120.033576 -8.817060 119.857564 -8.596457 119.878685 -8.488503 # -b 120.134490 -10.063229 119.460949 -9.790996 119.094842 -9.450705 119.547781 -9.352138 119.902154 -9.352138 119.902154 -9.352138 # -b 117.109420 -8.411057 117.473179 -8.389936 117.848673 -8.641047 118.102131 -8.641047 118.036420 -8.432179 117.980096 -8.070766 118.411913 -8.312490 118.721695 -8.497890 119.029131 -8.411057 119.205144 -8.685637 118.918830 -8.718493 118.510480 -8.772470 117.958974 -8.903892 117.285432 -9.079905 116.853615 -8.892158 116.963916 -8.530746 117.109420 -8.411057 # -b 116.104974 -8.455647 116.367820 -8.223310 116.743313 -8.521358 116.534445 -8.936748 115.959471 -8.871037 116.104974 -8.575336 116.104974 -8.455647 # -b 115.044205 -8.091888 115.398577 -8.082500 115.684891 -8.443913 115.264807 -8.817060 114.955025 -8.411057 114.579531 -8.300756 114.779012 -8.070766 115.023083 -8.091888 115.044205 -8.091888 # -b 112.802977 -6.927857 113.145615 -6.850412 113.807423 -6.873880 113.974048 -7.092136 113.300506 -7.193050 112.835833 -7.103870 112.802977 -6.927857 # -b 115.297663 -6.784700 115.607445 -6.817556 115.398577 -7.005303 115.297663 -6.784700 # -b 120.155612 -5.615976 119.526660 -5.571387 119.470336 -5.120794 119.625227 -4.358073 119.580637 -3.661063 119.106576 -3.506172 118.918830 -2.842017 119.249733 -2.109805 119.371769 -1.302493 119.714407 -0.769762 119.890419 -0.570281 119.791852 -0.049284 119.791852 -0.049284 # -b 103.838067 0.072752 103.650320 -0.227643 103.596343 -0.492835 103.805211 -0.936387 104.269885 -1.046688 104.600789 -1.424529 104.621910 -1.877468 105.009138 -2.076949 105.041994 -2.309286 105.539523 -2.365610 105.891548 -2.698860 106.145006 -3.140065 105.968993 -3.726774 105.992462 -4.092880 105.968993 -4.566941 105.968993 -5.097326 105.924404 -5.606589 105.694414 -5.726278 105.372897 -5.561999 105.030259 -5.615976 104.800270 -5.660566 104.577320 -5.693422 104.147849 -5.285073 103.718379 -4.864989 103.265439 -4.522351 102.789032 -4.191448 102.404151 -3.705653 101.918356 -3.250367 101.498272 -2.741103 101.089923 -2.321020 100.979622 -1.877468 100.571273 -1.091278 100.261490 -0.537425 100.029154 -0.305089 # -b 104.445897 -0.481101 104.556199 -0.349678 104.654766 -0.591402 104.645378 -0.359066 104.445897 -0.481101 104.445897 -0.481101 # -b 105.262596 -1.889202 105.429221 -1.722577 105.516054 -1.567686 105.748391 -1.668600 105.870426 -1.689721 106.025317 -1.490240 106.245920 -2.088683 106.511112 -2.454790 106.809160 -2.508767 106.741102 -2.919463 106.687125 -3.062620 106.222452 -2.809162 106.058173 -2.443055 105.760125 -2.088683 105.396366 -1.978382 105.262596 -1.889202 105.262596 -1.889202 # -b 107.790137 -2.541622 108.034208 -2.532235 108.341644 -2.752838 108.231342 -3.151800 107.956763 -3.130678 107.691570 -2.952319 107.736160 -2.630802 107.790137 -2.541622 # -b 110.010244 -7.763331 109.634750 -7.697619 109.280378 -7.653029 109.038654 -7.709353 108.707750 -7.742209 108.442558 -7.763331 107.912173 -7.643642 107.217510 -7.488751 106.764571 -7.357328 106.478257 -7.223559 106.621414 -6.981835 106.102763 -6.829290 105.649824 -6.772966 105.384631 -6.674399 105.340042 -6.620422 105.417487 -6.608688 105.703801 -6.596954 105.947872 -6.322374 106.168474 -5.946880 106.731715 -5.979736 107.184654 -5.902290 107.560148 -6.167483 108.144510 -6.244928 108.564593 -6.498386 108.904884 -6.796435 109.202932 -6.796435 109.590160 -6.784700 109.944532 -6.838678 # -b 110.043099 -1.347083 109.810763 -0.891797 109.623016 -0.659461 109.315580 -0.525691 109.202932 -0.082139 109.202932 -0.082139 # -b 100.029154 -0.305089 99.963442 -0.147851 # -b 98.836961 -0.936387 99.069298 -0.948121 99.334490 -1.523096 99.245311 -1.755433 98.902673 -1.469119 98.771250 -1.079544 98.836961 -0.936387 # -b 55.275008 -4.569288 55.275008 -4.569288 55.275008 -4.569288 # -b 43.137177 0.192440 42.529346 -0.272233 42.639647 -0.361413 42.308744 -0.748640 41.869886 -1.304840 41.506126 -1.846959 41.074308 -1.957260 40.877174 -2.377344 40.292812 -2.853752 40.093331 -3.508519 # -b 46.443867 -9.417849 46.300710 -9.483561 46.443867 -9.417849 46.443867 -9.417849 # -b 34.151145 -0.938734 34.007988 -1.147602 33.942276 -1.304840 33.808507 -1.492587 33.698206 -1.703802 33.501071 -1.835225 33.379036 -2.013585 33.501071 -2.145007 33.766264 -2.123886 33.599639 -2.400812 33.071601 -2.489992 32.904975 -2.898341 32.782940 -2.522848 32.386325 -2.311633 32.231434 -2.532235 32.055421 -2.677739 31.825431 -2.588559 31.769107 -2.201331 31.769107 -1.659212 31.870021 -1.049035 31.780841 -0.894144 # -b 29.861130 -6.388085 30.445492 -6.796435 30.600383 -7.369062 30.877310 -8.005055 31.163624 -8.554214 31.163624 -8.554214 # -b 34.040844 -9.692429 34.404603 -9.746406 34.559494 -9.997518 # -b 34.040844 -9.692429 34.073699 -9.887216 # -b 29.994900 -7.237640 30.480695 -7.873632 30.579262 -8.148212 # -b 30.633239 -8.235044 30.612117 -8.554214 31.008733 -8.772470 31.163624 -8.554214 # -b 34.019722 0.114995 34.139411 -0.194787 34.437459 -0.272233 34.812952 -0.340291 34.249712 -0.539772 34.151145 -0.938734 # -b 32.419180 0.103261 31.956854 -0.140810 31.902877 -0.506916 31.759720 -0.849554 31.780841 -0.894144 # -b 40.093331 -3.508519 39.586415 -4.524698 39.332957 -4.646734 # -b 39.929053 -5.087939 39.929053 -5.055083 39.774162 -5.341397 39.839873 -4.921313 39.929053 -5.087939 39.929053 -5.087939 # -b 39.386934 -5.761480 39.431524 -5.916371 39.574681 -6.212073 39.553559 -6.388085 39.344691 -6.026673 39.386934 -5.761480 # -b 39.332957 -4.646734 39.267245 -4.998759 39.067764 -5.639445 38.912873 -6.280131 39.234390 -6.587566 39.619271 -7.094483 39.476114 -7.336207 39.476114 -7.786799 39.476114 -8.159946 39.377547 -8.476768 39.565293 -8.828794 39.598149 -9.035315 39.753040 -9.342751 39.872729 -9.668961 39.929053 -9.997518 39.929053 -9.997518 # -b 29.696852 -4.381541 29.708586 -5.010493 29.840009 -5.439964 29.905720 -6.036060 29.861130 -6.388085 # -b 29.333092 -3.386483 29.464515 -3.729121 29.586550 -4.271240 29.696852 -4.381541 # -b 29.333092 -3.386483 29.178201 -3.928602 29.243913 -4.193794 29.157080 -5.087939 29.377682 -5.881169 29.497371 -6.542976 29.994900 -7.237640 29.994900 -7.237640 # -b 13.290127 -10.018639 13.060137 -9.187860 13.280740 -8.817060 13.215029 -8.258513 13.015548 -7.861898 12.839535 -7.193050 12.541487 -6.730723 12.288029 -6.301252 12.309150 -6.059528 12.133138 -5.728625 12.067426 -5.165384 11.846824 -4.801625 11.537041 -4.369807 11.074715 -3.970845 10.767280 -3.541374 10.072616 -2.886607 9.563353 -2.278777 9.166738 -1.746045 8.903892 -1.070157 8.826447 -0.748640 9.199594 -0.429471 9.232449 -0.194787 # -b -40.062822 -19.779126 -39.743653 -19.361390 -39.731919 -18.762947 -39.623964 -18.122261 -39.260205 -17.702177 -39.269592 -17.237504 -39.225002 -16.854970 -39.126435 -16.291729 -39.016134 -15.897461 -39.114701 -15.536049 -39.114701 -15.118312 -39.138169 -14.883628 -39.126435 -14.336816 -39.072458 -13.724292 -39.016134 -13.369920 -38.685230 -12.926368 -38.455240 -12.980345 -38.046891 -12.527406 -37.760577 -12.039264 -37.572830 -11.670811 -37.295904 -11.215525 -37.028365 -10.999616 -36.643484 -10.661672 -36.157689 -10.150062 -36.157689 -10.150062 # -b -40.250569 -20.185129 -40.062822 -19.779126 -40.062822 -19.779126 # -b -70.097618 -15.406973 -69.820692 -15.205145 -69.456932 -15.514927 -69.170619 -15.791854 -68.752882 -15.876340 -68.795125 -16.111023 -68.785738 -16.333972 -69.137763 -16.345707 -69.480401 -16.111023 -69.766715 -15.812975 -69.886403 -15.812975 # -b -77.769423 -11.126345 -77.715445 -11.323479 -77.638000 -11.508879 -77.262506 -11.985287 -76.943337 -12.503938 -76.645288 -12.959224 -76.347240 -13.454406 -76.481010 -13.982444 -76.150106 -14.465892 -75.786347 -14.829651 -75.312286 -15.301365 -74.772514 -15.641656 -74.164684 -15.972560 -73.988671 -16.143879 -73.514610 -16.345707 -72.841069 -16.632021 -72.181608 -17.002821 -71.573778 -17.427598 -71.144307 -17.859415 -70.581067 -18.248990 -70.527089 -18.354598 -70.405054 -18.974162 -70.339342 -19.579645 -70.261897 -19.830757 # -b -70.041294 -15.599413 -70.097618 -15.451562 -70.097618 -15.406973 # -b -69.886403 -15.812975 -70.041294 -15.599413 -70.041294 -15.599413 # -b -78.229402 -9.985783 -78.065124 -10.380052 -77.832787 -10.901049 -77.769423 -11.126345 -77.769423 -11.126345 # -b -149.453502 -17.568408 -149.444114 -17.697484 -149.354934 -17.918086 -149.674104 -17.643506 -149.453502 -17.568408 -149.453502 -17.568408 # -b -145.639894 -17.326684 -145.541327 -17.495656 -145.693872 -17.293828 -145.693872 -17.293828 -145.639894 -17.326684 # -b -145.121244 -16.073474 -145.121244 -16.042965 # -b -146.433125 -14.428342 -146.522304 -14.503441 -146.367413 -14.440077 -146.433125 -14.428342 # -b -146.113955 -14.374365 -146.191401 -14.503441 -146.036510 -14.353244 -146.113955 -14.374365 # -b -140.336047 -15.988988 -140.347781 -16.000722 -140.249214 -15.935011 -140.336047 -15.988988 # -b -140.589505 -19.678213 -140.535528 -19.596073 -140.577771 -19.617195 # -b -145.067267 -19.814329 -145.165834 -19.877694 -145.067267 -19.814329 -145.067267 -19.814329 # -b -150.005008 -17.568408 -149.918175 -17.495656 -149.960418 -17.483922 # -b -151.626671 -16.744669 -151.516370 -16.754056 -151.582081 -16.838542 -151.626671 -16.744669 # -b -150.005008 -17.505043 -150.005008 -17.568408 # -b -149.960418 -17.483922 -150.005008 -17.505043 # -b -160.908404 -10.368318 -160.809837 -10.389439 -160.908404 -10.401173 -160.908404 -10.368318 # -b -172.827979 -13.470834 -172.452486 -13.599910 -172.452486 -13.836940 -172.762268 -13.815818 -173.036848 -13.557667 -173.048582 -13.491955 -172.827979 -13.470834 # -b -171.945569 -13.848674 -171.757823 -13.881530 -171.605278 -14.031727 -171.978425 -14.041115 -172.231883 -13.977750 -172.112195 -13.836940 -171.945569 -13.848674 # -b -170.016471 -18.969468 -170.004737 -19.084463 -170.115038 -18.957734 -170.016471 -18.969468 -170.016471 -18.969468 # -b 177.789189 -17.420557 177.965201 -17.378314 178.108358 -17.453413 178.352429 -17.612998 178.418141 -17.864109 178.319574 -18.117567 177.965201 -18.244296 177.678888 -18.223175 177.437164 -18.129301 177.160237 -18.033081 177.204827 -17.655241 177.514609 -17.441679 177.789189 -17.420557 177.789189 -17.420557 # -b 178.749044 -16.467742 178.847611 -16.467742 179.000000 -16.402818 # -b 179.000000 -16.728223 178.814756 -16.923028 178.504974 -16.880785 178.352429 -16.660183 178.749044 -16.467742 178.749044 -16.467742 # -b 159.967323 -11.731829 160.307614 -11.839783 160.089358 -11.839783 160.089358 -11.839783 # -b 166.444588 -14.728737 166.531421 -14.815570 166.599479 -15.029132 166.698046 -15.209838 166.852937 -15.008011 166.951504 -15.083109 167.007828 -15.179330 167.050071 -15.381157 166.930383 -15.531355 166.665190 -15.606454 166.510299 -15.083109 166.444588 -14.728737 166.444588 -14.728737 # -b 167.061805 -15.871646 167.204962 -15.913889 167.315264 -16.042965 167.437299 -16.211937 167.589843 -16.341013 167.601578 -16.488864 167.294142 -16.500598 167.226084 -16.073474 167.061805 -15.925623 167.061805 -15.871646 # -b 168.031048 -15.477378 168.063904 -15.594719 168.131962 -15.808281 168.054517 -15.820016 168.031048 -15.477378 168.031048 -15.477378 # -b 168.021661 -16.085208 168.054517 -16.139185 168.141350 -16.329279 167.878504 -16.308157 167.911360 -16.169694 168.021661 -16.085208 # -b 168.307975 -17.547286 168.394808 -17.676362 168.251651 -17.800744 168.099107 -17.664628 168.307975 -17.547286 168.307975 -17.547286 # -b 168.836013 -18.643258 168.946314 -18.654992 168.990904 -18.842739 168.868869 -18.842739 168.868869 -18.842739 168.836013 -18.643258 # -b 169.101205 -19.366083 169.223241 -19.438835 169.211506 -19.605461 169.080084 -19.408327 169.101205 -19.366083 # -b 161.488072 -10.182918 161.675819 -10.258016 162.173348 -10.445763 162.384563 -10.727383 162.128758 -10.781361 161.642963 -10.445763 161.488072 -10.182918 161.488072 -10.182918 # -b 165.728803 -10.804829 165.794515 -10.717996 166.071441 -10.706262 165.937671 -10.814216 165.782780 -10.825950 165.728803 -10.804829 # -b 159.979057 -11.839783 159.967323 -11.731829 159.967323 -11.731829 # -b 160.089358 -11.839783 159.979057 -11.839783 # -b 151.375559 -9.964662 151.122101 -10.018639 151.122101 -10.018639 # -b 149.953377 -9.898951 150.516618 -10.161796 150.978944 -10.227507 150.615185 -10.347196 150.770076 -10.499740 150.173980 -10.607695 150.105922 -10.422295 # -b 139.866680 -17.718605 140.474510 -17.645853 140.915715 -17.169446 141.169174 -16.639061 141.356920 -15.841137 141.586910 -15.115965 141.488343 -14.235902 141.544667 -13.461446 141.586910 -13.008507 141.577523 -12.621279 141.654968 -12.090895 141.999953 -11.525307 142.225249 -10.999616 142.225249 -10.999616 # -b 142.722778 -11.025431 142.767368 -11.264809 142.833080 -11.926616 143.065416 -12.165993 143.229695 -12.576689 143.330609 -12.891165 143.539477 -13.419203 143.593454 -13.935507 143.837525 -14.430689 144.234140 -14.313347 144.619021 -14.409568 144.994515 -14.806183 145.259707 -15.212185 145.280829 -15.651043 145.435720 -16.129798 145.501431 -16.617940 145.876925 -16.925375 146.052937 -17.498003 146.106915 -17.983798 146.106915 -18.467246 146.294661 -18.676114 146.318130 -18.730091 146.404963 -19.053954 146.902492 -19.305066 147.331963 -19.377818 147.564299 -19.743924 147.838879 -19.765045 148.148661 -19.889428 # -b 142.225249 -10.999616 142.302695 -10.912783 142.621864 -10.706262 142.727472 -10.858806 142.727472 -10.999616 142.727472 -11.025431 # -b 150.105922 -10.422295 149.378403 -10.302606 148.848018 -10.204039 148.174476 -10.150062 147.899897 -10.051495 # -b 129.923140 -13.581135 130.209453 -13.245537 130.110886 -12.977998 130.507502 -12.684644 130.805550 -12.651788 130.793815 -12.480469 131.068395 -12.327925 131.279610 -12.285682 131.840504 -12.349046 132.237119 -12.273948 132.502311 -11.938350 132.204263 -11.569897 131.840504 -11.396231 131.741937 -11.297664 131.908562 -11.199097 132.007129 -11.525307 132.138552 -11.231953 132.314565 -11.297664 132.546901 -11.569897 132.734648 -11.450209 133.009228 -11.764685 133.340132 -11.818662 133.605324 -11.806928 133.671035 -11.905495 134.013673 -12.025183 134.422023 -12.121403 134.729458 -12.165993 135.104952 -12.327925 135.313820 -12.133138 135.501567 -12.079160 135.776146 -12.025183 135.722169 -12.187115 135.898182 -12.177727 135.898182 -12.403024 135.975627 -12.567302 136.163374 -12.295069 136.416832 -12.025183 136.625701 -12.285682 136.780592 -12.435879 136.538868 -12.846575 136.470810 -12.945143 136.470810 -13.170439 136.285410 -13.278393 136.074194 -13.269006 136.064807 -13.440325 135.865326 -13.515424 135.886448 -13.752454 135.886448 -14.064583 135.710435 -14.472932 135.534422 -15.029132 135.853592 -15.191064 136.008483 -15.329527 136.327653 -15.618188 136.571723 -15.895114 137.210063 -15.979600 137.674736 -16.310504 138.104207 -16.671917 138.676835 -16.831502 139.129774 -17.202301 139.514655 -17.519124 139.866680 -17.718605 139.866680 -17.718605 # -b 130.054562 -11.839783 130.000585 -11.851517 # -b 129.967729 -11.698973 130.110886 -11.417353 130.286899 -11.677852 130.408934 -11.839783 130.054562 -11.839783 # -b 130.254043 -11.255421 130.462912 -11.417353 130.749226 -11.438474 131.080129 -11.342254 131.357056 -11.396231 131.312466 -11.656730 130.969828 -11.905495 130.552091 -11.710707 130.308021 -11.384497 130.254043 -11.255421 # -b 136.428567 -11.525307 136.416832 -11.297664 136.592845 -11.243687 136.428567 -11.525307 # -b 136.405098 -13.818165 136.571723 -13.743067 136.780592 -14.085704 136.703146 -14.322735 136.405098 -13.818165 136.405098 -13.818165 # -b 139.580366 -16.437233 139.779847 -16.566309 139.535776 -16.671917 139.207219 -16.650795 139.481799 -16.416112 139.580366 -16.437233 # -b 119.878685 -19.941058 120.474781 -19.765045 121.014553 -19.535056 121.321989 -19.262823 121.509736 -18.887329 121.688095 -18.612749 121.974409 -18.352251 122.195011 -18.002572 122.061242 -17.476881 122.305313 -16.988739 122.624482 -16.744669 122.678460 -16.650795 122.845085 -16.608552 123.032832 -16.988739 123.340267 -17.486269 123.506892 -17.117815 123.650049 -16.883132 123.462302 -16.521719 123.528014 -16.160307 123.957485 -16.343360 124.386955 -16.542841 124.300123 -16.129798 124.541847 -15.841137 124.541847 -15.437481 124.929074 -15.458603 124.839895 -15.137087 125.236510 -15.158208 125.116821 -14.677107 125.480581 -14.559765 125.665981 -14.698228 125.987497 -14.334469 125.942907 -14.001218 126.175244 -14.184272 126.306667 -14.184272 126.625836 -14.055196 126.801849 -13.839287 127.013064 -13.947241 127.508246 -14.172537 127.961185 -14.677107 127.994041 -15.052601 127.904861 -15.554823 127.970573 -15.437481 128.080874 -15.254428 128.104342 -15.073722 128.247499 -14.998623 128.378922 -14.881282 128.852983 -14.890669 129.261332 -15.019745 129.592236 -15.233307 129.681416 -14.857813 129.282454 -14.386099 129.514790 -14.097439 129.714271 -13.797044 129.923140 -13.581135 129.923140 -13.581135 # -b 130.000585 -11.851517 129.967729 -11.743563 129.967729 -11.698973 # -b 124.825814 -9.887216 124.471442 -10.171183 123.964525 -10.347196 123.567910 -10.258016 123.722801 -10.009252 # -b 122.903756 -10.901049 123.082115 -10.760239 123.380163 -10.509128 123.424753 -10.619429 123.103237 -10.924518 122.903756 -10.901049 # -b 120.796298 -9.931806 120.552227 -10.290872 120.134490 -10.063229 # -b 118.864852 -20.077175 119.008009 -19.952792 119.249733 -19.941058 # -b 119.425746 -20.034931 119.646349 -19.941058 119.878685 -19.941058 # -b 49.950039 -14.052849 50.104930 -14.878935 50.226965 -15.690940 50.137786 -15.904502 # -b 57.492767 -20.011463 57.558478 -19.980954 # -b 40.677693 -10.999616 40.532190 -11.262462 40.337402 -11.774072 40.412501 -12.543834 40.346790 -13.071872 40.379645 -13.675008 40.435969 -14.041115 40.468825 -14.245289 40.501681 -14.449464 40.665959 -14.674760 40.346790 -15.209838 40.445357 -15.531355 40.281078 -15.615841 40.116800 -15.796547 # -b 43.113708 -11.393885 43.202888 -11.361029 43.324923 -11.762338 43.324923 -11.926616 43.137177 -11.480717 43.113708 -11.393885 # -b 44.305900 -16.265914 44.437323 -16.169694 44.878528 -16.106329 45.120252 -16.085208 45.397179 -16.042965 45.695227 -15.766038 46.026131 -15.754304 46.378156 -16.096942 46.267855 -15.754304 46.697325 -15.252082 46.852217 -15.540742 47.051697 -15.369423 47.204242 -14.857813 47.347399 -14.815570 47.591470 -14.674760 47.800338 -14.590274 47.591470 -14.299266 47.856662 -13.977750 47.800338 -13.557667 48.164097 -13.665621 48.330723 -13.287780 48.715604 -13.017894 48.626424 -12.445267 49.023039 -12.175381 49.586279 -12.780864 49.785760 -13.254925 49.950039 -14.052849 49.950039 -14.052849 # -b 50.137786 -15.904502 49.806882 -15.435135 49.574545 -16.127451 49.619135 -16.817421 49.321087 -17.495656 49.210786 -18.371025 48.947940 -19.166602 48.825905 -19.511587 48.682748 -19.959833 # -b 44.315288 -20.023197 44.437323 -19.565564 44.129888 -18.812230 43.996118 -18.054203 43.808371 -17.526165 44.216721 -16.786912 44.305900 -16.265914 44.305900 -16.265914 # -b 39.929053 -9.997518 40.227101 -10.281485 40.489946 -10.389439 40.677693 -10.652285 40.656572 -10.945639 40.677693 -10.999616 # -b 40.116800 -15.796547 39.607536 -16.277648 39.631005 -16.509985 39.058377 -16.838542 38.560848 -17.145977 37.889653 -17.357193 37.051833 -17.821866 36.720929 -18.211441 36.488593 -18.265418 36.509714 -18.476633 36.178810 -18.894370 35.958208 -18.812230 35.662507 -19.126706 35.221302 -19.574952 34.646327 -19.938711 34.646327 -19.938711 # -b 34.944375 -11.600406 34.679183 -11.307052 34.568881 -11.055940 # -b 34.327157 -10.999616 34.172266 -11.142773 34.139411 -11.339907 34.216856 -11.752950 34.029109 -12.130791 34.061965 -12.597811 34.172266 -13.146970 34.371747 -13.590522 34.482049 -14.085704 34.714385 -14.257023 35.066410 -14.364978 35.164978 -14.386099 35.000699 -13.858061 34.824686 -13.665621 34.789484 -13.644499 # -b 34.944375 -11.600406 34.866930 -11.774072 34.789484 -12.088548 34.636940 -12.543834 34.658061 -13.050750 34.735507 -13.545932 34.845808 -13.644499 # -b 34.559494 -9.997518 34.643980 -10.750852 34.568881 -10.999616 # -b 34.073699 -9.887216 34.261446 -10.380052 34.327157 -10.793095 34.327157 -10.999616 # -b 11.626221 -17.314950 11.572244 -16.838542 11.682545 -16.796299 11.659077 -16.319891 11.825702 -15.775426 12.022836 -15.167595 12.133138 -14.545684 12.288029 -14.062236 12.419452 -13.686742 12.541487 -13.308902 12.827801 -12.942796 13.215029 -12.661176 13.543586 -12.241092 13.665621 -11.795193 13.677355 -11.666117 13.698477 -11.393885 13.710211 -11.100530 13.698477 -11.034819 # -b 12.893512 -20.053706 12.696378 -19.678213 12.529753 -19.387205 12.374862 -19.126706 12.121403 -18.748866 11.957125 -18.612749 11.757644 -18.317048 11.647343 -17.927474 11.614487 -17.580142 11.626221 -17.314950 11.626221 -17.314950 # -b 13.698477 -11.034819 13.710211 -10.553718 13.290127 -10.018639 13.290127 -10.018639 # -b -50.097889 -29.858783 -49.776373 -29.377682 -49.490059 -29.086675 -49.203745 -28.776892 -48.839986 -28.652510 -48.663973 -28.349768 -48.607649 -27.636330 -48.574793 -27.223287 -48.565406 -27.075437 -48.663973 -26.730452 -48.675707 -26.512196 -48.675707 -26.146090 -48.598262 -25.796412 -48.255624 -25.437346 -47.880130 -25.108789 -47.572695 -24.747376 -47.164346 -24.505652 -46.734875 -24.141893 -46.281936 -23.989349 -45.831343 -23.757012 -45.357283 -23.585693 -45.157802 -23.463658 -44.904343 -23.311113 -44.627417 -23.198465 -44.672007 -23.067042 -44.373959 -22.933273 -44.153356 -22.984903 -43.822452 -22.933273 -43.416450 -22.963782 -43.073812 -22.945007 -42.632607 -22.945007 -42.203136 -22.881643 -42.027123 -22.719711 -41.970799 -22.473293 -41.365316 -22.156470 -41.111858 -21.849035 -41.079002 -21.332731 -40.736364 -20.868058 -40.384339 -20.443281 -40.250569 -20.185129 # -b -50.184722 -30.116935 -50.140133 -29.964391 -50.097889 -29.858783 # -b -70.261897 -19.830757 -70.252510 -20.370529 -70.217307 -21.116822 -70.217307 -21.745774 -70.318221 -22.372379 -70.395667 -23.006025 -70.625656 -23.329888 -70.515355 -23.564572 -70.571679 -24.151280 -70.571679 -24.775538 -70.538823 -25.097055 -70.670246 -25.498364 -70.792282 -25.887938 -70.726570 -26.244657 -70.768813 -26.699943 -70.944826 -27.124720 -71.012884 -27.401647 -71.055127 -27.617556 -71.221752 -28.213652 -71.353175 -28.708834 -71.597246 -29.049125 -71.564390 -29.272075 -71.442355 -29.591244 -71.397765 -29.889292 -71.397765 -29.889292 # -b -109.498633 -27.169310 -109.409454 -27.080131 -109.531489 -27.129414 -109.543223 -27.169310 # -b -124.945502 -24.641769 -124.912647 -24.651156 -124.945502 -24.641769 # -b -135.684620 -21.461807 -135.750331 -21.586190 -135.684620 -21.461807 -135.684620 -21.461807 # -b -130.270471 -25.043078 -130.237615 -25.043078 -130.270471 -25.043078 # -b -137.249959 -23.111632 -137.292202 -23.184384 -137.249959 -23.111632 -137.249959 -23.111632 # -b -140.798374 -21.750468 -140.810108 -21.771589 -140.744396 -21.668329 -140.798374 -21.750468 # -b -175.219404 -21.133250 -175.219404 -21.297529 -175.496331 -21.194268 -175.353174 -21.133250 -175.219404 -21.133250 # -b 165.010672 -21.431298 164.508449 -21.081620 164.212748 -20.659190 163.924087 -20.253187 164.278459 -20.283696 164.651606 -20.492564 164.851087 -20.668577 164.998937 -20.717861 165.066996 -20.821121 165.186684 -20.966625 165.275864 -21.112129 165.419021 -21.297529 165.651358 -21.482929 165.925937 -21.616698 166.289697 -21.811486 166.543155 -22.079025 166.841203 -22.316055 166.709780 -22.398194 166.620600 -22.377073 166.289697 -22.255038 166.003383 -22.121268 165.827370 -21.956989 165.627889 -21.884238 165.341575 -21.698838 165.109239 -21.525172 165.010672 -21.431298 # -b 166.996094 -20.802347 167.172107 -20.821121 167.303530 -21.018255 167.226084 -21.194268 166.984360 -20.978359 166.996094 -20.802347 166.996094 -20.802347 # -b 167.711879 -21.452420 167.768203 -21.410177 167.944215 -21.443033 167.944215 -21.647207 167.711879 -21.452420 167.711879 -21.452420 # -b 149.922869 -22.203407 150.197448 -22.367686 150.561208 -22.459212 150.671509 -22.492068 150.781810 -23.062349 151.014147 -23.651404 151.389640 -23.996389 151.875435 -24.228726 152.171137 -24.641769 152.448063 -24.892880 152.767233 -25.244905 152.856412 -25.683764 153.077015 -25.824574 153.077015 -26.420670 153.142726 -26.944014 153.098136 -27.171657 153.208438 -27.406341 153.384450 -27.868667 153.506486 -28.211305 153.560463 -28.560984 153.518220 -29.006882 153.330473 -29.720320 153.330473 -29.720320 # -b 153.098136 -24.794313 153.220172 -24.883493 153.175582 -25.413878 153.008957 -25.674376 152.976101 -25.214397 153.098136 -24.794313 153.098136 -24.794313 # -b 153.450162 -27.347670 153.518220 -27.526029 153.417306 -27.446237 153.450162 -27.347670 153.450162 -27.347670 # -b 148.148661 -19.889428 148.467831 -20.065440 148.775266 -20.264921 148.876180 -20.523073 148.852712 -20.814081 149.207084 -21.081620 149.326772 -21.454767 149.481664 -21.865463 149.547375 -22.142389 149.648289 -22.348911 149.812567 -22.459212 149.922869 -22.203407 # -b 113.913030 -21.865463 114.023332 -21.856076 114.002210 -22.090759 114.002210 -22.276159 114.046800 -22.522577 114.365969 -22.050863 114.729729 -21.762202 115.126344 -21.588536 115.555815 -21.288141 115.919574 -20.978359 116.306802 -20.783572 116.691683 -20.553582 117.034321 -20.616947 117.529503 -20.659190 118.059888 -20.368182 118.611394 -20.283696 118.864852 -20.077175 # -b 119.249733 -19.941058 119.425746 -20.034931 # -b 114.962066 -30.105201 114.929210 -29.614712 114.807175 -29.142999 114.520861 -28.570371 114.100777 -27.622249 113.659572 -26.934627 113.328668 -26.469953 113.143268 -26.232923 113.286425 -26.232923 113.429582 -26.540358 113.683040 -26.617804 113.593861 -26.232923 113.373258 -25.585197 113.593861 -26.024055 113.826197 -26.193027 114.079656 -26.282207 113.957620 -25.655602 113.826197 -25.385716 113.528149 -24.852984 113.307547 -24.198217 113.528149 -23.651404 113.650185 -23.245402 113.617329 -22.818278 113.626716 -22.316055 113.837932 -21.917093 113.913030 -21.865463 # -b 55.122464 -20.987747 55.275008 -20.914995 55.704479 -21.142638 55.507344 -21.410177 55.122464 -20.987747 55.122464 -20.987747 # -b 57.391853 -20.074828 57.415321 -20.044319 57.492767 -20.011463 # -b 57.558478 -19.980954 57.635924 -20.283696 57.293286 -20.501952 57.391853 -20.074828 57.391853 -20.074828 # -b 48.682748 -19.959833 48.384700 -20.738982 48.098386 -21.792711 47.767482 -22.754913 47.568001 -23.519982 47.293422 -24.339027 46.974252 -24.932776 46.476723 -25.132257 45.594313 -25.423265 44.857407 -25.463161 44.204986 -25.092361 43.730926 -24.571364 43.566647 -23.731197 43.456346 -23.060002 43.170032 -22.416969 43.191154 -21.802098 43.402369 -21.421911 43.721538 -21.048764 44.151009 -20.210944 44.315288 -20.023197 # -b 32.815796 -26.735146 32.639783 -27.326548 32.487239 -27.964887 32.222046 -28.666591 31.691662 -28.976373 31.262191 -29.401150 31.107300 -29.689811 30.954755 -29.929188 # -b 34.646327 -19.938711 34.592350 -20.450321 34.866930 -20.790612 34.988965 -21.069886 35.155590 -21.607311 35.287013 -22.222182 35.463026 -22.386460 35.418436 -22.980210 35.254157 -23.712422 35.265891 -24.024551 35.340990 -24.155974 34.977231 -24.651156 34.162879 -24.972673 33.346180 -25.294189 32.860385 -25.524179 32.475505 -26.012321 32.705494 -26.289247 32.850998 -26.279860 32.827530 -26.735146 32.815796 -26.735146 # -b 16.432540 -28.666591 16.179081 -28.530475 15.881033 -28.286404 15.585332 -27.946113 15.374117 -27.631637 15.144127 -27.258490 15.022092 -26.706984 14.900056 -26.329143 14.867201 -26.031095 14.747512 -25.564075 14.768633 -25.132257 14.580887 -24.712174 14.404874 -24.317906 14.381406 -23.834458 14.372018 -23.367437 14.393140 -22.907458 14.294573 -22.438091 13.951935 -21.956989 13.754801 -21.576802 13.433284 -21.112129 13.236150 -20.750716 13.092993 -20.356448 12.893512 -20.053706 # -b 17.094347 -30.102854 16.840889 -29.441047 16.521719 -28.917702 16.432540 -28.666591 16.432540 -28.666591 # -b -53.240302 -33.611373 -52.820218 -33.287509 -52.533904 -32.881507 -52.444725 -32.639783 -52.203001 -32.217353 -51.585783 -31.844206 -51.198555 -31.588401 -50.858264 -31.182398 -50.503892 -30.698950 -50.283289 -30.375087 -50.184722 -30.116935 # -b -60.020308 -38.828387 -59.435946 -38.776757 -58.795260 -38.603091 -58.541802 -38.560848 -57.826018 -38.335552 -57.516235 -37.838023 -57.021053 -37.295904 -56.711271 -36.704501 -56.922486 -36.347782 -57.441137 -35.857294 -57.241656 -35.444251 -57.539704 -35.092226 -58.201511 -34.702651 -58.553536 -34.310730 -58.476091 -34.007988 -58.344668 -34.017375 -58.023152 -34.320117 -57.682861 -34.465621 -57.098499 -34.564188 -56.392101 -34.791831 -55.974365 -34.857542 -55.345413 -34.857542 -54.606160 -34.857542 -54.010064 -34.484395 -53.735484 -34.191041 -53.536003 -33.824935 -53.359990 -33.705246 -53.327135 -33.613720 # -b -51.266613 -30.004287 -51.243145 -30.194381 -51.123456 -30.377434 -50.956831 -30.386821 -50.614193 -30.281214 -50.593072 -30.520591 -50.682251 -30.461920 -50.736229 -30.652014 -50.923975 -30.957102 -51.078867 -31.090872 -51.231411 -31.372492 -51.365180 -31.571973 -51.707818 -31.797269 -52.026988 -31.872368 -52.092699 -32.050727 -52.224122 -31.919305 -52.268712 -31.759720 -52.125555 -31.628297 -52.048109 -31.363105 -51.728940 -31.269231 -51.562315 -31.050976 -51.442626 -30.729459 -51.365180 -30.614464 -51.299469 -30.386821 -51.266613 -30.004287 -51.266613 -30.004287 # -b -62.369490 -40.039354 -62.148888 -39.734266 -62.313166 -39.248471 -62.313166 -38.757982 -61.806250 -38.957463 -61.055263 -38.990319 -60.428658 -38.922261 -60.020308 -38.828387 # -b -71.397765 -29.889292 -71.585512 -30.234277 -71.749790 -30.701297 -71.716935 -31.203520 -71.630102 -31.750332 -71.585512 -32.294798 -71.529188 -32.872120 -71.728669 -33.390770 -71.850704 -33.888299 -72.005595 -34.345932 -72.071307 -34.646327 -72.235585 -35.118041 -72.533633 -35.542818 -72.676790 -35.946474 -72.852803 -36.385332 -73.040550 -36.695114 -73.216562 -36.800722 -73.195441 -37.180909 -73.636646 -37.314679 -73.657767 -37.734762 -73.559200 -38.030463 -73.580322 -38.560848 -73.502876 -38.750942 -73.371453 -39.102967 -73.338598 -39.523050 -73.526345 -39.844567 -73.702357 -39.912625 # -b 172.816245 -34.467968 172.849101 -34.458580 172.917159 -34.622859 173.015726 -34.850502 173.203473 -34.951416 173.302040 -34.977231 173.611822 -35.040595 173.952113 -35.132122 173.874668 -35.230689 174.118739 -35.284666 174.261896 -35.509962 174.449642 -35.690669 174.449642 -35.852600 174.229040 -35.897190 174.372197 -35.951167 174.658511 -36.333701 174.679632 -36.547263 174.724222 -36.706848 174.592799 -36.875820 174.757078 -36.946225 174.900235 -36.972041 175.153693 -36.965000 175.329706 -37.237233 175.397764 -36.777253 175.275728 -36.566038 175.540921 -36.681033 175.660609 -36.850005 175.749789 -37.079995 175.749789 -37.256008 175.871825 -37.457835 176.036103 -37.694866 176.632199 -37.877919 177.139116 -38.016382 177.380840 -37.929549 177.601442 -37.737109 177.833779 -37.605686 178.141214 -37.563443 178.385285 -37.755884 178.296105 -38.035157 178.274984 -38.312083 178.218660 -38.581970 177.887756 -38.795532 177.854900 -39.079499 177.810310 -39.260205 177.678888 -39.063071 177.282272 -39.088886 176.951369 -39.328263 176.787090 -39.558253 176.972490 -39.713144 176.862189 -39.992417 # -b 175.001149 -40.034660 174.426174 -39.804671 173.898136 -39.551212 173.919258 -39.079499 174.491886 -38.814306 174.592799 -38.295656 174.801668 -38.103215 174.768812 -37.842716 174.757078 -37.528241 174.559944 -37.256008 174.691366 -37.096423 174.613921 -36.972041 174.229040 -36.697461 174.160982 -36.547263 174.315873 -36.610628 174.196184 -36.397066 174.238427 -36.190545 173.996703 -36.190545 174.008437 -36.387679 173.445197 -35.735259 173.412341 -35.455985 173.391220 -35.383233 173.060316 -35.202527 173.069703 -35.068757 172.872569 -34.758975 172.651967 -34.496130 172.816245 -34.467968 # -b 153.330473 -29.720320 153.196704 -30.257745 153.032425 -30.762315 153.053547 -30.999345 152.999569 -31.339636 152.734377 -31.942773 152.457450 -32.261943 152.415207 -32.550603 152.105425 -32.719575 151.974002 -32.858039 151.687689 -33.174861 151.323929 -33.580864 151.366172 -33.709940 151.213628 -34.085433 150.969557 -34.578269 150.793544 -35.078145 150.638653 -35.141509 150.408663 -35.528737 150.242038 -35.808010 150.155205 -36.282071 150.143471 -36.638790 150.021436 -36.850005 # -b 149.988580 -37.079995 150.054291 -37.380390 150.021436 -37.502425 # -b 150.021436 -36.850005 149.979193 -36.990815 149.988580 -37.079995 # -b 150.021436 -37.502425 149.767977 -37.547015 149.371362 -37.816901 148.566398 -37.826289 147.949180 -37.974139 147.453998 -38.253413 147.200540 -38.427078 146.836780 -38.704005 146.515264 -38.704005 146.294661 -38.840121 146.538732 -38.755635 146.526998 -39.056030 146.196094 -38.875324 145.876925 -38.685230 145.546021 -38.572582 145.456841 -38.234638 145.060226 -38.427078 145.027370 -38.288615 144.884214 -37.870878 144.410153 -38.060972 144.675345 -38.227597 144.123839 -38.443506 143.682634 -38.755635 143.307140 -38.746248 142.448199 -38.391876 141.807513 -38.262800 141.500077 -38.375448 141.026017 -38.053932 140.253908 -37.748843 140.143607 -37.554056 # -b 147.904590 -39.797630 148.136927 -39.865688 148.280084 -39.959562 # -b 148.104071 -40.121493 147.860000 -39.865688 147.904590 -39.797630 # -b 140.143607 -37.554056 139.723523 -37.009590 139.812703 -36.584813 139.636690 -36.167076 139.392619 -35.906577 139.261197 -35.610876 139.183751 -35.430170 138.885703 -35.512309 138.479700 -35.655466 138.158184 -35.629651 138.500822 -35.005393 138.223895 -34.315423 137.871870 -34.568881 137.761569 -35.122735 137.376688 -35.214261 136.858037 -35.214261 137.198328 -34.951416 137.475255 -34.470314 137.454133 -34.296649 137.564435 -33.975132 137.883604 -33.524540 137.895339 -33.146699 137.928194 -32.951912 137.839014 -32.757125 137.707592 -32.644477 137.618412 -32.970687 137.275774 -33.498725 136.968339 -33.719327 136.616313 -33.930542 136.285410 -34.296649 135.921650 -34.597043 135.954506 -34.770709 135.722169 -34.988965 135.269230 -34.615818 135.182397 -34.496130 135.424121 -34.496130 135.226987 -33.965745 134.851493 -33.414239 134.598035 -33.228839 134.091119 -32.923750 134.222542 -32.559991 133.441045 -32.139907 133.372987 -32.224393 132.624347 -31.942773 132.359154 -32.046034 132.194876 -31.989710 131.476744 -31.557892 130.892382 -31.520343 130.286899 -31.586054 # -b 136.548255 -35.817398 136.980073 -35.664853 137.442399 -35.629651 137.684123 -35.772808 138.104207 -35.915965 137.618412 -35.995757 137.078640 -36.040347 136.538868 -35.880762 136.548255 -35.817398 # -b 130.286899 -31.586054 129.183887 -31.576667 128.092608 -32.083583 127.332234 -32.224393 126.592981 -32.271330 125.820872 -32.271330 125.149677 -32.644477 124.541847 -32.876813 124.002075 -33.193636 123.727495 -33.653616 123.307411 -33.864831 122.744171 -33.829628 122.183277 -33.930542 121.885229 -33.820241 121.068531 -33.792079 120.209589 -33.892993 119.988986 -33.883606 119.526660 -34.195735 119.404625 -34.388175 118.799141 -34.514904 118.367323 -34.862236 117.904997 -34.925600 117.597561 -35.087532 117.132888 -34.996005 116.539139 -34.916213 116.306802 -34.805912 115.943043 -34.660408 115.501838 -34.296649 115.081754 -34.050231 115.072367 -33.571477 115.105223 -33.562089 115.612139 -33.332099 115.644995 -32.775899 115.734174 -32.477851 115.743562 -31.877062 115.501838 -31.302087 115.248380 -30.790477 114.962066 -30.105201 114.962066 -30.105201 # -b 30.954755 -29.929188 30.555793 -30.569874 30.060611 -31.196479 29.455128 -31.649419 29.002189 -32.177456 28.274670 -32.773553 27.800609 -33.181902 27.281958 -33.486990 26.721065 -33.745142 26.136703 -33.754530 25.660295 -33.836669 25.683764 -34.111249 24.944511 -34.038497 24.327293 -34.167573 23.620896 -34.029109 23.081123 -34.167573 22.496762 -34.047884 22.100146 -34.167573 21.792711 -34.404603 21.295182 -34.404603 20.898567 -34.413990 20.567663 -34.496130 20.269615 -34.587656 19.861266 -34.742547 19.619542 -34.695611 19.288638 -34.632246 19.190071 -34.423378 18.760600 -34.404603 18.605709 -34.111249 18.429696 -34.294302 18.319395 -34.275527 18.361638 -33.918808 18.241949 -33.606679 17.943901 -33.219451 17.845334 -33.024664 17.866456 -32.745391 18.251337 -32.569378 18.098793 -31.745639 17.702177 -31.226988 17.380661 -30.675482 17.094347 -30.102854 17.094347 -30.102854 # -b -68.642581 -50.018097 -68.630847 -49.870246 -68.630847 -49.870246 # -b -67.990161 -50.067381 -67.682725 -49.598014 -67.748436 -49.419654 -67.307231 -48.898657 -67.009183 -48.687442 -66.525735 -48.448064 -66.072796 -48.175832 -65.763014 -48.004513 -65.798217 -47.701771 -65.709037 -47.215976 -66.293399 -47.140877 -66.943472 -46.870991 -67.441001 -46.476723 -67.572424 -46.141125 -67.318966 -45.763285 -67.086629 -45.486358 -66.668892 -45.237594 -66.171363 -45.049847 -65.655060 -45.082703 -65.521290 -44.941893 -65.366399 -44.587521 -65.202120 -44.169784 -65.202120 -43.627665 -64.904072 -43.282680 -64.528579 -43.139523 -64.286855 -43.040956 -64.519191 -42.944736 -65.026108 -42.815660 -64.838361 -42.660769 -64.364300 -42.571589 -64.110842 -42.864944 -63.613313 -42.742908 -63.636781 -42.245379 -64.298589 -42.212523 -64.275121 -42.426085 -64.519191 -42.294663 -65.035495 -41.876926 -65.157531 -41.172876 -64.859482 -40.780954 -64.352566 -40.964007 -63.801060 -41.163488 -63.106397 -41.182263 -62.500913 -40.973395 -62.313166 -40.654225 -62.369490 -40.039354 -62.369490 -40.039354 # -b -73.702357 -39.912625 -73.702357 -40.184858 -73.812658 -40.738711 -73.878370 -41.271443 -73.714091 -41.555410 -73.559200 -41.768972 -73.195441 -41.752544 -72.974838 -41.546022 -72.578223 -41.703260 -72.313031 -41.653977 -72.533633 -41.778359 -72.611079 -42.048245 -72.423332 -42.334559 -72.655669 -42.278235 -72.533633 -42.611485 -72.775357 -42.879025 -72.852803 -43.259212 -73.019428 -43.477468 -72.897393 -43.627665 -72.885659 -43.787250 -73.085140 -44.059483 -73.228297 -44.169784 -73.195441 -44.249576 -72.852803 -44.430283 -72.688524 -44.650885 -72.831681 -44.932505 -73.249418 -45.026379 -73.371453 -45.268103 -72.951370 -45.408913 -72.930248 -45.516867 -73.261152 -45.361976 -73.502876 -45.509827 -73.448899 -45.610741 -73.171972 -45.610741 -73.392575 -45.772672 -73.272886 -45.810222 -73.502876 -45.847771 -73.570934 -46.117657 -73.514610 -46.131738 -73.359719 -45.911136 -73.371453 -46.110617 -73.526345 -46.300710 -73.746947 -46.528353 -73.800924 -46.338260 -74.000405 -46.460295 -74.164684 -46.277242 -74.155296 -46.155206 -74.197539 -45.965113 -74.474466 -45.955725 -74.849960 -45.894708 -74.969648 -46.094189 -74.749046 -46.124698 -75.058828 -46.293670 -75.488299 -46.582330 -75.532889 -46.953130 -75.345142 -46.765384 -75.157395 -46.605799 -74.793636 -46.793546 -74.483853 -46.741915 -74.087238 -46.885072 -74.155296 -47.119756 -74.176418 -47.239444 -74.408755 -47.471781 -74.021527 -47.589123 -74.131828 -47.753401 -73.845514 -47.797991 -73.690623 -47.952882 -73.338598 -48.218075 -73.746947 -48.079611 -74.197539 -48.065530 -74.242129 -48.124201 -74.495587 -48.117161 -74.364165 -48.438677 -74.033261 -48.431637 -73.812658 -48.513776 -74.122441 -48.504388 -74.155296 -48.746112 -74.307841 -48.919778 -74.286719 -49.253029 -74.143562 -49.468938 -73.857248 -49.152115 -73.890104 -49.382105 -73.779803 -49.576892 -73.967550 -49.583933 -74.242129 -49.769333 -74.298453 -49.926571 -74.298453 -49.926571 # -b -73.878370 -41.752544 -73.824393 -41.834683 -73.681236 -41.867539 -73.526345 -42.024777 -73.404309 -42.327518 -73.636646 -42.571589 -73.756334 -42.660769 -73.538079 -42.864944 -73.592056 -43.090240 -73.702357 -43.364820 -74.286719 -43.364820 -74.242129 -42.904840 -74.188152 -42.426085 -74.098972 -41.966106 -73.911226 -41.768972 -73.878370 -41.752544 # -b -73.007694 -44.406814 -72.909127 -44.477219 -72.765970 -44.610989 -72.808213 -44.707209 -73.129729 -44.955974 -73.416043 -44.730678 -73.150851 -44.463138 -73.007694 -44.406814 # -b -74.298453 -44.650885 -74.209274 -44.643845 -73.967550 -44.681394 -74.197539 -44.784655 -74.298453 -44.650885 -74.298453 -44.650885 # -b -74.232742 -45.049847 -74.274985 -44.965361 -73.967550 -44.972402 -74.232742 -45.049847 -74.232742 -45.049847 # -b -74.164684 -45.129640 -74.110707 -45.106171 -73.746947 -45.190657 -74.000405 -45.160148 -74.164684 -45.129640 # -b -74.143562 -45.237594 -74.087238 -45.244634 -73.857248 -45.392485 -74.054382 -45.322080 -74.143562 -45.237594 # -b -73.866636 -45.796141 -73.746947 -45.932257 -73.878370 -45.847771 -73.866636 -45.796141 -73.866636 -45.796141 # -b -74.298453 -47.776870 -74.617623 -47.643100 -74.397020 -47.605551 -74.298453 -47.776870 -74.298453 -47.776870 # -b -74.981382 -47.701771 -75.213719 -47.849621 -75.255962 -47.753401 -74.981382 -47.701771 -74.981382 -47.701771 # -b -75.136273 -48.093692 -75.002504 -48.124201 -74.781901 -48.203994 -74.936792 -48.344804 -75.136273 -48.093692 -75.136273 -48.093692 # -b -75.443709 -48.168791 -75.399119 -48.065530 -75.267696 -48.159404 -75.157395 -48.396434 -75.070562 -48.570100 -75.213719 -48.417556 -75.443709 -48.168791 -75.443709 -48.168791 # -b -74.915671 -48.410515 -74.772514 -48.438677 -74.528443 -48.593568 -74.739658 -48.586528 -74.948527 -48.417556 -74.915671 -48.410515 # -b -75.467177 -48.607649 -75.488299 -48.497348 -75.324020 -48.504388 -75.356876 -48.694482 -75.467177 -48.607649 -75.467177 -48.607649 # -b -75.014238 -48.985490 -75.014238 -48.870495 -74.793636 -48.680401 -74.507322 -48.936206 -74.441610 -49.382105 -74.441610 -49.919530 -74.441610 -49.919530 # -b -74.727924 -50.046259 -74.849960 -49.720049 -74.814757 -49.518221 -75.190251 -49.339862 -75.112805 -49.274150 -75.070562 -49.187317 -75.014238 -48.985490 -75.014238 -48.985490 # -b -75.521154 -49.705968 -75.544623 -49.647297 -75.389732 -49.640257 -75.267696 -49.863206 -75.521154 -49.705968 -75.521154 -49.705968 # -b -176.322417 -43.791944 -176.345885 -43.871736 -176.399862 -44.045402 -176.686176 -44.068870 -176.742500 -43.878776 -176.676789 -43.775516 -176.322417 -43.791944 -176.322417 -43.791944 # -b 172.067605 -41.050840 172.112195 -40.985129 172.264739 -40.792688 172.485341 -40.649531 172.628498 -40.623716 172.696557 -40.858400 172.982871 -40.959314 173.036848 -41.292564 173.334896 -41.233893 173.501521 -41.142367 173.644678 -41.034412 173.841812 -40.966354 173.776101 -41.060227 173.787835 -41.266749 173.942726 -41.233893 173.919258 -41.151754 174.017825 -41.034412 174.139860 -41.109511 174.062415 -41.243281 174.128126 -41.374703 174.095270 -41.597653 174.139860 -41.862845 173.942726 -42.142118 173.698655 -42.336906 173.424076 -42.646688 173.236329 -42.890759 173.102559 -42.972898 172.950015 -43.076159 172.872569 -43.116055 172.827979 -43.141870 172.795124 -43.165339 172.771655 -43.205235 172.729412 -43.446959 172.684822 -43.662868 172.992258 -43.759088 172.926546 -43.831840 172.518197 -43.815412 172.342185 -43.878776 172.145050 -43.871736 171.835268 -44.038361 171.581810 -44.118154 171.459775 -44.038361 171.405797 -44.315288 171.229785 -44.779961 171.119483 -44.974748 170.964592 -45.225860 170.920002 -45.505133 170.699400 -45.711655 170.678278 -45.828996 170.621954 -45.920523 170.511653 -46.012050 170.171362 -46.258467 170.028205 -46.310098 # -b 169.995349 -43.350739 170.225339 -43.132483 170.546856 -42.996366 170.931737 -42.752296 171.140605 -42.468328 171.229785 -42.240685 171.372942 -41.853458 171.703845 -41.682139 171.990159 -41.400519 172.067605 -41.050840 172.067605 -41.050840 # -b 176.862189 -39.992417 176.620465 -40.330362 176.367007 -40.649531 175.982126 -41.151754 175.451741 -41.531941 175.087982 -41.391131 174.646777 -41.151754 174.801668 -41.083696 175.099716 -40.682387 175.186549 -40.245876 175.001149 -40.034660 # -b 167.878504 -46.744262 167.920747 -46.758343 168.063904 -46.910887 167.944215 -46.948437 168.099107 -47.016495 167.932481 -47.166692 167.690757 -47.166692 167.503010 -47.279341 167.524132 -47.091594 167.657902 -46.941396 167.711879 -46.720794 167.878504 -46.744262 167.878504 -46.744262 # -b 170.028205 -46.310098 169.807603 -46.418052 169.673833 -46.523660 169.497820 -46.591718 169.157529 -46.645695 168.847747 -46.652736 168.638879 -46.584677 168.451132 -46.563556 168.307975 -46.448561 168.120228 -46.418052 167.768203 -46.401624 167.446686 -46.173981 167.150985 -46.279589 166.665190 -46.181022 166.874059 -45.927563 166.620600 -46.082455 166.686312 -45.920523 166.456322 -45.906442 166.742636 -45.798488 166.796613 -45.674105 166.841203 -45.559110 166.841203 -45.458196 166.841203 -45.310346 167.028950 -45.333814 167.172107 -45.310346 167.007828 -45.216472 167.050071 -45.068622 167.204962 -44.904343 167.336385 -45.014645 167.458421 -44.991176 167.503010 -44.796389 167.822180 -44.559359 168.063904 -44.284779 168.307975 -44.028974 168.704590 -43.982037 169.145795 -43.791944 169.530676 -43.599503 169.995349 -43.350739 169.995349 -43.350739 # -b 148.280084 -39.959562 148.136927 -40.290465 148.104071 -40.121493 # -b 148.136927 -40.424235 148.280084 -40.339749 148.500686 -40.450050 148.136927 -40.424235 148.136927 -40.424235 # -b 144.795034 -40.675346 144.982781 -40.759833 145.304297 -40.776260 145.787745 -40.985129 146.404963 -41.151754 146.759335 -41.118898 147.254517 -41.010944 147.761433 -40.867787 148.125193 -40.818503 148.345795 -41.276136 148.336408 -41.714994 148.369264 -42.085794 148.378651 -42.200789 148.268350 -42.052939 148.092337 -42.503531 147.982036 -42.771070 147.606542 -42.778111 147.496241 -43.062078 147.242783 -43.174726 147.033914 -43.360126 146.792190 -43.608890 146.473021 -43.552566 146.031816 -43.416450 146.052937 -43.296761 145.656322 -42.923615 145.435720 -42.731174 145.280829 -42.322825 145.325419 -42.289969 145.435720 -42.217217 145.104816 -41.764278 144.851358 -41.360622 144.785646 -40.844319 144.795034 -40.675346 # -b 70.027213 -49.163849 69.999051 -49.182624 69.999051 -49.255376 # -b 68.966444 -49.109872 69.999051 -49.145074 # -b 69.970889 -49.656684 70.252510 -49.602707 70.196186 -49.529955 69.999051 -49.365677 70.503621 -49.346902 70.559945 -49.034773 70.252510 -49.109872 70.055375 -49.145074 # -b 69.999051 -49.255376 69.832426 -49.311700 69.637639 -49.220173 69.691616 -49.128647 69.747940 -49.018345 69.581315 -48.999571 69.104907 -49.034773 69.273879 -48.851720 69.161231 -48.666320 68.966444 -48.685095 68.910120 -48.889269 68.966444 -49.109872 68.966444 -49.109872 # -b 69.999051 -49.145074 69.245717 -49.201398 69.076745 -49.438429 69.104907 -49.637910 69.412343 -49.511181 69.776102 -49.656684 69.916912 -49.565158 69.970889 -49.656684 # -b 37.612727 -46.880379 37.711294 -46.873338 37.800473 -47.016495 37.612727 -46.880379 37.612727 -46.880379 # -b -26.359652 -58.408033 -26.261085 -58.443235 -26.458219 -58.459663 -26.437098 -58.403339 -26.359652 -58.408033 # -b -38.124337 -54.028838 -38.056278 -54.003023 -37.781699 -53.977208 -37.450795 -53.977208 -37.241927 -54.047613 -37.065914 -54.068735 -36.845312 -54.125059 -36.711542 -54.157914 -36.702155 -54.254135 -36.535529 -54.326886 -36.282071 -54.326886 -36.094324 -54.505246 -35.930046 -54.575651 -35.885456 -54.709421 -35.951167 -54.768091 -35.951167 -54.869005 -36.138914 -54.869005 -36.326661 -54.671871 -36.523795 -54.531061 -36.756132 -54.448922 -37.042446 -54.326886 -37.406205 -54.268216 -37.385084 -54.176689 -37.650276 -54.171995 -37.737109 -54.113324 -37.802820 -54.061694 -38.056278 -54.054654 -38.124337 -54.028838 # -b -59.313911 -51.423851 -59.182488 -51.437932 -59.248200 -51.616292 -59.555635 -51.841588 -59.755116 -51.991785 -59.975719 -51.996479 -59.975719 -51.996479 # -b -60.020308 -51.731287 -59.963984 -51.724246 # -b -60.041430 -51.505991 -59.710526 -51.463748 -59.313911 -51.484869 -59.313911 -51.423851 # -b -58.464357 -51.327631 -58.276610 -51.409770 -58.079476 -51.423851 -57.793162 -51.477829 -57.903463 -51.595170 -57.715716 -51.656188 -57.924585 -51.780570 -58.332934 -51.928421 -58.851585 -51.881484 -58.607514 -52.010560 -58.598126 -52.139636 -58.851585 -52.120861 -59.015863 -52.132596 -58.806995 -52.221775 -59.093309 -52.235856 -59.292790 -52.207694 -59.259934 -52.343811 -59.391357 -52.308608 -59.579103 -52.106780 -59.457068 -51.949542 -59.358501 -51.848629 -59.105043 -51.724246 -59.015863 -51.559968 -58.917296 -51.463748 -58.785873 -51.353446 -58.586392 -51.346406 -58.464357 -51.327631 # -b -70.064763 -52.578494 -69.600089 -52.484621 -69.358365 -52.275752 -69.006340 -52.289834 -68.431366 -52.376666 -68.365654 -52.308608 -68.508811 -52.214735 -68.806859 -51.949542 -69.126029 -51.677310 -69.280920 -51.581089 -69.060317 -51.334672 -69.292654 -51.083560 -69.149497 -50.708067 -68.663702 -50.280943 -68.454834 -50.130745 -68.642581 -50.018097 # -b -68.630847 -49.870246 -68.243619 -50.123705 -67.990161 -50.067381 # -b -68.651968 -52.658287 -68.454834 -52.806137 -68.222497 -53.045514 -68.222497 -53.111226 -68.487690 -53.191018 -68.189642 -53.376418 -67.990161 -53.669773 -67.584158 -53.859866 -67.318966 -54.061694 -66.966940 -54.150874 -66.690014 -54.261175 -66.359110 -54.460656 -65.917905 -54.639015 -65.357012 -54.697686 -65.178652 -54.861965 -65.476700 -54.976960 -65.840460 -54.925329 -66.305133 -55.021550 -66.690014 -54.958185 -67.110097 -54.894820 -67.638135 -54.876046 -67.936183 -54.824415 -68.377388 -54.843190 -68.586257 -54.894820 # -b -69.158884 -54.995734 -69.370100 -55.033284 -69.733859 -55.077874 -69.844160 -55.014509 -69.799570 -54.920636 -69.644679 -54.913595 -69.280920 -54.939410 -69.158884 -54.995734 # -b -69.942727 -55.174094 -69.632945 -55.129504 -69.215208 -55.052058 -68.950016 -55.028590 -68.532279 -54.969919 -68.288209 -55.059099 -68.464221 -55.152972 -68.851449 -55.091955 -68.696558 -55.185828 -68.267087 -55.211643 -68.145052 -55.312557 -68.508811 -55.331332 -68.201376 -55.392350 -67.990161 -55.523772 -67.915062 -55.711519 -68.133317 -55.610605 -68.365654 -55.462755 -68.651968 -55.512038 -68.774003 -55.418165 -68.905426 -55.312557 -69.215208 -55.267967 -69.072052 -55.486223 -69.280920 -55.549588 -69.402955 -55.443980 -69.600089 -55.336026 -69.337244 -55.230418 -69.590702 -55.272661 -69.942727 -55.272661 -69.942727 -55.174094 -69.942727 -55.174094 # -b -68.091074 -55.014509 -68.255353 -55.007469 -68.067606 -54.951145 -67.638135 -54.939410 -67.175809 -54.976960 -67.042039 -55.178788 -67.131219 -55.305517 -67.363556 -55.317251 -67.494978 -55.223377 -67.682725 -55.272661 -67.781292 -55.230418 -68.046485 -55.152972 -68.091074 -55.014509 -66.481146 -55.211643 -66.514001 -55.305517 -66.612568 -55.216337 -66.612568 -55.216337 # -b -64.408890 -54.798600 -64.230531 -54.772785 -64.045131 -54.772785 -63.714227 -54.735236 -63.690759 -54.819722 -63.944217 -54.812681 -64.155432 -54.869005 -64.408890 -54.920636 -64.606024 -54.894820 -64.507457 -54.772785 -64.408890 -54.798600 # -b -60.890984 -51.820466 -60.801805 -51.827507 -60.869863 -51.991785 -61.156177 -51.874444 -61.210154 -51.717206 -61.177298 -51.780570 -61.088118 -51.834547 -60.890984 -51.820466 -60.890984 -51.820466 # -b -59.975719 -51.996479 -60.175200 -52.017601 -60.273767 -52.174839 -60.527225 -52.247590 -60.691503 -52.132596 -60.703237 -52.179532 -60.858129 -52.045763 -60.691503 -51.977704 -60.339478 -51.956583 -60.351212 -51.841588 -60.163465 -51.745368 -60.020308 -51.731287 # -b -59.963984 -51.724246 -60.184587 -51.581089 -60.405189 -51.534153 -60.372334 -51.463748 -60.428658 -51.416811 -60.041430 -51.505991 -60.041430 -51.505991 # -b -68.741148 -52.658287 -68.910120 -52.618390 -69.358365 -52.533904 -69.691616 -52.637165 -69.945074 -52.770935 # -b -69.999051 -53.395193 -69.412343 -53.343562 -69.637639 -53.611102 -69.916912 -53.693241 # -b -69.999051 -54.155567 -69.412343 -54.286990 -69.553153 -54.418413 -69.888750 -54.401985 -69.888750 -54.401985 # -b -69.999051 -54.887780 -69.553153 -54.854924 -68.910120 -54.951145 -68.602684 -54.887780 -68.586257 -54.894820 # -b -74.298453 -49.926571 -74.462732 -50.130745 -74.340696 -50.379510 -73.988671 -50.449915 -74.066117 -50.527360 -73.934694 -50.778472 -73.714091 -50.729188 -74.087238 -50.902854 -73.944081 -51.214983 -73.570934 -51.534153 -73.538079 -51.916687 -73.282274 -52.085659 -73.392575 -51.623332 -73.249418 -51.881484 -73.040550 -51.977704 -73.085140 -51.710165 -72.754236 -51.827507 -72.831681 -51.635067 -73.117995 -51.470788 -72.578223 -51.738327 -72.489043 -51.970664 -72.622813 -52.017601 -72.435066 -52.282793 -72.709646 -52.463499 -72.632200 -52.564413 -72.456188 -52.679408 -71.904682 -52.557373 -71.409499 -52.719304 -71.123185 -52.965722 -71.552656 -53.242649 -71.961006 -53.402233 -72.137018 -53.303666 -72.214464 -53.566512 -71.651223 -53.782421 -71.233487 -53.845785 -71.022272 -53.735484 -70.956560 -53.282545 -70.836872 -53.012659 -70.836872 -52.766241 -70.548211 -52.691142 -70.196186 -52.625431 -70.064763 -52.578494 # -b -74.441610 -49.919530 -74.551912 -50.032178 -74.727924 -50.046259 # -b -75.377998 -50.302064 -75.356876 -50.189416 -75.047094 -50.182376 -74.903937 -50.287983 -75.136273 -50.428793 -75.377998 -50.302064 -75.377998 -50.302064 # -b -74.441610 -50.686945 -74.573033 -50.597765 -74.695068 -50.393591 -74.364165 -50.555522 -74.155296 -50.827755 -74.373552 -50.722148 -74.441610 -50.686945 # -b -74.441610 -51.001421 -74.629357 -51.153965 -74.838225 -50.722148 -74.814757 -50.679905 -74.483853 -50.771431 -74.408755 -50.966218 # -b -74.882815 -51.430892 -74.826491 -51.306510 -74.629357 -51.182127 -74.629357 -51.416811 -74.859347 -51.416811 -74.882815 -51.430892 # -b -74.871081 -52.139636 -74.969648 -51.970664 -74.882815 -51.792304 -74.781901 -51.888525 -74.871081 -52.139636 -74.871081 -52.139636 # -b -74.054382 -51.677310 -73.866636 -51.881484 -74.164684 -51.710165 -74.164684 -51.602211 -74.054382 -51.677310 # -b -73.714091 -51.534153 -73.669502 -51.602211 -73.723479 -51.670269 -73.890104 -51.423851 -73.714091 -51.534153 -73.714091 -51.534153 # -b -73.538079 -52.221775 -73.502876 -52.179532 -73.272886 -52.221775 -73.007694 -52.179532 -72.852803 -52.289834 -72.841069 -52.106780 -72.676790 -52.092699 -72.688524 -52.390747 -72.841069 -52.665327 -72.622813 -52.824912 -72.369355 -52.857768 -72.005595 -52.705223 -71.552656 -52.726345 -71.630102 -52.965722 -72.038451 -53.151122 -72.247319 -53.209793 -72.489043 -53.249689 -72.521899 -53.442130 -72.754236 -53.402233 -73.117995 -53.191018 -72.697912 -53.191018 -72.876271 -52.958682 -73.085140 -53.057249 -73.240031 -52.932866 -73.448899 -52.759201 -73.570934 -52.691142 -73.559200 -52.369626 -73.538079 -52.221775 # -b -73.723479 -52.449418 -73.681236 -52.592575 -73.812658 -52.712264 -73.878370 -52.672368 -73.812658 -52.597269 -73.901838 -52.611350 -73.866636 -52.470540 -73.723479 -52.449418 # -b -74.671600 -52.759201 -74.605889 -52.777975 -74.418142 -52.911745 -74.131828 -52.998578 -73.833780 -53.071330 -73.538079 -53.165203 -73.416043 -53.209793 -73.216562 -53.303666 -73.207175 -53.381112 -73.502876 -53.336522 -73.812658 -53.118266 -73.866636 -53.216833 -74.087238 -53.158163 -74.474466 -53.019699 -74.650479 -52.799097 -74.671600 -52.759201 # -b -74.629357 -51.731287 -74.594155 -51.773530 -74.573033 -51.902606 -74.629357 -52.092699 -74.749046 -52.031682 -74.695068 -51.888525 -74.683334 -51.745368 -74.629357 -51.731287 # -b -73.613177 -53.395193 -73.437165 -53.402233 -73.240031 -53.474985 -73.085140 -53.449170 -72.930248 -53.474985 -72.775357 -53.519575 -72.599345 -53.592327 -72.435066 -53.683854 -72.202730 -53.794155 -72.345887 -53.859866 -72.423332 -54.080469 -72.622813 -54.054654 -72.808213 -54.120365 -72.897393 -54.073428 -73.028816 -54.021798 -73.294008 -53.970167 -73.272886 -53.819970 -73.448899 -53.761299 -73.514610 -53.625183 -73.681236 -53.453864 -73.613177 -53.395193 # -b -71.883560 -53.859866 -71.794380 -53.925578 -71.707547 -54.010064 -71.618368 -54.028838 -71.386031 -54.042919 -71.266342 -54.132099 -71.090330 -54.164955 -71.099717 -54.357395 -71.275730 -54.305765 -71.662957 -54.228319 -71.707547 -54.312805 -71.993861 -54.190770 -72.104162 -54.106284 -72.181608 -53.951393 -71.928150 -53.866907 -71.883560 -53.859866 # -b -70.548211 -53.592327 -70.482499 -53.611102 -70.449644 -53.866907 -70.372198 -54.054654 -70.494234 -54.054654 -70.625656 -54.087509 -70.383932 -54.223626 -70.461378 -54.275256 -70.747692 -54.132099 -70.836872 -53.904456 -70.649125 -53.873947 -70.670246 -53.730790 -70.548211 -53.592327 -70.548211 -53.592327 # -b -71.001150 -55.110729 -70.989416 -55.033284 -70.801669 -54.984000 -70.747692 -55.129504 -70.890849 -55.148279 -71.001150 -55.110729 # -b -70.362811 -55.272661 -70.449644 -55.267967 -70.616269 -55.129504 -70.437910 -55.148279 -70.339342 -55.235112 -70.362811 -55.272661 # -b -69.945074 -52.770935 -70.419135 -52.754507 -70.111699 -52.942254 -70.362811 -52.991537 -70.475459 -53.261423 -70.168024 -53.444476 -69.999051 -53.395193 # -b -69.916912 -53.693241 -70.111699 -53.909150 -69.999051 -54.155567 # -b -69.888750 -54.401985 -70.224348 -54.319846 -70.139861 -54.418413 -70.503621 -54.303418 -70.949520 -54.204851 -70.754732 -54.385557 -70.921358 -54.418413 -71.313279 -54.498205 -71.285117 -54.646056 -71.090330 -54.646056 -70.921358 -54.725848 -70.811056 -54.791560 -70.613922 -54.805641 -69.999051 -54.887780 -69.999051 -54.887780 # -b 166.167661 -50.600112 166.179395 -50.738575 166.223985 -50.872345 166.092563 -50.865305 166.101950 -50.954484 165.925937 -50.900507 165.947059 -50.752656 166.113684 -50.571950 166.167661 -50.600112 # -b -1.509015 -70.053029 -1.462078 -69.877016 -0.880063 -69.656413 -0.959856 -69.370100 -1.020873 -69.111948 -0.326210 -69.067358 -0.147851 -69.130722 -0.147851 -69.130722 # -b 0.021122 -69.095520 -0.058671 -69.201127 # -b -45.697574 -60.548346 -45.399526 -60.553040 -45.169536 -60.665688 -45.059234 -60.764255 -45.333814 -60.698544 -45.664718 -60.644567 -45.885320 -60.651607 -45.941644 -60.585896 -45.697574 -60.548346 # -b -54.646056 -61.144442 -54.876046 -61.203113 -55.472142 -61.294640 -55.124810 -61.102199 -54.646056 -61.144442 -54.646056 -61.144442 # -b -58.943111 -62.273270 -58.830463 -62.184090 -58.544149 -62.090217 -58.112331 -62.010425 -57.638271 -62.076136 -58.102944 -62.151235 -58.422114 -62.247455 -58.802301 -62.273270 -58.943111 -62.273270 # -b -60.027349 -62.641723 -59.919395 -62.719169 # -b -58.316506 -64.448786 -58.171002 -64.364300 -58.466704 -64.235224 -58.335281 -64.110842 -57.879995 -63.913708 -57.527970 -64.045131 -57.241656 -64.291548 -57.847139 -64.476948 -58.316506 -64.448786 -58.316506 -64.448786 # -b -57.490420 -64.601331 -57.110233 -64.481642 -57.199413 -64.596637 -57.199413 -64.596637 # -b -60.062551 -63.953604 -59.583797 -63.920748 -59.227078 -63.742389 -58.405686 -63.517093 -57.668780 -63.399751 -57.011666 -63.383323 -57.194719 -63.681371 -57.466952 -63.552295 -57.748572 -63.704840 -58.382218 -63.864424 -58.804648 -64.246958 -58.907909 -64.751528 -59.255240 -65.319462 -59.565022 -65.678528 -59.823174 -65.950761 # -b -57.283899 -64.636533 -57.434096 -64.638880 -57.490420 -64.601331 # -b -57.739185 -63.937176 -57.222881 -63.906667 -57.485726 -64.009928 -57.739185 -63.937176 # -b -60.717318 -67.042039 -60.834660 -67.647523 -60.787724 -68.515852 -60.379374 -69.172965 -60.604670 -69.830079 -60.604670 -69.830079 # -b -61.120974 -62.763759 -61.106893 -62.747331 -60.858129 -62.669885 -60.496716 -62.608868 -60.074286 -62.594787 -60.027349 -62.641723 # -b -59.917048 -62.719169 -60.362946 -62.791921 -60.719665 -62.728556 -61.118627 -62.780187 -61.118627 -62.763759 # -b -62.691007 -64.566128 -62.658151 -64.425318 -62.545503 -64.183594 -62.094911 -64.192981 -62.226333 -64.378381 -62.489179 -64.512151 -62.691007 -64.566128 # -b -64.296242 -64.756222 -63.986460 -64.591943 -63.559336 -64.368994 -63.249554 -64.392462 -63.165067 -64.465214 -63.216698 -64.638880 -62.855285 -64.613065 -63.484237 -64.763262 -64.033396 -64.847748 -64.296242 -64.756222 -64.296242 -64.756222 # -b -66.248809 -65.941373 -66.187791 -65.856887 -65.995351 -65.676181 -65.638632 -65.631591 -65.868622 -65.814644 -66.225341 -65.948414 -66.248809 -65.941373 # -b -69.076745 -67.825882 -69.137763 -67.757824 -69.287960 -67.539568 -68.870224 -67.262642 -68.504117 -66.950513 -67.950264 -66.823783 -68.001895 -67.023264 -67.950264 -67.304885 -68.199029 -67.494978 -68.231885 -67.685072 -68.630847 -67.764864 -69.076745 -67.825882 -69.076745 -67.825882 # -b -70.064763 -69.295001 -69.557846 -69.395915 -69.374793 -69.632945 -69.351325 -69.834773 # -b -68.837368 -70.001398 -68.659009 -69.625905 -68.274128 -69.337244 -67.659257 -69.208168 -67.321313 -68.924201 -67.063161 -68.567482 -66.969287 -68.332798 -67.124178 -68.149745 -66.682973 -67.875166 -66.837864 -67.800067 -66.593794 -67.699153 -66.964594 -67.659257 -67.532528 -67.631095 -67.678031 -67.448042 -67.541915 -67.274376 -67.110097 -67.060814 -66.837864 -67.152340 -66.687667 -67.358862 -66.321561 -67.333047 -66.330948 -66.877761 -65.401601 -66.631343 -65.725465 -66.335642 -65.425070 -66.215953 -65.087125 -66.105652 -65.091819 -66.014125 -64.622452 -66.072796 -64.594290 -65.915558 -64.303283 -65.828725 -64.275121 -65.720771 -64.040437 -65.640979 -63.730655 -65.577614 -64.120229 -65.312422 -63.298837 -65.136409 -63.148640 -65.084779 -62.402346 -64.904072 -62.355409 -64.645920 -62.069095 -64.718672 -61.505855 -64.566128 -61.102199 -64.399503 -60.440392 -64.014622 -60.064898 -63.953604 # -b -59.825521 -65.950761 -60.632832 -66.596140 -60.717318 -67.042039 -60.717318 -67.042039 # -b -75.910729 -70.010786 -76.042152 -69.818345 -75.389732 -69.724472 -74.817104 -69.628251 -74.399367 -69.799570 -74.643438 -69.989664 -74.643438 -69.989664 # -b -74.573033 -70.001398 -74.174071 -69.851201 -73.301048 -69.794877 -72.639241 -69.701003 -72.798826 -69.578968 -72.470269 -69.438158 -71.784993 -69.569581 -71.902335 -69.264492 -71.573778 -69.072052 -70.611575 -68.921854 -70.146902 -69.057971 -70.090578 -69.168272 -70.067110 -69.295001 # -b -90.484575 -68.804512 -90.404783 -69.027462 -90.841294 -69.032155 -90.742727 -68.809206 -90.484575 -68.804512 # -b 159.753761 -69.675188 160.063543 -69.855894 160.265371 -69.977930 # -b 164.132955 -67.548956 164.419269 -67.466816 164.334783 -67.663950 164.189279 -67.523140 164.189279 -67.523140 # -b 149.864198 -68.501771 150.995372 -68.414938 152.943245 -68.482996 154.492157 -68.656662 154.398283 -68.910120 155.398035 -69.025115 156.829604 -69.074398 157.289584 -69.219902 158.303417 -69.323163 159.753761 -69.675188 159.753761 -69.675188 # -b 139.923004 -66.690014 141.640887 -66.793275 142.373100 -67.023264 143.527743 -67.042039 144.452396 -67.145300 145.827641 -67.234480 145.273788 -67.673338 146.301702 -67.818842 147.024527 -68.020669 148.155702 -68.267087 147.841226 -68.450140 148.864446 -68.377388 149.310345 -68.506464 149.662370 -68.525239 149.864198 -68.501771 149.864198 -68.501771 # -b 129.894978 -66.007085 130.932279 -66.197178 132.133858 -66.192485 133.532572 -66.131467 134.518243 -65.863928 134.907817 -65.312422 135.588400 -65.249057 135.208212 -65.990657 135.226987 -66.077490 136.029605 -66.302786 137.616065 -66.476452 139.409047 -66.668892 139.920657 -66.690014 # -b 119.604106 -66.969287 120.932414 -66.805009 121.035675 -66.370844 121.181179 -65.720771 121.824212 -66.258196 122.523568 -66.600834 123.302718 -66.790928 123.875345 -66.598487 123.363735 -66.551551 123.828409 -66.239422 125.386707 -66.298092 126.461558 -66.445943 127.099897 -66.556244 127.813335 -67.023264 129.122869 -67.037345 129.535912 -66.619609 129.817532 -66.215953 129.897324 -66.007085 # -b 109.958613 -66.652464 110.474917 -66.530429 110.521854 -66.291052 111.897099 -65.936680 112.868689 -65.784135 113.877828 -66.049328 114.488005 -66.441249 115.032471 -66.492880 115.910187 -66.387272 116.698724 -66.701748 117.717250 -66.973981 118.510480 -66.922351 119.604106 -66.969287 # -b 99.822632 -65.821685 100.775447 -65.469660 101.573371 -65.650366 102.582510 -65.716077 102.873518 -65.199774 103.624505 -65.406295 104.802616 -65.633938 104.999751 -66.054022 104.131422 -65.917905 104.844859 -66.136161 106.525193 -66.450637 107.876970 -66.614915 108.454292 -66.851945 109.050388 -66.936432 109.646484 -66.645424 109.956266 -66.652464 # -b 89.545841 -66.920004 91.850433 -66.624302 93.047319 -66.678280 94.309916 -66.626649 94.309916 -66.626649 # -b 94.300529 -66.636037 94.835608 -66.417781 95.173552 -66.481146 95.520883 -66.265237 95.497415 -65.619857 96.093511 -65.152837 97.318559 -65.450885 98.440346 -65.816991 99.524584 -65.946067 99.824979 -65.821685 # -b 79.768926 -68.034750 81.294369 -67.896287 81.791898 -67.396411 82.369219 -66.959900 81.336612 -66.049328 82.181473 -66.025860 83.265710 -66.504614 84.387498 -66.481146 85.283989 -66.551551 86.264966 -66.314520 88.273857 -66.192485 89.545841 -66.920004 89.545841 -66.920004 # -b 69.682229 -68.053525 70.475459 -68.544014 71.357869 -68.734107 72.141712 -68.410244 73.493489 -68.609725 73.455940 -68.924201 74.347737 -69.046236 74.225701 -69.590702 74.192846 -69.818345 75.370957 -69.311429 75.535235 -69.578968 76.544375 -69.499176 77.929007 -69.048583 78.243483 -68.497077 79.768926 -68.034750 79.768926 -68.034750 # -b 59.680017 -67.541915 61.158523 -67.581811 61.322802 -67.689766 61.923592 -67.668644 62.913956 -67.746090 64.228184 -67.701500 65.603429 -67.861085 67.908021 -67.961998 69.625905 -67.884553 69.682229 -68.053525 # -b 49.992282 -67.349475 50.250434 -67.196930 50.386550 -66.936432 50.039219 -66.887148 # -b 49.903102 -66.671239 50.799593 -66.368497 52.179532 -66.077490 53.385806 -66.016472 54.653096 -66.075143 55.615299 -66.258196 56.103441 -66.457677 56.802797 -66.638383 57.070337 -66.887148 56.450772 -66.999796 56.812185 -67.182849 57.412975 -67.157034 58.018458 -67.206318 58.562924 -67.330700 58.445582 -67.412839 59.182488 -67.506712 59.445334 -67.473857 59.680017 -67.541915 # -b 39.940787 -68.966444 41.029719 -68.684824 42.184361 -68.447793 42.803926 -68.095768 44.268351 -67.757824 45.127293 -67.746090 46.249080 -67.344781 47.187814 -67.567730 47.070472 -67.713234 47.469434 -67.844657 48.380006 -67.640482 49.041814 -67.511406 48.614690 -67.459776 48.253277 -67.124178 48.971409 -67.074895 49.759945 -67.318966 49.989935 -67.349475 # -b 50.036872 -66.887148 49.900755 -66.671239 # -b 29.858783 -69.353672 30.661401 -69.133069 31.590748 -69.205821 32.365203 -69.550806 33.012930 -69.334897 32.801715 -69.043889 33.961051 -68.774003 35.096919 -69.226943 35.810357 -69.590702 36.612975 -69.757327 37.575177 -69.811305 37.575177 -69.811305 # -b 38.150152 -70.132821 38.863590 -69.752634 39.225002 -69.553153 39.314182 -69.327857 39.511316 -69.001646 39.943134 -68.966444 39.943134 -68.966444 # -b 19.525668 -69.994358 20.041972 -69.987317 # -b 27.507255 -70.053029 28.582105 -69.844160 29.079634 -69.625905 29.858783 -69.353672 # -b 9.868442 -69.975583 10.051495 -69.963849 # -b 12.600158 -70.104659 12.886472 -69.841813 13.477874 -69.548459 14.571499 -69.381834 14.839039 -69.370100 15.303712 -69.712738 16.345707 -69.792530 17.819519 -69.855894 18.373372 -69.989664 # -b 19.147828 -70.043641 19.523321 -69.994358 # -b -0.150197 -69.130722 0.023468 -69.095520 # -b -0.053977 -69.201127 0.359066 -69.651720 1.016180 -69.980277 # -b 1.342390 -70.062416 1.783595 -69.933340 # -b 6.824597 -70.010786 7.171928 -69.992011 # -b 7.545075 -70.003745 7.906488 -69.994358 8.239738 -69.989664 # -b 9.239490 -70.043641 9.868442 -69.975583 9.868442 -69.975583 # -b -10.150062 -70.914317 -9.539885 -70.635044 -8.704411 -70.571679 -7.840776 -70.717183 -7.014690 -70.501274 -6.263703 -70.520049 -5.188852 -70.459031 -4.311136 -70.407401 -3.372402 -70.360464 -2.597946 -70.266591 -1.509015 -70.053029 -1.509015 -70.053029 # -b -20.105337 -73.479408 -19.452916 -73.066365 -18.955387 -72.869231 -18.495408 -72.629854 -17.101388 -72.613426 -16.420805 -72.486697 -15.529008 -72.209770 -14.139682 -72.019676 -13.318289 -72.104162 -13.046056 -71.989168 -12.501591 -71.770912 -12.140178 -71.407152 -11.370416 -71.141960 -10.375358 -70.994109 -10.150062 -70.914317 # -b -30.236624 -76.718040 -28.790973 -76.375402 -27.457971 -76.187656 -26.650660 -75.915423 -26.683515 -75.565744 -25.031343 -75.293511 -24.425860 -75.086990 -23.642017 -74.535484 -22.440438 -74.213967 -21.558027 -74.216314 -20.727248 -73.908879 -20.107683 -73.479408 -20.107683 -73.479408 # -b -31.975629 -77.117002 -31.008733 -76.910481 -30.238971 -76.718040 # -b -40.799729 -77.825747 -37.514160 -77.985331 -35.430170 -77.870336 -32.848651 -77.196795 -31.975629 -77.117002 # -b -50.323186 -77.659121 -47.966963 -77.722486 -45.920523 -78.058083 -44.427936 -78.250524 -42.428432 -77.818706 -40.795035 -77.825747 # -b -45.997969 -77.680243 -47.471781 -77.713098 -47.621978 -77.471374 -45.885320 -77.699017 -46.091842 -77.724833 # -b -60.238564 -72.160487 -59.961638 -72.303643 # -b -60.210402 -72.890352 -59.656549 -73.380841 -59.656549 -73.380841 # -b -60.590589 -75.281777 -58.093557 -75.748797 -56.765248 -76.422339 -55.826514 -76.788445 -54.709421 -77.046597 -54.085162 -77.241385 -54.446575 -77.457293 -54.207198 -77.659121 # -b -60.602324 -69.830079 -60.691503 -70.557598 -60.419270 -71.064515 -60.555387 -71.806114 -60.175200 -71.961006 -60.236217 -72.160487 # -b -59.961638 -72.303643 -60.210402 -72.890352 -60.210402 -72.890352 # -b -59.654202 -73.380841 -60.719665 -73.620218 -60.578855 -74.143562 -60.677422 -74.284372 -61.498815 -74.723231 -60.588243 -75.281777 -60.588243 -75.281777 # -b -69.353672 -69.834773 -68.837368 -70.001398 -68.837368 -70.001398 # -b -74.936792 -70.043641 -75.448403 -70.027213 -75.908382 -70.010786 # -b -74.643438 -69.989664 -74.939139 -70.043641 -74.939139 -70.043641 # -b -80.036465 -73.085140 -78.675301 -73.251765 -77.990025 -73.343291 -78.708157 -72.885659 -77.544126 -72.756583 -77.675549 -72.559449 -76.802526 -72.573530 -76.473970 -72.702605 -76.145413 -72.829335 -75.798081 -72.939636 -74.629357 -72.923208 -73.704704 -73.068712 -73.465327 -73.263499 -72.658016 -73.484102 -71.930497 -73.350332 -72.643935 -73.017081 -72.132325 -72.693218 -72.545368 -72.484350 -72.719033 -72.174568 -73.615524 -72.202730 -74.925058 -71.982127 -75.511767 -71.493985 -74.868734 -71.371950 -73.662461 -71.259302 -73.685929 -70.970641 -74.770167 -70.907277 -75.155048 -70.787588 -74.568339 -70.731264 -74.221008 -70.569332 -74.610582 -70.092925 -74.573033 -70.001398 # -b -90.301522 -72.496084 -88.818322 -72.517205 -87.311654 -72.540674 -85.800292 -72.880965 -83.880581 -72.885659 -81.721493 -73.033509 -80.036465 -73.085140 -80.036465 -73.085140 # -b -100.054969 -72.014983 -99.867222 -72.031411 # -b -100.045582 -72.087735 -99.463566 -72.181608 -98.956650 -72.221504 -98.280762 -72.317724 -98.468508 -72.155793 -97.961592 -72.092428 -97.562630 -72.282522 -97.327946 -72.176914 -96.797562 -72.047838 -96.581653 -72.252013 -95.891683 -72.291909 -95.760261 -72.411598 -95.919845 -72.634547 -95.197020 -72.714340 -94.906013 -72.733114 -93.676271 -72.704952 -92.408980 -72.737808 -90.860069 -72.543021 -90.301522 -72.496084 # -b -104.903530 -73.308089 -104.457632 -73.279927 -104.194786 -73.486448 -104.795576 -73.418390 -104.903530 -73.308089 # -b -110.029018 -74.350084 -109.193545 -74.718537 -107.010988 -75.070562 -107.597697 -74.392327 -105.607581 -74.274985 -105.250862 -74.657519 -104.931692 -74.810063 -102.843009 -75.016585 -101.181450 -75.009544 -101.890194 -74.652825 -101.988761 -74.218661 -102.134265 -73.838474 -101.556943 -73.753988 -100.974928 -73.589709 -102.016923 -73.498183 -103.011981 -73.430124 -103.415637 -73.218909 -103.227890 -73.017081 -102.800766 -72.890352 -102.997900 -72.669750 -103.584609 -72.423332 -102.279769 -72.324765 -101.214305 -72.050185 -100.054969 -72.014983 # -b -99.864875 -72.031411 -100.043235 -72.087735 # -b -120.141531 -73.915919 -118.954032 -74.037955 -117.179825 -74.155296 -115.424392 -74.181112 -113.978742 -74.061423 -113.448357 -74.190499 -112.026175 -74.371205 -111.031117 -74.267944 -110.026671 -74.350084 # -b -130.223534 -74.192846 -128.411778 -74.096626 -128.411778 -74.096626 # -b -127.503553 -73.988671 -125.954641 -73.718785 -125.513436 -73.369107 -124.030237 -73.470021 -123.030485 -73.700010 -121.214034 -73.807965 -120.247138 -73.904185 -120.143878 -73.915919 # -b -140.474510 -75.126886 -135.931037 -74.673947 -135.316167 -74.737312 # -b -135.318514 -74.737312 -134.201420 -74.765474 -133.046777 -74.634051 -131.948458 -74.418142 -130.629537 -74.199886 -130.225881 -74.192846 # -b -150.134084 -76.614780 -148.143968 -76.260408 -148.143968 -76.260408 # -b -145.801826 -75.335754 -146.623218 -75.666658 -146.979937 -75.554010 -145.923861 -75.349835 -145.801826 -75.335754 # -b -147.461038 -76.347240 -145.827641 -76.546721 -146.588016 -76.089089 -145.043798 -75.626762 -142.279227 -75.237187 -140.472163 -75.126886 -140.472163 -75.126886 # -b -160.464852 -77.975944 -158.568609 -77.652081 -158.465348 -77.203835 -154.935708 -77.117002 -153.283536 -77.276587 -151.415456 -77.107615 -150.157552 -76.718040 -150.129390 -76.614780 # -b -170.490532 -78.565000 -166.989054 -78.546225 -164.454472 -78.407762 -162.408031 -78.173078 -160.464852 -77.975944 # -b -179.000000 -78.427199 -176.287399 -78.506329 -173.865466 -78.520410 -170.486023 -78.565000 -170.486023 -78.565000 # -b 169.988309 -71.411846 170.485838 -71.914069 170.274623 -72.031411 # -b 169.910863 -77.530045 172.257698 -77.675549 175.299197 -77.851562 178.500280 -78.189506 179.000000 -78.238497 # -b 160.263024 -69.977930 160.671373 -70.322915 161.459910 -70.416788 162.271915 -70.719530 162.975966 -70.731264 164.247950 -70.752385 165.862573 -70.628003 166.299084 -70.759426 166.989054 -71.019925 168.124922 -71.170122 169.293646 -71.639489 169.880354 -71.571431 169.988309 -71.411846 # -b 170.274623 -72.031411 169.903823 -72.298950 169.565879 -72.866884 168.796117 -73.244724 167.613312 -73.491142 166.618254 -74.103666 164.952001 -74.265598 165.332188 -74.561299 164.144689 -74.753739 163.501657 -75.263003 164.229175 -75.631456 162.708426 -75.593906 162.501905 -75.962359 162.802300 -76.295610 162.553535 -76.577230 162.445581 -76.936296 162.774138 -77.117002 162.957191 -77.461987 163.421864 -77.811666 163.830214 -77.882071 164.276112 -77.736567 164.313662 -77.332911 164.538958 -77.142818 164.825272 -77.288321 165.557484 -77.440866 166.177049 -77.530045 166.177049 -77.530045 # -b 169.603428 -73.338598 169.603428 -73.338598 169.495474 -73.308089 169.603428 -73.338598 # -b 37.577524 -69.811305 37.962405 -70.020173 38.150152 -70.132821 # -b 20.041972 -69.987317 21.426605 -70.158636 21.022949 -70.236082 23.008372 -70.233735 24.378923 -70.339342 24.791966 -70.217307 25.284802 -70.203226 26.092113 -70.132821 26.617804 -70.022520 27.509601 -70.053029 # -b 10.051495 -69.963849 10.764933 -70.020173 11.928963 -70.043641 12.600158 -70.104659 # -b 18.373372 -69.989664 18.758253 -70.017826 19.147828 -70.043641 # -b 1.013833 -69.980277 1.342390 -70.062416 # -b 1.781248 -69.933340 2.813855 -70.111699 4.062372 -70.069456 5.118447 -70.128127 5.564346 -70.290059 5.972695 -70.158636 6.399819 -70.203226 6.822250 -70.010786 6.822250 -70.010786 # -b 7.171928 -69.992011 7.547422 -70.003745 # -b 8.242085 -69.989664 9.194900 -70.107006 9.241837 -70.043641 # -b -19.443529 81.768430 -18.908451 81.744961 -18.561119 81.665169 -18.974162 81.686290 -19.443529 81.768430 # -b -19.598420 80.231253 -19.063342 80.153807 -19.729843 80.052893 -19.898815 80.177275 -19.598420 80.231253 # -b -20.018504 81.463341 -19.596073 81.522012 -18.948347 81.458647 -18.413268 81.449260 -18.300620 81.543133 -18.047162 81.573642 -18.065937 81.629966 -18.103486 81.709759 -17.568408 81.676903 -17.605957 81.824754 -17.221076 81.834141 -16.742322 81.869343 -15.878686 81.885771 -15.202798 81.904546 -14.376712 81.831794 -13.691436 81.810673 -12.959224 81.740268 -12.349046 81.615885 -12.837188 81.442219 -13.372267 81.296716 -13.851021 81.191108 -14.151416 81.108969 -14.695882 81.111316 -15.118312 81.047951 -14.742818 80.907141 -15.690940 80.832042 -16.010109 80.766331 -16.714160 80.705313 -17.718605 80.742863 -18.150423 80.702966 -18.591628 80.623174 -19.464651 80.646642 -19.736883 80.665417 # -b -20.018504 80.627868 -19.267516 80.559809 -18.206747 80.543382 -17.249238 80.595012 -16.263567 80.536341 -16.573350 80.386144 -16.704772 80.329820 -17.455760 80.217172 -18.366332 80.212478 -19.333228 80.250027 -19.896468 80.271149 # -b -19.774433 79.980141 -19.107932 80.062280 -18.469592 80.102177 -17.709218 80.113911 -17.512084 80.012997 # -b -21.121516 82.153311 -20.849283 82.080559 -20.314205 81.977298 -20.041972 81.834141 -20.792959 81.920974 -21.374974 82.071171 -21.121516 82.153311 # -b -22.851134 82.033622 -22.560126 81.911587 -22.513189 81.761389 -22.550739 81.550174 -22.785422 81.390589 -23.414374 81.277941 -23.461311 81.242738 -23.461311 81.123050 -24.043326 80.923569 -24.597179 80.665417 -24.906961 80.482364 -24.709827 80.482364 -24.268622 80.590318 -23.921290 80.726435 -23.827417 80.829696 -23.442536 80.911835 -22.879296 81.047951 -22.071984 81.245085 -21.715265 81.402323 -20.954891 81.573642 -20.325939 81.648741 -20.466749 81.507931 -20.156967 81.453954 -20.025544 81.463341 # -b -19.741577 80.665417 -20.717861 80.576237 -20.990093 80.533994 -20.426853 80.555116 -20.023197 80.627868 # -b -19.896468 80.271149 -20.553582 80.088096 -20.525420 80.012997 # -b -30.175606 83.500394 -29.987859 83.502741 -29.893986 83.483966 # -b -30.053571 83.406520 -29.302583 83.420601 -29.584204 83.451110 -28.420173 83.451110 -26.936974 83.343156 -27.181044 83.195305 -28.345075 83.129594 -29.678077 83.146022 -29.678077 83.146022 # -b -30.318763 83.089698 -29.586550 83.028680 -29.267381 83.052148 -27.971928 83.035721 -26.995644 83.108472 -25.925488 83.103779 -25.887938 83.014599 -25.756516 82.937153 -26.188333 82.864402 -26.310369 82.808078 -27.220941 82.732979 -26.282207 82.758794 -25.005528 82.862055 -24.423513 82.847974 -24.385964 82.768181 -23.907209 82.810424 -23.419068 82.768181 -22.930926 82.772875 -22.508496 82.737672 -21.719959 82.636759 -21.644860 82.535845 -22.039129 82.484214 -22.536658 82.380954 -23.353356 82.270652 -24.282703 82.256571 -25.521832 82.136883 -25.925488 82.125148 -26.685862 82.122802 -27.624596 82.155657 -28.788627 82.162698 -29.248606 82.150964 # -b -30.163872 81.946789 -29.178201 81.979645 -27.629290 81.979645 -26.596683 81.949136 -26.343224 81.716799 -27.685614 81.554868 -28.145594 81.430485 -27.169310 81.491503 -25.723660 81.665169 -24.615954 81.733227 -24.803700 81.850569 -24.550242 81.986685 -23.395599 82.035969 -22.851134 82.033622 # -b -40.055782 83.155409 -39.886810 83.108472 # -b -40.079250 82.836240 -39.647433 82.808078 -39.975990 82.850321 # -b -40.067516 82.991131 -38.959810 83.009905 -38.828387 83.019293 -39.842220 83.021640 -39.185106 83.096738 -38.302696 83.134288 -38.903486 83.153062 -39.335304 83.190612 -39.954868 83.216427 -39.954868 83.216427 # -b -40.022926 83.251629 -39.947828 83.277445 -39.947828 83.298566 # -b -40.067516 83.359584 -39.879769 83.378358 # -b -40.001805 83.404174 -39.494888 83.406520 -39.006747 83.373665 -39.138169 83.479272 -38.687577 83.469885 -38.086787 83.411214 -37.561096 83.354890 -37.842716 83.422948 -38.049238 83.486313 -37.542322 83.554371 -36.866433 83.552024 -36.321967 83.563758 -35.758727 83.542637 -35.420783 83.507434 -35.270585 83.530903 -34.838767 83.603655 -34.050231 83.608348 -33.618413 83.568452 -32.923750 83.570799 -32.266636 83.570799 -31.158930 83.549677 -30.633239 83.481619 -30.163872 83.500394 -30.163872 83.500394 # -b -29.886945 83.483966 -30.187340 83.444070 -30.055917 83.406520 # -b -29.678077 83.146022 -31.198826 83.162450 -32.250208 83.117860 -33.264041 83.042761 -34.071352 83.099085 -34.709692 83.148369 -34.221550 83.087351 -34.184000 82.993477 -35.066410 82.960622 -36.211666 82.913685 -36.493286 82.880829 -36.436962 82.803384 -35.742299 82.894910 -35.197833 82.880829 -34.981924 82.803384 -34.906826 82.911338 -34.061965 82.930113 -33.160780 82.953581 -32.860385 82.948888 -32.128173 83.049802 -31.114340 83.103779 -30.250705 83.089698 # -b -29.666343 82.150964 -31.177705 82.104027 -31.769107 82.155657 -32.904975 82.158004 -31.853593 82.136883 -31.384226 82.045356 -32.557644 81.958523 -33.374342 81.899852 -34.134717 81.756695 -33.731061 81.655781 -32.736003 81.801285 -31.449938 81.876384 -30.961796 81.848222 -30.163872 81.946789 -30.163872 81.946789 # -b -48.415209 82.622678 -47.851968 82.650840 -47.560961 82.648493 -47.147918 82.669614 -46.575290 82.599209 -46.012050 82.535845 -45.655331 82.430237 -45.298612 82.324629 -45.786753 82.254224 -45.871239 82.160351 -45.664718 82.047703 -46.096536 82.122802 -46.669163 82.226062 -47.307503 82.317589 -47.814419 82.413809 -48.218075 82.578088 -48.415209 82.622678 # -b -47.699424 82.944194 -47.305156 82.941847 -47.136184 82.965315 -47.530452 82.995824 -47.004761 83.073270 -46.629267 83.012252 -46.047252 82.937153 -46.103576 82.843280 -46.704366 82.840933 -47.436578 82.897257 -47.699424 82.944194 # -b -42.538734 83.164796 -42.013042 83.155409 -41.487351 83.047455 -40.942886 82.960622 -41.731422 83.009905 -42.388536 83.124900 -42.538734 83.164796 # -b -41.632855 83.134288 -41.201038 83.148369 -40.581473 83.082657 -40.525149 82.986437 -41.144713 83.054495 -41.632855 83.134288 # -b -41.611734 83.361931 -41.104817 83.293872 -40.485253 83.185918 -40.072210 83.155409 # -b -39.900891 83.108472 -40.651878 83.143675 -41.233893 83.244589 -41.740810 83.314994 -41.609387 83.361931 # -b -50.135439 82.491255 -49.609748 82.364526 -48.483267 82.223716 -47.722892 82.118108 -46.802933 81.986685 -46.342953 81.866997 -45.441769 81.744961 -45.075662 81.796592 -45.329121 81.874037 -45.676452 81.960870 -45.516867 82.040662 -44.794042 82.057090 -44.925465 82.082905 -45.451156 82.104027 -45.601353 82.197900 -45.197698 82.301161 -43.902245 82.230756 -43.395328 82.207288 -43.911632 82.265959 -44.737718 82.329323 -44.784655 82.404422 -45.413607 82.507683 -45.826650 82.594516 -46.427439 82.714204 -46.202143 82.770528 -45.225860 82.758794 -43.883470 82.770528 -42.935349 82.669614 -42.841475 82.458399 -42.700665 82.545232 -42.775764 82.683695 -42.447207 82.718898 -41.799480 82.594516 -41.161141 82.484214 -40.917070 82.432584 -41.057881 82.547579 -40.964007 82.648493 -41.245627 82.683695 -41.893354 82.732979 -42.315784 82.775222 -43.019835 82.826852 -43.761435 82.843280 -44.559359 82.831546 -45.244634 82.901951 -44.831591 82.897257 -44.540584 82.918379 -44.869141 82.911338 -45.197698 82.981743 -45.376057 83.038067 -45.563804 83.094391 -45.376057 83.120207 -45.216472 83.094391 -45.188310 83.131941 -44.718943 83.108472 -44.615683 83.117860 -44.371612 83.110819 -44.794042 83.185918 -44.371612 83.211733 -44.409161 83.270404 -43.986731 83.228161 -43.752047 83.155409 -43.742660 83.087351 -43.339004 83.028680 -42.963511 82.937153 -42.559855 82.927766 -42.259460 82.836240 # -b -39.978336 82.850321 -40.203633 82.970009 -40.072210 82.991131 # -b -39.957215 83.216427 -40.032314 83.228161 -40.032314 83.251629 # -b -39.957215 83.298566 -40.032314 83.329075 -40.069863 83.359584 # -b -39.879769 83.378358 -40.011192 83.404174 # -b -53.721403 82.317589 -53.355297 82.280040 -53.120613 82.179126 -52.397788 82.080559 -51.815773 81.972604 -52.238203 81.949136 -52.829606 81.981992 -53.392846 82.054743 -53.815276 82.165045 -53.899762 82.268305 -53.721403 82.317589 # -b -60.193974 81.869343 -59.414825 81.789551 -59.311564 81.667516 -58.701387 81.571295 -58.053661 81.496197 -57.790815 81.416404 -57.659392 81.470381 -58.203858 81.601804 -58.485478 81.660475 -58.907909 81.768430 -59.414825 81.911587 -59.799706 81.939749 # -b -60.029696 81.967911 -59.428906 82.059437 -58.649757 82.113414 -57.748572 82.150964 -57.025747 82.197900 -56.819225 82.233103 -56.171499 82.226062 -56.180886 82.244837 -55.739681 82.317589 -54.988694 82.329323 -54.594426 82.204941 -54.256481 82.045356 -54.040573 81.878731 -54.200157 81.705065 -54.200157 81.533746 -53.909150 81.627619 -53.496107 81.822407 -53.524269 82.000766 -52.792056 81.932708 -52.444725 81.906893 -51.571702 81.805979 -50.886426 81.702718 -50.933363 81.770776 -51.487216 81.883424 -50.877039 81.892812 -50.210538 81.895159 -50.886426 82.035969 -51.355793 82.167392 -51.524765 82.294121 -51.646801 82.397381 -51.834547 82.498295 -51.787611 82.507683 # -b -51.789958 82.507683 -51.104682 82.514723 -50.287983 82.491255 -50.137786 82.491255 # -b -70.196186 80.280536 -69.510910 80.451855 -69.201127 80.576237 -68.684824 80.700620 -68.121583 80.773371 -67.736702 80.850817 -67.558343 80.893060 -66.920004 80.996321 -66.525735 81.094888 -66.009432 81.202842 -65.108247 81.320184 -64.620105 81.418751 -64.591943 81.531399 -65.023761 81.524359 -66.018819 81.458647 -66.863680 81.355387 -67.689766 81.320184 -68.553401 81.231004 -69.276226 81.162946 -69.989664 81.090194 -69.989664 81.090194 # -b -70.031907 81.172333 -69.900484 81.242738 -69.337244 81.221617 -68.605031 81.310797 -67.919755 81.404670 -67.121832 81.482116 -67.168768 81.519665 -67.891593 81.510278 -68.558095 81.500890 -69.149497 81.477422 -69.046236 81.533746 -68.914814 81.583030 -69.365406 81.676903 -69.046236 81.641700 -68.539320 81.561908 -68.304636 81.615885 -67.947917 81.594764 -67.168768 81.594764 -66.492880 81.604151 -65.910865 81.615885 -65.497822 81.665169 -65.863928 81.688637 -65.300687 81.721493 -64.850095 81.698025 -64.352566 81.719146 -64.324404 81.761389 -63.939523 81.770776 -63.629741 81.838835 -62.766106 81.916280 -62.146541 82.017194 -61.742885 82.122802 -61.282906 82.204941 -61.160870 82.291774 -61.395554 82.427890 -62.249802 82.470133 -62.371837 82.500642 # -b -62.367144 82.500642 -62.817736 82.465440 -63.390364 82.416156 -63.174455 82.526457 -63.521786 82.603903 -63.822181 82.709510 -63.700146 82.801037 -64.019315 82.852667 -64.404196 82.782262 -64.732753 82.847974 -64.770303 82.894910 -64.976824 82.885523 -65.239670 82.808078 -65.117634 82.732979 -65.399255 82.847974 -66.450637 82.754100 -66.882454 82.711857 -67.135913 82.695429 -67.858738 82.646146 -68.337492 82.669614 -67.051426 82.789303 -66.366151 82.918379 -66.572672 82.958275 -66.854292 82.953581 -67.032652 82.991131 -67.295497 82.995824 -67.670991 82.993477 -67.811801 83.019293 -67.811801 83.019293 # -b -64.880604 79.982488 -64.307976 80.081055 -63.744736 80.120951 -64.185941 80.226559 -64.279814 80.219518 -64.617758 80.071668 -65.284260 80.055240 -65.490781 80.022384 # -b -66.159629 79.989529 -66.600834 80.055240 -67.192237 80.050546 -67.351821 80.106870 -67.661604 80.205437 -67.699153 80.308698 -67.304885 80.376756 -66.957553 80.414306 -66.732257 80.503485 -66.516348 80.562156 -66.037594 80.637255 -65.493128 80.592665 -65.727811 80.679498 -65.342930 80.768678 -64.986212 80.871939 -64.779690 80.991627 -64.338485 81.066726 -64.160126 81.134784 -63.822181 81.158252 -63.155680 81.188761 -62.498566 81.116009 -61.944713 81.097235 -61.559832 81.195802 -61.728804 81.306103 -61.390860 81.456300 -61.625544 81.554868 -61.756966 81.629966 -61.879002 81.646394 -61.869615 81.768430 -61.240663 81.876384 -60.771296 81.916280 -60.771296 81.916280 # -b -60.768949 81.916280 -60.440392 81.885771 -60.186934 81.869343 # -b -59.797359 81.939749 -60.032043 81.967911 # -b -80.177275 80.498792 -79.548324 80.536341 -78.834886 80.559809 -78.403068 80.576237 -78.863048 80.595012 -79.548324 80.597359 -79.895655 80.583278 # -b -80.210131 80.623174 -79.637503 80.688885 -79.158749 80.738169 -78.820805 80.759290 -78.013493 80.810921 -77.760035 80.782759 -77.656774 80.827349 -77.159245 80.815614 -76.821301 80.803880 -76.558456 80.817961 -76.624167 80.867245 -76.229899 80.860204 -76.164187 80.897754 -75.704208 80.918875 -75.497686 80.951731 -75.873180 80.932956 -76.483357 80.904794 -76.896400 80.886020 -77.224957 80.883673 -77.572288 80.900101 -77.835134 80.897754 -78.088592 80.897754 -78.454698 80.890713 -78.783255 80.874285 -79.093038 80.860204 -79.421594 80.848470 -79.515468 80.911835 -79.233848 81.026830 -79.130587 81.127744 -78.811417 81.221617 -78.755093 81.254473 -78.464086 81.299063 -78.135529 81.350693 -77.929007 81.383549 -77.694324 81.444566 -77.844521 81.449260 -78.285726 81.376508 -78.764481 81.317837 -79.177524 81.216923 -79.412207 81.116009 -79.393432 81.092541 -79.599954 81.083154 -79.731377 81.104275 -79.890961 81.130090 # -b -80.066974 81.125397 -79.766579 81.052645 -79.869840 80.921222 -79.738417 80.911835 -79.935551 80.817961 -79.935551 80.817961 # -b -71.167775 79.959020 -71.252261 80.062280 -72.247319 80.005956 # -b -72.700259 79.998916 -72.240279 80.059934 -71.095023 80.149113 -70.334649 80.174929 -70.869727 80.313392 -70.681980 80.374409 -70.193839 80.280536 -70.193839 80.280536 # -b -69.987317 81.090194 -70.325261 81.066726 -70.456684 81.097235 -71.057474 81.141825 -70.513008 81.132437 -70.024867 81.172333 # -b -69.766715 83.019293 -70.517702 83.052148 -70.930745 83.106126 -72.132325 83.031027 -72.489043 83.019293 -72.920861 83.106126 -73.728172 83.087351 -73.972243 83.031027 -74.272638 82.892564 -73.803271 82.744713 -74.742005 82.864402 -75.136273 82.965315 -76.206430 83.038067 -77.032516 83.047455 -77.276587 83.040414 -77.971250 83.007559 -78.459392 82.958275 -77.821053 82.857361 -77.163939 82.770528 -76.760283 82.636759 -76.384790 82.507683 -77.004354 82.470133 -77.248425 82.639105 -77.980638 82.805731 -79.107119 82.932460 -79.445063 82.864402 -79.764232 82.876136 -80.214825 82.883176 -80.308698 82.876136 # -b -90.036330 80.526954 -89.670223 80.517566 -89.304117 80.519913 -89.060046 80.482364 -88.938011 80.402572 -89.088208 80.369716 -88.947398 80.308698 -88.994335 80.193703 -88.891074 80.160847 -88.571905 80.071668 -88.252735 80.088096 -88.130700 80.120951 -88.290284 80.181969 -88.571905 80.268802 -88.421707 80.402572 -87.858467 80.390837 -87.605009 80.294617 -87.529910 80.167888 -87.811530 80.120951 -87.989889 80.076361 -87.614396 80.081055 -87.248290 80.050546 -87.248290 80.050546 # -b -86.354145 79.998916 -86.739026 80.071668 -86.729639 80.186663 -86.616991 80.266455 -86.185173 80.313392 -85.528059 80.280536 -85.068080 80.247680 -84.204444 80.235946 -83.631817 80.106870 -83.209386 80.005956 # -b -82.493602 79.996569 -82.700123 80.104523 -83.131941 80.210131 -83.432336 80.280536 -83.056842 80.327473 -82.625024 80.350941 -82.061784 80.362675 -81.798938 80.365022 -81.169987 80.414306 -80.738169 80.430734 -80.437774 80.426040 -80.747556 80.465936 -80.503485 80.508179 -80.174929 80.498792 # -b -79.890961 80.583278 -80.285230 80.569197 -80.332166 80.606746 -80.210131 80.623174 # -b -79.890961 81.130090 -80.163194 81.167640 -80.059934 81.125397 # -b -79.935551 80.817961 -80.311045 80.759290 -80.555116 80.724088 -81.043258 80.646642 -81.662822 80.590318 -82.019541 80.541035 -82.329323 80.517566 -82.751753 80.491751 -83.136634 80.465936 -83.587227 80.508179 -83.493353 80.569197 -83.117860 80.625521 -82.676655 80.641949 -82.507683 80.710007 -82.085252 80.766331 -82.132189 80.775718 -82.310548 80.787452 -82.254224 80.822655 -82.235450 80.886020 -82.517070 80.843777 -82.479521 80.810921 -82.667267 80.726435 -83.061536 80.665417 -83.474579 80.618480 -83.615389 80.597359 -83.821910 80.587971 -83.943946 80.630215 -83.765586 80.693579 -83.662326 80.752250 -83.897009 80.686539 -84.216179 80.618480 -84.122305 80.552769 -84.253728 80.489404 -84.479024 80.456549 -84.920229 80.454202 -85.258173 80.480017 -85.380209 80.515220 -85.201849 80.576237 -85.492857 80.522260 -85.633667 80.489404 -85.952837 80.501139 -86.394042 80.543382 -86.365880 80.597359 -86.272006 80.665417 -86.187520 80.726435 -86.046710 80.773371 -85.821414 80.825002 -85.708766 80.871939 -85.530406 80.911835 -85.286335 80.937650 -84.920229 80.970506 -84.572898 80.982240 -84.028432 80.998668 -83.709262 81.015095 -83.408867 81.029176 -82.864402 81.054992 -82.244837 81.087847 -82.301161 81.097235 -82.808078 81.080807 -83.277445 81.073766 -83.765586 81.054992 -84.056594 81.054992 -84.450862 81.038564 -84.826356 81.022136 -85.230011 81.015095 -85.586730 80.991627 -85.896513 80.923569 -86.469140 80.789799 -86.741373 80.677151 -86.844634 80.583278 -87.135641 80.559809 -87.417262 80.569197 -87.661333 80.623174 -88.074376 80.651336 -88.280897 80.695926 -88.759651 80.785106 -89.116370 80.829696 -89.341667 80.864898 -89.341667 80.864898 # -b -79.968407 82.876136 -80.531647 82.953581 -81.226311 82.876136 -80.794493 82.826852 -80.409612 82.709510 -80.860204 82.700123 -81.057339 82.695429 -82.005460 82.793997 -82.118108 82.723591 -81.676903 82.599209 -81.395283 82.524110 -81.789551 82.498295 -82.681348 82.617984 -83.338462 82.571047 -82.625024 82.491255 -82.962969 82.477174 -83.432336 82.444318 -83.404174 82.296467 -82.502989 82.188513 -81.705065 82.108721 -81.601804 82.045356 -81.714452 82.003113 -82.653186 82.118108 -83.413561 82.254224 -83.854766 82.216675 -83.563758 82.092293 -83.469885 82.075865 -83.845379 82.141576 -84.211485 82.291774 -84.408619 82.322283 -85.037571 82.315242 -85.422452 82.402075 -85.713459 82.437278 -86.417510 82.423197 -86.304862 82.348098 -86.210988 82.272999 -86.783616 82.216675 -87.365631 82.195554 -86.755454 82.113414 -85.863657 82.031275 -85.450614 81.996073 -86.042016 81.998419 -86.126502 81.932708 -87.065236 82.045356 -87.431343 81.977298 -87.543991 81.979645 -87.666026 82.050050 -88.013358 82.080559 -88.614148 82.094640 -89.243099 82.003113 -89.383910 81.899852 -89.674917 81.913933 -89.806340 81.827100 -89.956537 81.852916 # -b -90.036330 81.629966 -89.482477 81.601804 -89.970618 81.529052 -89.970618 81.529052 # -b -90.059798 81.357733 -89.383910 81.428138 -88.632922 81.514971 -88.003970 81.538440 -87.337469 81.503237 -86.483221 81.505584 -86.980750 81.470381 -87.938259 81.505584 -88.632922 81.446913 -89.750016 81.310797 -89.261874 81.242738 -88.999029 81.200495 -89.890826 81.181721 -89.928375 81.057339 -89.205550 80.982240 -88.501500 81.017442 -87.750512 81.029176 -87.112173 81.033870 -86.426897 81.080807 -85.891819 81.186414 -85.000022 81.242738 -84.558817 81.235698 -85.506938 81.116009 -86.182826 81.012749 -87.121560 80.944690 -87.844386 80.963465 -88.576598 80.932956 -89.205550 80.881326 -89.336973 80.864898 # -b -99.123275 80.076361 -99.010627 80.055240 -98.832268 80.045853 -98.475549 80.057587 -98.344126 80.027078 # -b -99.531625 79.959020 -99.343878 80.052893 -99.118582 80.076361 # -b -95.187633 80.578584 -94.924787 80.559809 -94.511744 80.543382 -93.986053 80.543382 -93.601172 80.515220 -93.807694 80.576237 -94.136251 80.585625 -94.220737 80.616134 -93.976666 80.651336 -93.497912 80.674804 -93.817081 80.688885 -94.061152 80.712354 -94.474195 80.717047 -94.652554 80.742863 -94.446033 80.787452 -94.915400 80.766331 -94.887238 80.822655 -94.906013 80.853164 -94.943562 80.909488 -94.840301 80.977546 -94.596230 81.012749 -94.173800 80.984587 -94.155025 80.937650 -93.995441 80.958771 -93.807694 80.970506 -93.601172 80.982240 -93.788919 81.010402 -93.995441 81.064379 -93.591785 81.050298 -93.338327 81.045604 -93.028545 81.043258 -92.803248 81.069073 -92.699988 81.106622 -92.643664 81.155906 -92.850185 81.146518 -92.962833 81.181721 -93.300777 81.167640 -93.713820 81.144171 -93.939117 81.146518 -94.342772 81.174680 -94.436646 81.235698 -94.408484 81.270901 -94.605618 81.277941 -94.370934 81.327225 -93.939117 81.301409 -93.488524 81.322531 -93.235066 81.345999 -92.897122 81.313144 -92.427755 81.270901 -92.014712 81.195802 -91.545345 81.104275 -91.601669 81.029176 -91.404535 80.965812 -91.244950 80.867245 -91.066590 80.810921 -90.963330 80.761637 -90.935168 80.693579 -90.634773 80.616134 -90.691097 80.529301 -90.691097 80.496445 -90.512737 80.555116 -90.240504 80.526954 -90.033983 80.526954 # -b -96.079430 79.973101 -95.703937 80.038812 -96.192078 80.078708 -96.201466 80.142073 -95.797810 80.132685 -95.450478 80.090442 -95.112534 80.027078 -94.924787 80.005956 -94.821527 80.003610 # -b -94.725306 79.989529 -94.349813 80.003610 -94.349813 80.003610 # -b -94.072886 79.970754 -94.298182 80.066974 -93.885139 80.118604 -93.594132 80.130339 -93.969625 80.139726 -94.176147 80.189010 -94.551641 80.111564 -94.955296 80.090442 -95.067944 80.106870 -95.246304 80.132685 -95.199367 80.179622 -95.199367 80.179622 -95.002233 80.167888 -94.748775 80.167888 -94.720613 80.217172 -94.974071 80.200744 -95.002233 80.207784 -95.236916 80.235946 -95.603023 80.179622 -95.875256 80.240640 -96.063002 80.296964 -96.297686 80.339207 -95.940967 80.348594 -95.443438 80.367369 -94.927134 80.336860 -94.927134 80.365022 -94.992846 80.365022 -95.077332 80.383797 -95.424663 80.411959 -95.800157 80.451855 -95.687509 80.501139 -95.743833 80.569197 -95.434051 80.573890 -95.293240 80.576237 -95.189980 80.578584 # -b -89.949497 81.852916 -90.428251 81.897505 -91.104140 81.838835 -91.451471 81.782511 -91.826965 81.686290 -92.024099 81.615885 -91.507795 81.585376 -91.338823 81.517318 -90.878844 81.540787 -90.615998 81.629966 -90.156018 81.655781 -90.033983 81.629966 # -b -89.970618 81.529052 -90.449373 81.383549 -90.064492 81.357733 -90.064492 81.357733 # -b 91.296580 80.001263 91.090059 80.045853 91.230869 80.045853 91.456165 80.052893 91.765947 80.071668 92.141441 80.017691 92.366737 80.010650 # -b 91.275459 79.998916 91.303621 80.001263 # -b 90.911699 81.223964 91.202707 81.207536 91.653299 81.158252 91.334130 81.071420 90.770889 81.047951 90.207649 81.073766 90.048064 81.097235 # -b 89.972965 81.167640 90.545593 81.198149 90.911699 81.223964 90.911699 81.223964 # -b 94.870810 81.101928 95.105494 81.153559 95.227529 81.223964 95.668734 81.223964 96.044228 81.134784 96.307073 81.047951 96.504207 80.935303 96.860926 80.855511 97.189483 80.801533 97.461716 80.735822 97.593139 80.688885 97.649463 80.658377 97.123772 80.611440 97.039286 80.491751 97.048673 80.397878 97.217645 80.346247 97.330293 80.304004 96.926638 80.250027 96.297686 80.245334 95.574861 80.205437 94.880197 80.120951 94.241858 80.043506 94.035337 80.003610 # -b 93.833509 79.996569 93.354755 80.045853 92.969874 80.130339 92.284598 80.160847 92.275210 80.259415 91.646259 80.299311 91.383413 80.294617 91.702583 80.357982 91.824618 80.393184 92.125013 80.444815 92.641317 80.503485 92.810289 80.602053 92.519281 80.637255 92.566218 80.759290 93.016810 80.836736 93.223332 80.909488 93.720861 80.937650 94.209003 80.991627 94.706532 80.984587 94.828567 81.069073 94.866116 81.101928 # -b 94.880197 80.015344 94.927134 80.062280 95.246304 80.029425 95.499762 80.085749 95.940967 80.118604 96.438496 80.130339 97.170709 80.139726 97.471103 80.139726 97.658850 80.092789 98.062506 80.020037 98.062506 80.020037 # -b 98.454427 79.989529 98.379329 80.041159 98.651561 80.031772 98.867470 80.001263 98.867470 80.001263 # -b 99.104501 79.991875 99.282860 80.010650 # -b 94.572762 79.984835 94.854382 80.015344 94.873157 80.015344 # -b 79.982488 80.862551 80.292270 80.881326 80.705313 80.829696 80.921222 80.810921 80.968159 80.808574 80.846123 80.752250 80.273496 80.724088 80.076361 80.719394 # -b 90.050411 81.097235 89.947150 81.127744 89.975312 81.167640 # -b 79.926164 80.848470 79.944939 80.850817 79.982488 80.862551 # -b 80.069321 80.719394 79.628116 80.771025 79.834637 80.843777 79.919123 80.848470 # -b 60.506103 80.789799 60.355906 80.789799 60.158772 80.810921 60.093060 80.806227 # -b 59.933476 80.376756 60.149384 80.365022 60.262032 80.379103 60.487329 80.374409 60.590589 80.369716 60.815886 80.350941 61.069344 80.339207 61.285253 80.367369 61.538711 80.376756 61.482387 80.461242 61.472999 80.512873 61.360351 80.562156 61.163217 80.599706 61.210154 80.641949 61.407288 80.670111 61.810944 80.674804 62.214599 80.679498 62.280311 80.717047 62.205212 80.756944 62.167663 80.794493 62.148888 80.810921 62.083176 80.841430 61.932979 80.878979 61.698296 80.853164 61.472999 80.808574 61.257091 80.796840 61.022407 80.803880 60.844048 80.801533 60.637526 80.778065 60.506103 80.789799 60.506103 80.789799 # -b 60.980164 81.071420 60.961389 81.054992 60.783030 81.033870 60.492022 81.026830 60.219789 80.991627 60.191627 80.928263 60.398149 80.895407 60.792417 80.876632 61.120974 80.869592 61.487080 80.925916 61.468306 80.972852 61.299334 81.003361 61.440144 81.012749 61.149136 81.043258 60.980164 81.071420 60.980164 81.071420 # -b 63.528827 81.287328 63.434954 81.275594 63.115784 81.223964 62.843551 81.153559 62.646417 81.106622 62.721516 81.101928 62.749678 81.069073 62.796614 81.024483 62.561931 80.958771 62.496219 80.904794 62.843551 80.853164 63.068847 80.799187 63.341080 80.752250 63.556989 80.775718 63.707186 80.822655 63.866771 80.871939 64.016969 80.911835 64.204715 80.954078 64.552047 80.961118 64.852442 80.975199 65.030801 80.961118 65.199774 80.963465 65.378133 80.958771 65.509556 80.965812 65.312422 81.015095 65.143450 81.062032 65.049576 81.099582 64.871217 81.130090 64.814893 81.158252 64.814893 81.209883 64.918153 81.256820 64.899379 81.303756 64.918153 81.348346 64.702245 81.362427 64.505110 81.385895 64.232877 81.385895 63.913708 81.334265 63.622700 81.289675 63.528827 81.287328 # -b 63.538214 81.693331 63.669637 81.665169 63.556989 81.615885 63.162721 81.615885 62.852938 81.658128 62.599480 81.665169 62.411733 81.672209 62.392959 81.700371 62.468057 81.721493 62.627642 81.700371 62.777840 81.726187 62.937424 81.730880 63.162721 81.749655 63.359855 81.744961 63.500665 81.709759 63.538214 81.693331 # -b 50.844183 80.871939 50.693986 80.839083 50.299717 80.843777 50.374816 80.890713 50.243393 80.860204 50.065034 80.853164 50.065034 80.853164 # -b 49.996976 80.853164 50.006363 80.864898 # -b 49.928917 80.806227 50.097889 80.759290 50.032178 80.731128 # -b 49.964120 80.318085 50.057993 80.339207 50.217578 80.346247 50.255127 80.379103 50.283289 80.426040 50.076768 80.437774 # -b 49.964120 80.484711 50.142479 80.508179 50.292677 80.529301 50.583684 80.512873 50.818368 80.512873 51.043664 80.496445 51.231411 80.545728 51.372221 80.548075 51.513031 80.599706 51.578742 80.648989 51.531806 80.691232 51.390996 80.714701 51.231411 80.733475 50.959178 80.726435 50.790206 80.698273 50.452262 80.674804 50.283289 80.702966 50.349001 80.759290 50.640008 80.787452 50.893467 80.803880 50.931016 80.853164 50.959178 80.883673 50.865305 80.876632 50.837143 80.871939 # -b 53.029087 80.353288 53.104185 80.348594 53.357643 80.332166 53.573552 80.264108 53.714362 80.224212 53.611102 80.165541 53.385806 80.160847 53.413968 80.116258 53.169897 80.113911 53.038474 80.132685 52.953988 80.104523 52.775628 80.120951 52.672368 80.146766 52.503396 80.163194 52.371973 80.198397 52.465846 80.207784 52.794403 80.245334 52.850727 80.296964 52.831952 80.318085 52.878889 80.341554 52.982150 80.350941 53.029087 80.353288 # -b 56.767595 80.327473 56.579848 80.329820 56.626785 80.289923 56.410876 80.294617 56.157418 80.289923 55.922734 80.282883 55.913347 80.235946 55.922734 80.181969 55.866410 80.123298 55.781924 80.074015 55.941509 80.066974 56.138643 80.052893 56.298228 80.064627 56.495362 80.038812 56.598623 80.055240 56.786370 80.041159 56.955342 80.055240 56.861468 80.116258 56.917792 80.146766 57.002278 80.205437 57.067990 80.219518 57.105539 80.278189 56.936567 80.311045 56.805144 80.332166 56.767595 80.327473 # -b 58.102944 80.456549 57.962134 80.437774 57.811937 80.433080 57.558478 80.430734 57.351957 80.433080 57.220534 80.449508 57.098499 80.435427 57.201759 80.390837 57.201759 80.357982 57.314408 80.325126 57.258083 80.261761 57.220534 80.221865 57.220534 80.170235 57.107886 80.137379 57.267471 80.102177 57.408281 80.057587 57.671126 80.050546 57.765000 80.074015 57.671126 80.135032 57.689901 80.186663 58.027845 80.224212 58.271916 80.273496 58.553536 80.287577 58.778833 80.285230 58.947805 80.266455 59.116777 80.296964 58.975967 80.334513 58.675572 80.353288 58.337628 80.395531 58.149881 80.447161 58.102944 80.456549 # -b 59.227078 80.045853 59.142592 80.024731 58.804648 80.001263 58.804648 80.001263 # -b 59.656549 79.996569 59.412478 80.031772 59.224731 80.045853 59.224731 80.045853 # -b 60.097754 80.806227 59.816134 80.803880 59.684711 80.761637 59.590838 80.728782 59.543901 80.660723 59.356154 80.599706 59.252893 80.522260 59.346767 80.458896 59.496964 80.414306 59.534514 80.381450 59.759810 80.362675 59.938169 80.376756 59.938169 80.376756 # -b 58.422114 81.787204 58.365790 81.782511 58.168656 81.803632 57.924585 81.770776 57.887035 81.723840 57.877648 81.681597 58.149881 81.632313 58.469050 81.651088 58.656797 81.655781 58.891481 81.683943 58.966579 81.735574 58.872706 81.798938 58.628635 81.782511 58.422114 81.787204 # -b 57.671126 81.531399 57.455218 81.536093 57.239309 81.524359 56.985851 81.498544 56.798104 81.463341 56.704230 81.425792 56.910752 81.416404 57.117273 81.385895 57.248696 81.395283 57.473992 81.376508 57.539704 81.360080 57.755613 81.348346 57.980909 81.360080 58.187430 81.385895 58.318853 81.397630 58.337628 81.437526 58.112331 81.463341 57.877648 81.514971 57.671126 81.531399 57.671126 81.531399 # -b 56.535258 81.369468 56.366286 81.367121 56.356899 81.331918 56.413223 81.303756 56.507096 81.273247 56.403835 81.247432 56.356899 81.216923 56.225476 81.242738 56.065891 81.235698 55.896919 81.231004 55.849982 81.249779 55.671623 81.270901 55.427552 81.259166 55.436939 81.207536 55.681010 81.179374 55.925081 81.160599 56.169152 81.177027 56.234863 81.148865 56.535258 81.160599 56.525871 81.191108 56.873203 81.209883 57.060949 81.209883 57.380119 81.233351 57.567866 81.259166 57.680514 81.259166 57.793162 81.275594 57.624190 81.310797 57.502154 81.294369 57.229921 81.310797 56.948301 81.336612 56.685456 81.374161 56.535258 81.369468 # -b 58.708428 80.853164 58.745977 80.841430 58.774139 80.782759 58.558230 80.728782 58.342321 80.726435 58.117025 80.726435 57.863567 80.754597 57.854180 80.782759 58.088863 80.822655 58.285997 80.841430 58.492519 80.853164 58.680266 80.855511 58.708428 80.853164 # -b 56.105787 80.719394 55.983752 80.702966 55.730294 80.705313 55.476836 80.677151 55.533160 80.663070 55.495610 80.637255 55.551934 80.599706 55.796005 80.592665 56.162111 80.609093 56.312309 80.592665 56.603316 80.595012 56.706577 80.602053 56.922486 80.634908 56.847387 80.679498 56.762901 80.698273 56.537605 80.719394 56.302922 80.719394 56.105787 80.719394 # -b 54.606160 80.860204 54.512286 80.853164 54.108631 80.843777 54.071081 80.815614 54.052307 80.766331 54.324540 80.766331 54.559223 80.754597 54.577998 80.707660 54.784519 80.700620 55.037977 80.717047 55.282048 80.695926 55.554281 80.731128 55.798352 80.747556 55.648155 80.787452 55.432246 80.766331 55.282048 80.792146 55.300823 80.827349 54.981653 80.806227 55.000428 80.839083 54.859618 80.848470 54.606160 80.860204 54.606160 80.860204 # -b 55.864063 80.970506 55.751415 80.986933 55.469795 81.010402 55.216337 81.024483 54.934717 81.045604 54.653096 81.043258 54.531061 81.010402 54.371476 80.968159 54.531061 80.949384 54.793907 80.932956 55.000428 80.918875 55.319598 80.918875 55.394696 80.878979 55.657542 80.881326 55.788965 80.822655 56.070585 80.787452 56.417916 80.775718 56.661987 80.768678 56.708924 80.719394 56.877896 80.719394 56.887284 80.688885 56.999932 80.660723 57.131354 80.660723 57.525623 80.691232 57.619496 80.735822 57.459911 80.775718 57.178291 80.829696 56.915446 80.871939 56.690149 80.907141 56.549339 80.909488 56.286494 80.932956 56.248944 80.979893 55.929775 80.965812 55.864063 80.970506 # -b 56.821572 81.043258 56.558727 81.045604 56.370980 81.054992 56.183233 81.076113 56.202008 81.026830 56.549339 80.972852 56.821572 80.932956 56.971770 80.911835 57.337876 80.817961 57.553785 80.810921 57.769694 80.789799 57.872954 80.825002 57.966828 80.839083 58.023152 80.871939 57.816630 80.883673 57.572559 80.937650 57.253390 80.991627 56.990544 81.024483 56.821572 81.043258 # -b 46.511925 80.860204 46.098882 80.832042 45.826650 80.801533 45.667065 80.773371 45.413607 80.747556 45.272796 80.745209 45.085050 80.724088 44.859753 80.705313 44.690781 80.710007 44.465485 80.688885 44.324675 80.656030 44.334062 80.625521 44.249576 80.609093 44.212027 80.576237 44.230802 80.552769 44.268351 80.531647 44.296513 80.503485 44.521809 80.519913 44.887916 80.515220 45.122599 80.489404 45.141374 80.447161 45.300958 80.472977 45.413607 80.487058 45.554417 80.498792 45.779713 80.491751 45.948685 80.461242 46.080108 80.409612 46.145819 80.449508 46.192756 80.465936 46.089495 80.517566 46.098882 80.552769 45.911136 80.595012 45.967460 80.660723 46.155206 80.679498 46.286629 80.691232 46.333566 80.717047 46.474376 80.752250 46.690285 80.747556 47.103328 80.754597 47.591470 80.747556 47.779216 80.691232 47.948189 80.660723 48.145323 80.646642 48.370619 80.660723 48.586528 80.651336 48.896310 80.681845 48.708563 80.717047 48.464492 80.738169 48.107773 80.778065 47.835540 80.815614 47.619632 80.825002 47.384948 80.846123 47.169039 80.839083 46.990680 80.855511 46.896806 80.834389 46.577637 80.853164 46.511925 80.860204 # -b 50.062687 80.853164 49.996976 80.853164 # -b 50.006363 80.864898 49.884327 80.867245 49.630869 80.848470 49.677806 80.834389 49.687193 80.810921 49.931264 80.806227 49.931264 80.806227 # -b 50.029831 80.731128 49.795148 80.733475 49.569852 80.731128 49.466591 80.707660 49.466591 80.681845 49.335168 80.681845 49.297619 80.651336 49.231907 80.651336 49.166196 80.639602 49.278844 80.644296 49.147421 80.641949 48.912738 80.623174 48.781315 80.606746 48.593568 80.611440 48.311948 80.585625 48.152363 80.604399 47.945842 80.625521 47.851968 80.599706 47.701771 80.609093 47.382601 80.606746 47.176080 80.637255 46.950784 80.625521 46.781811 80.611440 46.669163 80.583278 46.537741 80.531647 46.622227 80.505832 46.903847 80.519913 46.978946 80.508179 47.363827 80.477670 47.316890 80.442468 47.448313 80.421346 47.579735 80.418999 47.654834 80.369716 47.457700 80.383797 47.269953 80.379103 47.063432 80.372063 46.988333 80.339207 46.875685 80.306351 46.734875 80.301658 46.697325 80.233599 46.650389 80.207784 46.809973 80.170235 46.969558 80.163194 46.960171 80.137379 47.044657 80.120951 47.288728 80.123298 47.420151 80.144420 47.682996 80.177275 47.711158 80.132685 47.805032 80.139726 47.889518 80.088096 47.701771 80.064627 47.617285 80.005956 47.617285 80.005956 # -b 47.910639 79.989529 47.995125 80.038812 48.145323 80.043506 48.304907 80.020037 48.351844 80.057587 48.304907 80.123298 48.436330 80.104523 48.652239 80.085749 48.661626 80.132685 48.821211 80.120951 48.962021 80.160847 48.896310 80.181969 48.915085 80.221865 48.924472 80.247680 48.821211 80.292270 48.624077 80.304004 48.680401 80.341554 48.943247 80.336860 49.159155 80.322779 49.346902 80.329820 49.468938 80.329820 49.562811 80.318085 49.731783 80.332166 49.910143 80.313392 49.966467 80.318085 # -b 50.083808 80.437774 49.886674 80.458896 49.971160 80.484711 49.971160 80.484711 # -b 33.463522 80.207784 33.491684 80.196050 33.416585 80.177275 33.200677 80.167888 32.947218 80.132685 32.703148 80.120951 32.430915 80.092789 32.280717 80.076361 32.092970 80.078708 32.064808 80.074015 32.008484 80.050546 31.952160 80.038812 31.698702 80.029425 31.557892 80.036465 31.435857 80.045853 31.370145 80.064627 31.445244 80.083402 31.661153 80.095136 31.933386 80.109217 32.177456 80.127992 32.374591 80.156154 32.534175 80.167888 32.759472 80.170235 32.881507 80.191356 32.975380 80.224212 33.172515 80.224212 33.416585 80.217172 33.463522 80.207784 # -b 22.778382 80.512873 22.806544 80.498792 23.031840 80.472977 23.219587 80.454202 23.200812 80.407265 23.069389 80.381450 23.163263 80.343901 23.200812 80.306351 23.163263 80.254721 23.031840 80.217172 22.966129 80.174929 22.919192 80.139726 23.013065 80.102177 23.069389 80.102177 23.153875 80.132685 23.238361 80.142073 23.285298 80.163194 23.313460 80.132685 23.379172 80.177275 23.473045 80.142073 23.473045 80.113911 23.604468 80.116258 23.642017 80.132685 23.707728 80.153807 23.698341 80.172582 23.810989 80.191356 23.726503 80.233599 23.857926 80.233599 23.735890 80.257068 23.820377 80.254721 24.017511 80.245334 23.989349 80.273496 24.064447 80.261761 24.205258 80.242987 24.120771 80.280536 24.214645 80.271149 24.421166 80.240640 24.571364 80.245334 24.693399 80.259415 24.806047 80.315739 24.834209 80.334513 24.890533 80.301658 24.862371 80.257068 24.777885 80.217172 24.618301 80.191356 24.590138 80.151460 24.486878 80.113911 24.608913 80.137379 24.759111 80.186663 24.899921 80.207784 25.012569 80.193703 25.115830 80.228906 25.350513 80.242987 25.303576 80.233599 25.256640 80.200744 25.350513 80.170235 25.444386 80.198397 25.528873 80.186663 25.613359 80.165541 25.726007 80.191356 25.791718 80.179622 25.810493 80.170235 25.782331 80.139726 25.932528 80.146766 26.026402 80.151460 26.354958 80.151460 26.599029 80.139726 26.730452 80.139726 26.824326 80.102177 26.908812 80.074015 26.955748 80.055240 27.105946 80.062280 27.134108 80.038812 27.105946 80.005956 # -b 19.955139 80.402572 20.217985 80.418999 20.321245 80.374409 20.452668 80.329820 20.462055 80.280536 20.734288 80.289923 20.734288 80.245334 20.781225 80.210131 20.846936 80.198397 21.109782 80.196050 21.288141 80.231253 21.457114 80.228906 21.644860 80.207784 21.757508 80.252374 21.907706 80.250027 21.917093 80.196050 21.710572 80.130339 21.682410 80.116258 21.907706 80.109217 22.123615 80.010650 22.123615 80.010650 # -b 22.435744 79.991875 22.323096 80.034118 22.379420 80.074015 22.360645 80.149113 22.426356 80.247680 22.445131 80.292270 22.323096 80.318085 22.379420 80.381450 22.435744 80.400225 22.548392 80.367369 22.717364 80.329820 22.801850 80.357982 22.820625 80.421346 22.792463 80.475323 22.754913 80.505832 22.783075 80.512873 # -b 15.996028 79.998916 16.305810 80.062280 16.559269 80.017691 16.559269 80.010650 # -b 18.730091 79.989529 18.880289 80.029425 18.645605 80.012997 18.495408 80.024731 18.392147 80.034118 18.317048 80.015344 18.157463 80.045853 18.082365 80.074015 18.063590 80.102177 17.950942 80.142073 17.810132 80.139726 17.650547 80.132685 17.622385 80.160847 17.913393 80.179622 18.101139 80.174929 18.317048 80.167888 18.561119 80.144420 18.720704 80.186663 18.908451 80.163194 18.983549 80.118604 19.161909 80.066974 19.359043 80.001263 19.405980 80.052893 19.387205 80.081055 19.462304 80.095136 19.387205 80.132685 19.565564 80.116258 19.565564 80.146766 19.330881 80.163194 19.133747 80.198397 19.039873 80.228906 19.096197 80.271149 19.086810 80.313392 19.124359 80.332166 19.340268 80.275842 19.481078 80.210131 19.659438 80.207784 19.828410 80.177275 19.856572 80.200744 19.828410 80.221865 19.734537 80.252374 19.828410 80.301658 19.828410 80.325126 19.790861 80.327473 19.762699 80.348594 19.865959 80.383797 19.715762 80.393184 19.640663 80.383797 19.574952 80.383797 19.490466 80.393184 19.490466 80.454202 19.603114 80.451855 19.668825 80.487058 19.743924 80.515220 19.959833 80.465936 19.959833 80.402572 19.959833 80.402572 dballe-5.18/provami/dballecsv0000755000175000017500000000314311501712012013144 00000000000000#!/usr/bin/python import sys import os from optparse import OptionParser VERSION="0.1" class Parser(OptionParser): def __init__(self, *args, **kwargs): OptionParser.__init__(self, *args, **kwargs) def error(self, msg): sys.stderr.write("%s: error: %s\n\n" % (self.get_prog_name(), msg)) self.print_help(sys.stderr) sys.exit(2) parser = Parser(usage="usage: %prog [options] key=val [key=val ...]", version="%prog "+ VERSION, description="perform common operations on a DB-ALLe database") parser.add_option("--dsn", default=os.environ.get("DBA_DB", "test"), help="DSN, or URL-like database definition, to use for connecting to the DB-All.e database (default: %default, can be set in the environment as DBA_DB)"), parser.add_option("--user", default=os.environ['USER'], help="User name to use to connect to the database (default: %default)") parser.add_option("--pass", default="", dest="password", help="Password to use to connect to the database (default: none)") parser.add_option("--all", default=False, action="store_true", help="Export all the contents of the database") (opts, args) = parser.parse_args() if not opts.all and len(args) == 0: parser.print_help() sys.exit(0) import dballe, dballe.dbacsv # Parse the query query = dballe.Record() for q in args: query.set_from_string(q) print >>sys.stderr, query db = dballe.DB() if dballe.DB.is_url(opts.dsn): db.connect_from_url(opts.dsn) else: db.connect(opts.dsn, opts.user, opts.password) exporter = dballe.dbacsv.export(db, query, sys.stdout) # vim:set ts=4 sw=4 expandtab: dballe-5.18/provami/icon-map-window.png0000644000175000017500000000042411173330007015001 00000000000000PNG  IHDRVΎWbKGD pHYs+tIMErcIDAT8˥K G}ZNRB(^da[ ؄Ӄ%lEw?d8yjfI6 )nd.?(:Eәcg~^OjePRPN@/6W=z:6GI1T-F~ ]~9IENDB`dballe-5.18/provami/populate.py0000755000175000017500000000277511173330007013504 00000000000000#!/usr/bin/python from Dballe import * import unittest contexts = [] anas = [] db = TestDB() rec = Record() rec.setd("lat", 12.34560) rec.setd("lon", 76.54320) rec.seti("mobile", 0) rec.seti("block", 3) rec.seti("station", 4) rec.seti("year", 2006) rec.seti("month", 5) rec.seti("day", 3) rec.seti("hour", 12) rec.seti("min", 0) rec.seti("sec", 0) rec.seti("leveltype1", 100) rec.seti("l1", 0) rec.seti("leveltype2", 0) rec.seti("l2", 0) rec.seti("pindicator", 0) rec.seti("p1", 0) rec.seti("p2", 0) rec.seti("rep_cod", 1) rec.setc("B01011", "Hey Hey !") rec.seti("B01012", 500) # Insert a fixed station context, ana = db.insert(rec, True, True) contexts.append(context) anas.append(ana) # Insert a moving station rec.seti("mobile", 1) rec.setc("ident", "cippolippo") for i in range(-10, 10): rec.setd("lon", i*1.1) context, ana = db.insert(rec, True, True) contexts.append(context) anas.append(ana) # Insert pseudoana values for a in anas: rec.seti("ana_id", a) rec.setAnaContext() rec.setc("B01011", "AnaAnaYe") rec.seti("B01012", a) context, ana = db.insert(rec, True, True) contexts.append(context) rec.seti("rep_cod", 1) rec.setc("B01011", "AnaSynoYe") rec.seti("B01012", a * 10) context, ana = db.insert(rec, True, True) contexts.append(context) # Insert attributes for every variable for c in contexts: attr = Record() attr.seti("B33007", c) attr.seti("B33040", c * 2) db.attrInsert(c, "B01011", attr) attr.seti("B33007", c + 1) attr.seti("B33040", c * 2 + 1) db.attrInsert(c, "B01012", attr) dballe-5.18/provami/icon-map-select-ident.png0000644000175000017500000000035311173330007016053 00000000000000PNG  IHDRa pHYs  tIME}tEXtCommentCreated with The GIMPd%naIDAT8˽A 7_<.^TCH # Y!T0A&Tu@iqgh T&z =dK %+4^v header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* lua is available */ #undef HAVE_LUA /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* sql.h (part of unixodbc) has been found */ #undef HAVE_ODBC_H /* popt.h has been found */ #undef HAVE_POPT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* we can use strcasestr */ #undef HAVE_STRCASESTR /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* define if the compiler has the method std::vector::data () */ #undef HAVE_VECTOR_DATA /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Define to 1 if your C compiler doesn't accept -c and -o together. */ #undef NO_MINUS_C_MINUS_O /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* we need to use our own bswap_* functions */ #undef USE_OWN_BSWAP /* we need to use our own vasprintf */ #undef USE_OWN_VASPRINTF /* Version number of package */ #undef VERSION dballe-5.18/compile0000755000175000017500000001533711730345667011216 00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2012-01-04.17; # UTC # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009, 2010, 2012 Free # Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute 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, see . # 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. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l*) lib=${1#-l} found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes set x "$@" "$dir/$lib.dll.lib" break fi if test -f "$dir/$lib.lib"; then found=yes set x "$@" "$dir/$lib.lib" break fi done IFS=$save_IFS test "$found" != yes && set x "$@" "$lib.lib" shift ;; -L*) func_file_conv "${1#-L}" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: dballe-5.18/m4/0000755000175000017500000000000011754670140010220 500000000000000dballe-5.18/m4/ax_append_flag.m40000644000175000017500000000530411705523336013334 00000000000000# =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_append_flag.html # =========================================================================== # # SYNOPSIS # # AX_APPEND_FLAG(FLAG, [FLAGS-VARIABLE]) # # DESCRIPTION # # FLAG is appended to the FLAGS-VARIABLE shell variable, with a space # added in between. # # If FLAGS-VARIABLE is not specified, the current language's flags (e.g. # CFLAGS) is used. FLAGS-VARIABLE is not changed if it already contains # FLAG. If FLAGS-VARIABLE is unset in the shell, it is set to exactly # FLAG. # # NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. # # LICENSE # # Copyright (c) 2008 Guido U. Draheim # Copyright (c) 2011 Maarten Bosmans # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation, either version 3 of the License, or (at your # option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 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 . # # As a special exception, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure # scripts that are the output of Autoconf when processing the Macro. You # need not follow the terms of the GNU General Public License when using # or distributing such scripts, even though portions of the text of the # Macro appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the Autoconf # Macro released by the Autoconf Archive. When you make and distribute a # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. #serial 2 AC_DEFUN([AX_APPEND_FLAG], [AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])])dnl AS_VAR_SET_IF(FLAGS, [case " AS_VAR_GET(FLAGS) " in *" $1 "*) AC_RUN_LOG([: FLAGS already contains $1]) ;; *) AC_RUN_LOG([: FLAGS="$FLAGS $1"]) AS_VAR_SET(FLAGS, ["AS_VAR_GET(FLAGS) $1"]) ;; esac], [AS_VAR_SET(FLAGS,["$1"])]) AS_VAR_POPDEF([FLAGS])dnl ])dnl AX_APPEND_FLAG dballe-5.18/m4/lt~obsolete.m40000644000175000017500000001375611730345657012776 00000000000000# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # 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. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) dballe-5.18/m4/pkg.m40000644000175000017500000001214511403421073011154 00000000000000# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # # Copyright © 2004 Scott James Remnant . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # 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. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # # Similar to PKG_CHECK_MODULES, make sure that the first instance of # this or PKG_CHECK_MODULES is called, or make sure to call # PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_ifval([$2], [$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$PKG_CONFIG"; then if test -n "$$1"; then pkg_cv_[]$1="$$1" else PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], [pkg_failed=yes]) fi else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"` else $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD ifelse([$4], , [AC_MSG_ERROR(dnl [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT ])], [AC_MSG_RESULT([no]) $4]) elif test $pkg_failed = untried; then ifelse([$4], , [AC_MSG_FAILURE(dnl [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])], [$4]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) ifelse([$3], , :, [$3]) fi[]dnl ])# PKG_CHECK_MODULES dballe-5.18/m4/ltversion.m40000644000175000017500000000126211730345657012436 00000000000000# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # 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. # @configure_input@ # serial 3337 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.2]) m4_define([LT_PACKAGE_REVISION], [1.3337]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' macro_revision='1.3337' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) dballe-5.18/m4/libtool.m40000644000175000017500000106043411730345657012064 00000000000000# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # 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. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 57 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # `#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test $lt_write_fail = 0 && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) _LT_PROG_REPLACE_SHELLFNS mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test "$lt_cv_ld_force_load" = "yes"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script which will find a shell with a builtin # printf (which we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case "$ECHO" in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified).], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([${with_sysroot}]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and in which our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test x"[$]$2" = xyes; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no])dnl 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(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_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 `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi _LT_TAGVAR(link_all_deplibs, $1)=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS="$save_LDFLAGS"]) if test "$lt_cv_irix_exported_symbol" = yes; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; gnu*) ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) # ------------------------------------------------------ # In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and # '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. m4_defun([_LT_PROG_FUNCTION_REPLACE], [dnl { sed -e '/^$1 ()$/,/^} # $1 /c\ $1 ()\ {\ m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) } # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: ]) # _LT_PROG_REPLACE_SHELLFNS # ------------------------- # Replace existing portable implementations of several shell functions with # equivalent extended shell implementations where those features are available.. m4_defun([_LT_PROG_REPLACE_SHELLFNS], [if test x"$xsi_shell" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"}]) _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl func_split_long_opt_name=${1%%=*} func_split_long_opt_arg=${1#*=}]) _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) fi if test x"$lt_shell_append" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl func_quote_for_eval "${2}" dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) fi ]) # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine which file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS dballe-5.18/m4/ltoptions.m40000644000175000017500000003007311730345657012446 00000000000000# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, # Inc. # Written by Gary V. Vaughan, 2004 # # 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. # serial 7 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) dballe-5.18/m4/python.m40000644000175000017500000002044311403421221011707 00000000000000## ------------------------ -*- Autoconf -*- ## Python file handling ## From Andrew Dalke ## Updated by James Henstridge ## ------------------------ # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008, 2009 # 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_PATH_PYTHON([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # --------------------------------------------------------------------------- # Adds support for distributing Python modules and packages. To # install modules, copy them to $(pythondir), using the python_PYTHON # automake variable. To install a package with the same name as the # automake package, install to $(pkgpythondir), or use the # pkgpython_PYTHON automake variable. # # The variables $(pyexecdir) and $(pkgpyexecdir) are provided as # locations to install python extension modules (shared libraries). # Another macro is required to find the appropriate flags to compile # extension modules. # # If your package is configured with a different prefix to python, # users will have to add the install directory to the PYTHONPATH # environment variable, or create a .pth file (see the python # documentation for details). # # If the MINIMUM-VERSION argument is passed, AM_PATH_PYTHON will # cause an error if the version of python installed on the system # doesn't meet the requirement. MINIMUM-VERSION should consist of # numbers and dots only. AC_DEFUN([AM_PATH_PYTHON], [ dnl Find a Python interpreter. Python versions prior to 2.0 are not dnl supported. (2.0 was released on October 16, 2000). m4_define_default([_AM_PYTHON_INTERPRETER_LIST], [python python2 python3 python3.0 python2.5 python2.4 python2.3 python2.2 dnl python2.1 python2.0]) m4_if([$1],[],[ dnl No version check is needed. # Find any Python interpreter. if test -z "$PYTHON"; then AC_PATH_PROGS([PYTHON], _AM_PYTHON_INTERPRETER_LIST, :) fi am_display_PYTHON=python ], [ dnl A version check is needed. if test -n "$PYTHON"; then # If the user set $PYTHON, use it and don't search something else. AC_MSG_CHECKING([whether $PYTHON version >= $1]) AM_PYTHON_CHECK_VERSION([$PYTHON], [$1], [AC_MSG_RESULT(yes)], [AC_MSG_ERROR(too old)]) am_display_PYTHON=$PYTHON else # Otherwise, try each interpreter until we find one that satisfies # VERSION. AC_CACHE_CHECK([for a Python interpreter with version >= $1], [am_cv_pathless_PYTHON],[ for am_cv_pathless_PYTHON in _AM_PYTHON_INTERPRETER_LIST none; do test "$am_cv_pathless_PYTHON" = none && break AM_PYTHON_CHECK_VERSION([$am_cv_pathless_PYTHON], [$1], [break]) done]) # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON. if test "$am_cv_pathless_PYTHON" = none; then PYTHON=: else AC_PATH_PROG([PYTHON], [$am_cv_pathless_PYTHON]) fi am_display_PYTHON=$am_cv_pathless_PYTHON fi ]) if test "$PYTHON" = :; then dnl Run any user-specified action, or abort. m4_default([$3], [AC_MSG_ERROR([no suitable Python interpreter found])]) else dnl Query Python for its version number. Getting [:3] seems to be dnl the best way to do this; it's what "site.py" does in the standard dnl library. AC_CACHE_CHECK([for $am_display_PYTHON version], [am_cv_python_version], [am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[[:3]])"`]) AC_SUBST([PYTHON_VERSION], [$am_cv_python_version]) dnl Use the values of $prefix and $exec_prefix for the corresponding dnl values of PYTHON_PREFIX and PYTHON_EXEC_PREFIX. These are made dnl distinct variables so they can be overridden if need be. However, dnl general consensus is that you shouldn't need this ability. AC_SUBST([PYTHON_PREFIX], ['${prefix}']) AC_SUBST([PYTHON_EXEC_PREFIX], ['${exec_prefix}']) dnl At times (like when building shared libraries) you may want dnl to know which OS platform Python thinks this is. AC_CACHE_CHECK([for $am_display_PYTHON platform], [am_cv_python_platform], [am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"`]) AC_SUBST([PYTHON_PLATFORM], [$am_cv_python_platform]) dnl Set up 4 directories: dnl pythondir -- where to install python scripts. This is the dnl site-packages directory, not the python standard library dnl directory like in previous automake betas. This behavior dnl is more consistent with lispdir.m4 for example. dnl Query distutils for this directory. distutils does not exist in dnl Python 1.5, so we fall back to the hardcoded directory if it dnl doesn't work. AC_CACHE_CHECK([for $am_display_PYTHON script directory], [am_cv_python_pythondir], [if test "x$prefix" = xNONE then am_py_prefix=$ac_default_prefix else am_py_prefix=$prefix fi am_cv_python_pythondir=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(0,0,prefix='$am_py_prefix'))" 2>/dev/null || echo "$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages"` case $am_cv_python_pythondir in $am_py_prefix*) am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'` am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"` ;; *) case $am_py_prefix in /usr|/System*) ;; *) am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages ;; esac ;; esac ]) AC_SUBST([pythondir], [$am_cv_python_pythondir]) dnl pkgpythondir -- $PACKAGE directory under pythondir. Was dnl PYTHON_SITE_PACKAGE in previous betas, but this naming is dnl more consistent with the rest of automake. AC_SUBST([pkgpythondir], [\${pythondir}/$PACKAGE]) dnl pyexecdir -- directory for installing python extension modules dnl (shared libraries) dnl Query distutils for this directory. distutils does not exist in dnl Python 1.5, so we fall back to the hardcoded directory if it dnl doesn't work. AC_CACHE_CHECK([for $am_display_PYTHON extension module directory], [am_cv_python_pyexecdir], [if test "x$exec_prefix" = xNONE then am_py_exec_prefix=$am_py_prefix else am_py_exec_prefix=$exec_prefix fi am_cv_python_pyexecdir=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(1,0,prefix='$am_py_exec_prefix'))" 2>/dev/null || echo "$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages"` case $am_cv_python_pyexecdir in $am_py_exec_prefix*) am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'` am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"` ;; *) case $am_py_exec_prefix in /usr|/System*) ;; *) am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages ;; esac ;; esac ]) AC_SUBST([pyexecdir], [$am_cv_python_pyexecdir]) dnl pkgpyexecdir -- $(pyexecdir)/$(PACKAGE) AC_SUBST([pkgpyexecdir], [\${pyexecdir}/$PACKAGE]) dnl Run any user-specified action. $2 fi ]) # AM_PYTHON_CHECK_VERSION(PROG, VERSION, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) # --------------------------------------------------------------------------- # Run ACTION-IF-TRUE if the Python interpreter PROG has version >= VERSION. # Run ACTION-IF-FALSE otherwise. # This test uses sys.hexversion instead of the string equivalent (first # word of sys.version), in order to cope with versions such as 2.2c1. # This supports Python 2.0 or higher. (2.0 was released on October 16, 2000). AC_DEFUN([AM_PYTHON_CHECK_VERSION], [prog="import sys # split strings by '.' and convert to numeric. Append some zeros # because we need at least 4 digits for the hex conversion. # map returns an iterator in Python 3.0 and a list in 2.x minver = list(map(int, '$2'.split('.'))) + [[0, 0, 0]] minverhex = 0 # xrange is not present in Python 3.0 and range returns an iterator for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[[i]] sys.exit(sys.hexversion < minverhex)" AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4])]) dballe-5.18/m4/ltsugar.m40000644000175000017500000001042411730345657012072 00000000000000# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # 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. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) dballe-5.18/m4/ax_cflags_warn_all.m40000644000175000017500000001163411674415767014232 00000000000000# =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_cflags_warn_all.html # =========================================================================== # # SYNOPSIS # # AX_CFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])] # AX_CXXFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])] # AX_FCFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])] # # DESCRIPTION # # Try to find a compiler option that enables most reasonable warnings. # # For the GNU compiler it will be -Wall (and -ansi -pedantic) The result # is added to the shellvar being CFLAGS, CXXFLAGS, or FCFLAGS by default. # # Currently this macro knows about the GCC, Solaris, Digital Unix, AIX, # HP-UX, IRIX, NEC SX-5 (Super-UX 10), Cray J90 (Unicos 10.0.0.8), and # Intel compilers. For a given compiler, the Fortran flags are much more # experimental than their C equivalents. # # - $1 shell-variable-to-add-to : CFLAGS, CXXFLAGS, or FCFLAGS # - $2 add-value-if-not-found : nothing # - $3 action-if-found : add value to shellvariable # - $4 action-if-not-found : nothing # # NOTE: These macros depend on AX_APPEND_FLAG. # # LICENSE # # Copyright (c) 2008 Guido U. Draheim # Copyright (c) 2010 Rhys Ulerich # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation; either version 3 of the License, or (at your # option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 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 . # # As a special exception, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure # scripts that are the output of Autoconf when processing the Macro. You # need not follow the terms of the GNU General Public License when using # or distributing such scripts, even though portions of the text of the # Macro appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the Autoconf # Macro released by the Autoconf Archive. When you make and distribute a # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. #serial 13 AC_DEFUN([AX_FLAGS_WARN_ALL],[dnl AS_VAR_PUSHDEF([FLAGS],[_AC_LANG_PREFIX[]FLAGS])dnl AS_VAR_PUSHDEF([VAR],[ac_cv_[]_AC_LANG_ABBREV[]flags_warn_all])dnl AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum warnings], VAR,[VAR="no, unknown" ac_save_[]FLAGS="$[]FLAGS" for ac_arg dnl in "-warn all % -warn all" dnl Intel "-pedantic % -Wall" dnl GCC "-xstrconst % -v" dnl Solaris C "-std1 % -verbose -w0 -warnprotos" dnl Digital Unix "-qlanglvl=ansi % -qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" dnl AIX "-ansi -ansiE % -fullwarn" dnl IRIX "+ESlit % +w1" dnl HP-UX C "-Xc % -pvctl[,]fullmsg" dnl NEC SX-5 (Super-UX 10) "-h conform % -h msglevel 2" dnl Cray C (Unicos) # do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break]) done FLAGS="$ac_save_[]FLAGS" ]) AS_VAR_POPDEF([FLAGS])dnl case ".$VAR" in .ok|.ok,*) m4_ifvaln($3,$3) ;; .|.no|.no,*) m4_default($4,[m4_ifval($2,[AX_APPEND_FLAG([$2], [$1])])]) ;; *) m4_default($3,[AX_APPEND_FLAG([$VAR], [$1])]) ;; esac AS_VAR_POPDEF([VAR])dnl ])dnl AX_FLAGS_WARN_ALL dnl implementation tactics: dnl the for-argument contains a list of options. The first part of dnl these does only exist to detect the compiler - usually it is dnl a global option to enable -ansi or -extrawarnings. All other dnl compilers will fail about it. That was needed since a lot of dnl compilers will give false positives for some option-syntax dnl like -Woption or -Xoption as they think of it is a pass-through dnl to later compile stages or something. The "%" is used as a dnl delimiter. A non-option comment can be given after "%%" marks dnl which will be shown but not added to the respective C/CXXFLAGS. AC_DEFUN([AX_CFLAGS_WARN_ALL],[dnl AC_LANG_PUSH([C]) AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4]) AC_LANG_POP([C]) ]) AC_DEFUN([AX_CXXFLAGS_WARN_ALL],[dnl AC_LANG_PUSH([C++]) AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4]) AC_LANG_POP([C++]) ]) AC_DEFUN([AX_FCFLAGS_WARN_ALL],[dnl AC_LANG_PUSH([Fortran]) AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4]) AC_LANG_POP([Fortran]) ]) dballe-5.18/dballe.spec0000644000175000017500000003370711422011702011712 00000000000000Summary: DB-ALLe is a database for punctual metereological data (Command line tools) Name: dballe Version: 4.0.18 Release: 2513%{dist} License: GPL Group: Applications/Meteo URL: http://www.arpa.emr.it/dettaglio_documento.asp?id=514&idlivello=64 Source0: %{name}-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot BuildRequires: unixODBC-devel, gperf, cnf-devel, tetex, tetex-latex, doxygen, latex2html, python-docutils #Requires: mysql >= 4.1.1 ,mysql-connector-odbc, sqlite sqliteodbc, %{name}-common = %{?epoch:%epoch:}%{version}-%{release} Requires: %{name}-common = %{?epoch:%epoch:}%{version}-%{release} unixODBC sqliteodbc %{!?python_sitelib: %define python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")} %{!?python_sitearch: %define python_sitearch %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib(1)")} %{!?python_siteinc: %define python_siteinc %(%{__python} -c "from distutils.sysconfig import get_python_inc; print get_python_inc()")} %description Database for punctual meteorological data (Command line tools) DB-All.e is a fast on-disk database where meteorological observed and forecast data can be stored, searched, retrieved and updated. . This framework allows to manage large amounts of data using its simple Application Program Interface, and provides tools to visualise, import and export in the standard formats BUFR, AOF and CREX. . The main characteristics of DB-ALL.e are: . * Fortran, C, C++ and Python APIs are provided. * To make computation easier, data is stored as physical quantities, that is, as measures of a variable in a specific point of space and time, rather than as a sequence of report. * Internal representation is similar to BUFR and CREX WMO standard (table code driven) and utility for import and export are included (generic and ECMWF template). * Representation is in 7 dimensions: latitude and longitude geographic coordinates, table driven vertical coordinate, reference time, table driven observation and forecast specification, table driven data type. * It allows to store extra information linked to the data, such as confidence intervals for quality control. * It allows to store extra information linked to the stations. * Variables can be represented as real, integer and characters, with appropriate precision for the type of measured value. * It is based on physical principles, that is, the data it contains are defined in terms of homogeneous and consistent physical data. For example, it is impossible for two incompatible values to exist in the same point in space and time. * It can manage fixed stations and moving stations such as airplanes or ships. * It can manage both observational and forecast data. * It can manage data along all three dimensions in space, such as data from soundings and airplanes. * Report information is preserved. It can work based on physical parameters or on report types. %package -n provami Summary: Graphical interface to DB-All.e databases Group: Applications/Meteo requires: wxPython, dballe >= 3.0-1 ,rpy, numpy %description -n provami provami is a GUI application to visualise and navigate DB-All.e databases. It also allows to perform simple editing tasks, and to graphically select and export data subsets. %package -n libdballe-devel Summary: DB-ALL.e core C development library Group: Applications/Meteo Requires: lib%{name}4 = %{?epoch:%epoch:}%{version}-%{release} %description -n libdballe-devel DB-ALL.e core C development library DB-All.e is a fast on-disk database where meteorological observed and forecast data can be stored, searched, retrieved and updated. The Fedora packaging of DB-All.e includes all the features of the libraries, but any subset can be used without interference from other subsets. It is also possible to rebuild the library to include only those features that are needed. . Features provided: . * Unit conversion * Handling of physical variables * Encoding and decoding of BUFR and CREX reports from: * fixed land and sea stations, like synops and buoys * mobile stations: ships, airplanes * soundings: temp, pilot * METAR reports * Satellite strides (decode only) * Decoding of AOF reports * Interpretation of weather reports as physical data precisely located in space and time, and encoding of physical data into weather reports. * Smart on-disk database for observed and forecast weather data based on physical principles, built to support operations such as quality control, data thinning, correlation of data from mixed sources %package -n libdballe-doc Summary: DB-ALL.e core C development library (documentation) Group: Applications/Meteo %description -n libdballe-doc DB-ALL.e core C development library (documentation) DB-All.e is a fast on-disk database where meteorological observed and forecast data can be stored, searched, retrieved and updated. . This is the documentation for the core DB_All.e development library. %package -n libdballe4 Summary: DB-ALL.e core shared library Group: Applications/Meteo Requires: %{name}-common = %{?epoch:%epoch:}%{version}-%{release} %description -n libdballe4 DB-ALL.e C shared library DB-All.e is a fast on-disk database where meteorological observed and forecast data can be stored, searched, retrieved and updated. . This is the shared library for C programs. %package -n libdballef-devel Summary: DB-All.e Fortran development library Group: Applications/Meteo Requires: %{name}-common = %{?epoch:%epoch:}%{version}-%{release},lib%{name}f-devel = %{?epoch:%epoch:}%{version}-%{release} %description -n libdballef-devel DB-All.e is a fast on-disk database where meteorological observed and forecast data can be stored, searched, retrieved and updated. . This is the DB-All.e Fortran API, designed to make it easy to use the DB-All.e database as a smart working area for meteorological software. %package -n libdballef4 Summary: DB-ALL.e Fortran shared library Group: Applications/Meteo Requires: %{name}-common = %{?epoch:%epoch:}%{version}-%{release} %description -n libdballef4 DB-All.e is a fast on-disk database where meteorological observed and forecast data can be stored, searched, retrieved and updated. . This is the shared library for Fortran programs. %package common Summary: Common data files for all DB-All.e modules Group: Applications/Meteo %description common Common data files for all DB-All.e modules DB-All.e is a fast on-disk database where meteorological observed and forecast data can be stored, searched, retrieved and updated. . This package contains common DB-All.e data files, including variable metadata, BUFR and CREX decoding tables, report metadata, level and time range descriptions. %package -n libdballepp4 Summary: DB-ALL.e C++ shared library Group: Applications/Meteo Requires: %{name}-common = %{?epoch:%epoch:}%{version}-%{release} %description -n libdballepp4 Database for punctual meteorological data (C++ shared library) DB-All.e is a fast on-disk database where meteorological observed and forecast data can be stored, searched, retrieved and updated. . This is the shared library for C++ programs. %package -n libdballepp-devel Summary: DB-All.e C++ development library Group: Applications/Meteo Requires: lib%{name}-devel = %{?epoch:%epoch:}%{version}-%{release}, lib%{name}4 = %{?epoch:%epoch:}%{version}-%{release}, lib%{name}pp4 = %{?epoch:%epoch:}%{version}-%{release} %description -n libdballepp-devel Database for punctual meteorological data (C++ development library) DB-All.e is a fast on-disk database where meteorological observed and forecast data can be stored, searched, retrieved and updated. . This is the DB-All.e C++ API, a thin wrapper around the C API that takes advantage of C++ features. %package -n python-dballe Summary: DB-ALL.e Python library Group: Applications/Meteo Requires: %{name}-common = %{?epoch:%epoch:}%{version}-%{release},rpy,numpy %description -n python-dballe DB-ALL.e Python library for weather research DB-All.e is a fast on-disk database where meteorological observed and forecast data can be stored, searched, retrieved and updated. These are the python bindings. %prep %setup -q %build ### configure pyexecdir=%{python_sitearch}/dballe pkgpythondir=%{python_sitelib}/dballe %configure --disable-rpath FC=gfortran F90=gfortan F77=gfortran --enable-dballe-bufrex --enable-dballe-msg --enable-dballe-db --enable-dballepp --enable-dballef --enable-dballe-python --enable-docs # do not work smp #make %{?_smp_mflags} make #make SITELIB=%{python_sitelib} #make pyexecdir=%{python_sitearch}/dballe pkgpythondir=%{python_sitelib}/dballe #make check %install [ "%{buildroot}" != / ] && rm -rf "%{buildroot}" #make install DESTDIR=$RPM_BUILD_ROOT pyexecdir=%{python_sitearch}/dballe pkgpythondir=%{python_sitelib}/dballe #make install DESTDIR=$RPM_BUILD_ROOT SITELIB=%{python_sitelib} make install DESTDIR=$RPM_BUILD_ROOT %clean [ "%{buildroot}" != / ] && rm -rf "%{buildroot}" #rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root,-) %dir %{_bindir} %dir %{_mandir}/man1 %{_bindir}/dbadb %{_bindir}/dbamsg %{_bindir}/dbatbl %doc %{_mandir}/man1/dbadb* %doc %{_mandir}/man1/dbamsg* %doc %{_mandir}/man1/dbatbl* %doc %{_docdir}/dballe/guide.ps %doc %{_docdir}/dballe/guide_html/* %doc %{_docdir}/dballe/fortran_api/* %doc %{_docdir}/dballe/libdballef.doxytags %files -n provami %defattr(-,root,root,-) %dir /usr/bin %{_bindir}/provami %dir %{python_sitelib}/ %{python_sitelib}/provami/* %dir %{_mandir}/man1 %doc %{_mandir}/man1/provami* /usr/share/dballe/icon*.png /usr/share/dballe/world.dat %files common %defattr(-,root,root,-) /usr/share/dballe/[DB]* /usr/share/dballe/dballe.txt /usr/share/dballe/repinfo.csv %files -n libdballe4 %defattr(-,root,root,-) %{_libdir}/libdballe.so.* #%{_libdir}/libdballe[0-9]*.so.* %files -n libdballe-devel %defattr(-,root,root,-) %doc %{_docdir}/dballe/libdballe.doxytags %{_includedir}/dballe/core/* %{_includedir}/dballe/bufrex/* %{_includedir}/dballe/msg/* %{_includedir}/dballe/db/* %{_includedir}/dballe/init.h %{_libdir}/libdballe.a %{_libdir}/libdballe.la %{_libdir}/libdballe.so #%{_libdir}/libdballe[0-9]*.so %{_libdir}/pkgconfig/libdballe.pc /usr/share/aclocal/libdballe.m4 %files -n libdballef-devel %defattr(-,root,root,-) %doc %{_docdir}/dballe/fapi_html %doc %{_docdir}/dballe/fapi.ps %{_includedir}/dballe/dballef.h %{_libdir}/libdballef*.a %{_libdir}/pkgconfig/libdballef* %{_libdir}/libdballef*.la %{_libdir}/libdballef*.so /usr/share/aclocal/libdballef*.m4 %files -n libdballef4 %defattr(-,root,root,-) %{_libdir}/libdballef*.so.* %files -n python-dballe %defattr(-,root,root,-) %dir %{python_sitelib}/dballe %{python_sitelib}/dballe/* %dir %{python_sitearch} %{python_sitearch}/*.a %{python_sitearch}/*.la %{python_sitearch}/*.so* %{_bindir}/dbatbl_makeb %doc %{_docdir}/dballe/python-dballe* %files -n libdballepp4 %defattr(-,root,root,-) %{_libdir}/libdballepp*.so.* %files -n libdballepp-devel %defattr(-,root,root,-) %doc %{_docdir}/dballe/libdballepp.doxytags %doc %{_docdir}/dballe/c++_api %{_includedir}/dballe++ %{_libdir}/libdballepp*.a %{_libdir}/pkgconfig/libdballepp* %{_libdir}/libdballepp*.la %{_libdir}/libdballepp*.so /usr/share/aclocal/libdballepp.m4 %files -n libdballe-doc %defattr(-,root,root,-) %doc %{_docdir}/dballe/c_api %post /sbin/ldconfig %postun /sbin/ldconfig %changelog * Thu Jul 8 2010 Daniele Branchini - 4.0.18-2513%{dist} - Aggiornato alla revisione 2513 * Thu Feb 25 2010 Daniele Branchini - 4.0.16-2451 - corretta sintassi release di pacchettizzazione * Tue Nov 11 2008 root - %epoch:}%{version}-%{release}:4.0.8-1 - bug resolved about units conversion in import/export and template used in api query message * Wed Oct 29 2008 root - %epoch:}%{version}-%{release}:4.0.7-1 - bug on query best corrected * Wed Apr 2 2008 root - %epoch:}%{version}-%{release}:4.0.0-8 - added some units conversion * Tue Mar 18 2008 root - %epoch:}%{version}-%{release}:4.0.0-4 - new pachage (less pachages) * Tue Dec 19 2006 root - 3.0-1 - spitted in more packages for version 3.0 * Wed Nov 29 2006 root - 2.6-2 - aggiuntevar e rete per icecast * Wed Nov 22 2006 root - 2.6-1 - added support for sqlite * Wed Aug 9 2006 root - 2.3-3 - Aggiornato alla revisione 1086 * Wed Aug 2 2006 root - 2.3-1 - some bugs solved * Tue May 9 2006 root - 2.0-1 - cambio delle api e della struttura db per permette la piu' versatile gestione dell'anagrafica * Wed May 3 2006 root - 1.1-1 - ottimizzazioni! eliminato querybest e introdotto parametro quesy con opzioni best e bigana * Wed Apr 26 2006 root - 1.0-5 - modificate query per ottimizzazione * Tue Apr 11 2006 root - 1.0-4 - inserita indicizzazione * Tue Apr 11 2006 root - 1.0-3 - corretti alcni bug * Wed Mar 15 2006 root - 1.0-2 - corrette conversioni mancanti e gestione generici * Wed Mar 8 2006 root - 1.0-1 - prima release ufficiale * Wed Feb 15 2006 root - 0.7-9 - a lot of bug fixes * Wed Feb 8 2006 root - 0.7-8 - a lot of bug fixes * Wed Feb 1 2006 root - 0.7-7 - resolved performace iusses and metar implemented + aof fixes * Wed Jan 25 2006 root - 0.7-6 - corretti bug * Wed Jan 18 2006 root - 0.7-5 - about source and table bug * Tue Jan 17 2006 root - 0.7-4 - lot of bug corrected and documentation improvements * Tue Jan 10 2006 root - 0.7-2 - corretti vari bug di fine anno * Tue Sep 13 2005 root - Initial build. dballe-5.18/extra/0000755000175000017500000000000011754670141011024 500000000000000dballe-5.18/extra/test-crex-d-table.txt0000644000175000017500000052523111173330007014726 00000000000000 D00002 2 B00002 B00003 D00003 3 B00010 B00011 B00012 D00004 9 D00003 B00013 B00014 B00015 B00016 B00017 B00018 B00019 B00020 D00010 3 D00003 R01000 B00030 D01001 2 B01001 B01002 D01002 3 B01003 B01004 B01005 D01003 3 B01011 B01012 B01013 D01004 4 B01001 B01002 B01015 B02001 D01011 3 B04001 B04002 B04003 D01012 2 B04004 B04005 D01013 3 B04004 B04005 B04006 D01021 2 B05001 B06001 D01022 3 B05001 B06001 B07001 D01023 2 B05002 B06002 D01024 3 B05002 B06002 B07001 D01025 3 D01023 B04003 D01012 D01026 7 D01021 B04003 B04003 B04004 B04004 B04005 B04005 D01029 3 B01018 B02001 D01011 D01030 4 B01018 B02001 D01011 D01024 D01031 5 D01001 B02001 D01011 D01012 D01022 D01032 5 D01001 B02001 D01011 D01012 D01024 D01033 5 B01005 B02001 D01011 D01012 D01021 D01034 5 B01005 B02001 D01011 D01012 D01023 D01035 7 B01005 B01012 B01013 B02001 D01011 D01012 D01023 D01036 5 D01003 B02001 D01011 D01012 D01023 D01037 6 D01001 B02011 B02012 D01011 D01012 D01022 D01038 6 D01001 B02011 B02012 D01011 D01012 D01024 D01039 6 D01003 B02011 B02012 D01011 D01012 D01023 D01040 6 D01003 B02011 B02012 D01011 D01012 D01024 D01041 5 B01007 B02021 B02022 D01011 D01012 D01042 2 D01041 D01021 D01043 5 B01007 B02023 D01011 D01013 D01021 D01044 5 B01007 B02024 D01011 D01013 D01021 D01049 5 B02111 B02112 B21062 B21063 B21065 D01051 6 B01006 B02061 D01011 D01012 D01021 B08004 D01055 7 B01005 B02001 D01011 D01012 D01021 B01012 B01014 D01062 2 R01000 D01001 D01065 8 B01006 B01008 B02001 B02002 B02005 B02062 B02070 B02065 D01066 6 D01011 D01013 D01023 B07004 B02064 B08004 D01070 3 B02143 B02142 B02144 D01071 5 B01007 B01031 B02020 B02028 B02029 D01072 4 D01071 D01011 D01013 D01021 D01074 4 B02143 B02142 B02145 B02146 D01075 6 D01001 B01015 D01024 B08021 D01011 D01012 D01076 3 B02011 B02143 B02142 D01090 6 D01004 D01011 D01012 D01021 B07030 B07031 D01091 10 B02180 B02181 B02182 B02183 B02184 B02179 B02186 B02187 B02188 B02189 D01193 5 001007 001031 002196 002221 002222 D01250 4 D01193 D01011 D01013 D01021 D02001 4 B10004 B10051 B10061 B10063 D02002 5 B10004 B07004 B10003 B10061 B10063 D02003 9 B11011 B11012 B12004 B12006 B13003 B20001 B20003 B20004 B20005 D02004 7 B20010 B08002 B20011 B20013 B20012 B20012 B20012 D02005 4 B08002 B20011 B20012 B20013 D02006 4 B10004 B10051 B10062 B10063 D02011 3 D02001 D02003 D02004 D02012 3 D02002 D02003 D02004 D02013 4 D02006 D02003 R01000 D02005 D02021 3 B22001 B22011 B22021 D02022 3 B22002 B22012 B22022 D02023 3 B22003 B22013 B22023 D02024 3 D02022 R01002 D02023 D02051 12 B10004 B10051 B07004 B10003 B12004 B12051 B12016 B12017 B13004 R02004 B08051 B08020 D02069 4 B07032 B07033 B33041 B20001 D02070 8 B07032 B07033 B11001 B11002 B11043 B11041 B11016 B11017 D02071 14 B07032 B07033 B08021 B04025 B11001 B11002 B08021 R03002 B04025 B11043 B11041 B04025 B11016 B11017 D02072 5 B07032 B07033 B12101 B12103 B13003 D02073 7 B20010 R05004 B08002 B20011 B20012 B33041 B20013 D02074 4 B20003 B04025 B20004 B20005 D02075 5 B08021 B04025 B13055 B13058 B08021 D02076 7 B02021 B20022 B26020 B20023 B20024 B20025 B20026 D02077 12 B07032 B07033 B04025 B12111 B12112 B07032 B04025 B12112 B02176 B20062 B02177 B13013 D02078 4 B02176 B20062 B02177 B13013 D02079 5 B07032 B02175 B02178 B04025 B13011 D02080 3 B02185 B04025 B13033 D02081 2 B04025 B14031 D02082 7 B04025 B14002 B14004 B14016 B14028 B14029 B14030 D02083 8 B04025 B08023 B10004 B11001 B11002 B12101 B13003 B08023 D03001 3 B07003 B11001 B11002 D03002 3 B07004 B11001 B11002 D03003 4 B07004 B10003 B12001 B12003 D03004 6 B07004 B10003 B12001 B12003 B11001 B11002 D03011 4 B07003 B08001 B11001 B11002 D03012 4 B07004 B08001 B11001 B11002 D03013 7 B07004 B08001 B10003 B12001 B13003 B11001 B11002 D03014 7 B07004 B08001 B10003 B12001 B12003 B11001 B11002 D03031 6 B07004 B08003 B07021 B07022 B08012 B12061 D03032 2 B20011 B20016 D03033 2 B20010 B20016 D03041 8 B02152 B02023 B07004 B11001 B11002 B02153 B02154 B12071 D03250 8 B02252 B02023 B07004 B11001 B11002 B02197 B02198 B12193 D04001 5 B08003 B10004 B12001 B11001 B11002 D04002 4 B08003 B10004 B11001 B11002 D04003 2 B08003 B12001 D04004 4 B08003 B10004 B20010 B12001 D04005 4 B02024 B07004 B07004 B13003 D04006 3 B14001 B14001 B14003 D04011 27 B02163 B02164 B08012 B07024 B02057 B08021 B04001 B04002 B04003 B04004 B08021 B04024 R10004 B08021 B04004 B04005 B04006 B08021 B04004 B04005 B04006 B11001 B11002 R03010 B02163 B07004 B12001 D04030 3 B27031 B28031 B10031 D04031 3 B01041 B01042 B01043 D04032 5 B02153 B02154 B20081 B20082 B20012 D04033 8 B02152 B02166 B02167 B02153 B02154 B12075 B12076 B12063 D04034 9 R02004 B27001 B28001 B07022 B05043 B20010 B20016 B33003 B10040 D04250 27 B02231 B02232 B08012 B07024 B02057 B08021 B04001 B04002 B04003 B04004 B08021 B04024 R10004 B08021 B04004 B04005 B04006 B08021 B04004 B04005 B04006 B11001 B11002 R03010 B02231 B07004 B12001 D05001 4 B11001 B11002 B13060 B13071 D05002 11 D01012 B12001 B13003 B14051 B13060 B13072 B13080 B13081 B13082 B13083 B13084 D05003 4 D01012 B04065 R01000 D05001 D05004 3 D01030 D05002 D05003 D05006 8 B13072 B13082 B13019 C07005 C01004 B12001 B13073 B13060 D05007 5 D01029 D01012 B04065 R01000 D05006 D05008 4 D05006 C07005 C01004 B12030 D05009 5 D01029 D01012 B04065 R01000 D05008 D05010 3 D05008 B02091 B02091 D05011 5 D01029 D01012 B04065 R01000 D05010 D05016 7 B14021 B07004 B13003 B11002 B11001 B11041 B11043 D05017 5 B13080 B13081 B13083 B13085 B13084 D05018 7 D01029 D01012 B04065 R03000 D05008 D05016 D05017 D06001 4 B02032 R02000 B07062 B22042 D06002 3 B02031 B22004 B22031 D06003 4 B02002 B11011 B11012 B12004 D06004 6 B02032 B02033 R03000 B07062 B22043 B22062 D06005 5 B02031 R03000 B07062 B22004 B22031 D06006 3 D06003 D06002 B22063 D06007 6 B01012 B01014 D06008 B04024 B27003 B28003 D06008 3 B02034 B02035 B02036 D06020 8 B01075 D01011 D01012 B22042 B22120 B22121 B04075 B04065 D06021 7 B01075 D01011 D01012 B22122 B22123 B12001 D03002 D06022 5 B01075 D01011 D01012 B22038 B22039 D06023 8 B01015 D01023 D01011 D01012 B22038 B22039 B22120 B22121 D06024 4 D06020 R02000 B22038 B22039 D07001 2 D01031 D02011 D07002 2 D01032 D02011 D07003 3 D07001 R01000 D02005 D07004 3 D07002 R01000 D02005 D07005 3 D07001 R01004 D02005 D07006 3 D07002 R01004 D02005 D07007 2 D01031 D02012 D07008 2 D01032 D02012 D07009 2 D01031 D02013 D07011 16 B01063 B02001 D01011 D01012 D01024 B07006 B11001 B11016 B11017 B11002 B11041 B07006 B12001 B12003 B10052 B20009 D07012 4 R03000 B08023 B05021 B20001 D07013 7 R06000 B01064 B08014 B20061 B08014 B20061 B20018 D07014 2 R01000 B20019 D07015 3 R01000 D02005 B20002 D07016 2 R01000 B20020 D07017 2 R01000 B11070 D07018 13 B08016 R02000 B08017 D01012 R04000 B07006 B11001 B11002 B11041 B20009 R01000 B20001 D07014 D07020 3 D07011 D07014 D07016 D07021 9 D07011 D07012 D07013 D07014 D07015 D07016 D07017 D07018 D07015 D07030 2 B15001 B15002 D07031 7 B08022 B08023 B15001 B08023 B15001 B08023 B15002 D07041 7 D01001 B01015 D01024 D01011 D01012 D01070 D07030 D07042 9 D01001 B01015 D01024 D01011 D01012 B08021 B04025 D01070 D07031 D07043 7 D01001 B01015 D01024 D01011 D01012 D01074 D07030 D07044 9 D01001 B01015 D01024 D01011 D01012 B08021 B04025 D01074 D07031 D07060 2 B07061 B12030 D07061 3 D01031 R01005 D07060 D07062 3 D01032 R01005 D07060 D07063 2 B07061 B12130 D08001 3 D01033 D02011 B22042 D08002 3 D01034 D02011 B22042 D08003 3 D01035 D02011 B22042 D08004 3 D01036 D02011 B22042 D08005 2 D08004 D02024 D08006 8 B10004 B10061 B10063 B11001 B11002 B12004 B13003 B22042 D08007 4 D01055 D02011 B07062 B22042 D09001 3 D01037 R01000 D03011 D09002 3 D01038 R01000 D03011 D09003 3 D01037 R01000 D03012 D09004 3 D01038 R01000 D03012 D09005 4 D01037 D02004 R01000 D03013 D09006 4 D01038 D02004 R01000 D03013 D09007 4 D01037 D02004 R01000 D03014 D09008 4 D01038 D02004 R01000 D03014 D09011 3 D01039 R01000 D03011 D09012 3 D01039 R01000 D03012 D09013 4 D01039 D02004 R01000 D03013 D09014 4 D01039 D02004 R01000 D03014 D09015 3 D01040 R01000 D03011 D09016 3 D01040 R01000 D03012 D09017 4 D01040 D02004 R01000 D03013 D09018 4 D01040 D02004 R01000 D03014 D09019 4 D01031 B02003 R01000 D03011 D09020 7 D01031 B02003 R04000 B07003 B11003 B11004 B11005 D09030 7 B15004 B15005 R04000 B04015 B08006 B07004 B15003 D09040 3 D01075 D01076 D09030 D09041 4 D07041 D01075 D01076 D09030 D09042 4 D07042 D01075 D01076 D09030 D09044 4 D07044 D01075 D01076 D09030 D10001 5 D01042 D03031 D03032 R01026 D03025 D10002 5 D01042 D03031 D03032 R01009 D03023 D10003 5 D01042 D03031 D03032 R01006 D03023 D10004 5 D01042 D03031 D03032 R01003 D03024 D10005 5 D01042 D03031 D03033 R01000 D03025 D10006 5 D01042 D03031 D03033 R01000 D03023 D10007 5 D01042 D03031 D03033 R01000 D03024 D10008 8 D10011 R01019 D10012 B02150 B25079 B25080 B33032 B14045 D10009 3 D10011 R01015 D10012 D10010 3 D10011 R01005 D10012 D10014 3 D01072 D03041 D04011 D10015 13 D01072 B07024 B10002 D03041 R01003 D04032 B02152 B02024 B07004 B07004 B13003 R01003 D04033 D10016 13 D01072 B07024 B10002 D03041 R01012 D04032 B02152 B02024 B07004 B07004 B13003 R01012 D04033 D10020 6 D10022 D01011 D01013 D01021 D04034 D10021 D10022 4 B01007 B02019 B01033 B02172 D10023 17 D01072 B30021 B30022 B08012 B07024 B07025 B10002 R01012 D04032 R05002 B02152 B02024 B07004 B07004 B13003 R01012 D04033 D10050 13 D10051 D10052 R01000 D10053 R01004 D10054 B20010 D10052 R01015 D10053 D10052 R01004 D10053 D10195 3 D01250 D03250 D04250 D11001 9 D01051 B07002 B12001 B11001 B11002 B11031 B11032 B11033 B20041 D11002 4 D01065 D01066 D11003 D11004 D11003 5 B10070 B11001 B11002 B12001 B13002 D11004 12 R01000 B11034 R01000 B11035 R01000 B11075 R01000 B11076 R01000 B33025 R01000 B33026 D11005 13 B01008 B01023 D01021 D01011 D01013 B07010 B08009 B11001 B11002 B11031 B11036 B12101 B33025 D11006 6 B07010 B11001 B11002 B02064 B12101 B12103 D11193 16 D01197 D01011 D01012 D01023 B08004 B07004 B08021 B11001 B11002 B11031 B11034 B11035 B12001 B12003 B13003 B20041 D12001 2 D01043 D04001 D12002 2 D01043 D04002 D12003 2 D01042 D04003 D12004 2 D01042 D04004 D12005 2 D01042 B20014 D12006 2 D01044 D04005 D12007 2 D01042 D04006 D12010 6 B01007 B05040 B02021 B05041 B04001 B04043 D12014 8 D12010 D12011 R05056 D01023 B05042 B05052 D12012 D12013 D12016 3 D12010 D12011 D12015 D12018 3 D12010 D12011 D12017 D12020 11 D01047 D01048 B15015 B29002 B21076 R04012 B06030 R02012 B05030 B21075 B21066 D12021 6 D01047 R01003 D01049 B11012 B11011 B21067 D12022 15 D01047 B08022 B11012 B11050 B22070 B22026 D12041 B10050 B21068 B21071 B21072 B21073 D12042 B21062 B15011 D12023 7 D01047 R03003 B08022 B12061 B22050 B21069 B21085 D12024 11 D12020 B08060 B08022 B08060 B08022 B25014 B22101 B22097 B22098 B22099 B22100 D12025 11 D12019 B08060 B08022 B08060 B08022 B25014 B22101 B22097 B22098 B22099 B22100 D12026 19 D01046 D01011 D01013 D01023 D12031 R01004 D12030 B21110 D01023 D21027 B21111 D01023 D21027 B21112 D01023 D21027 B21113 D01023 D21027 D12027 9 D01047 R05009 D01023 B07021 B12061 B07021 B12061 B21085 B21070 D12031 8 B05034 B06034 B21109 B11081 B11082 B21101 B21102 B21103 D12032 4 B21120 B21121 B13055 B21122 D12033 4 B02104 B08022 B12063 B12065 D12042 6 B21077 B21078 B21079 B21080 B21081 B21082 D12045 21 B01007 B02019 B01096 B25061 B05040 D01011 D01013 D01021 B07002 B12180 B12181 B12182 B12183 B12184 B12185 B02174 B21086 B12186 B21087 B12187 B33043 D13009 3 B21001 R01000 B21001 D13010 3 B21036 R01000 B21036 D13031 4 B06002 B06012 R01000 B30001 D13032 4 B05002 B05012 R01000 D13031 D13041 9 B06002 R10000 R04000 B06012 R01000 B30001 B06012 R01000 B30001 D13042 4 B05002 B05012 R01000 D13041 D13043 11 B06002 B05002 B05012 R12000 R10000 R04000 B06012 R01000 B30001 R01000 B30001 D15001 5 B01011 D01011 D01012 D01023 D06001 D15002 5 B01011 D01011 D01012 D01023 D06004 D16001 10 D01011 B04004 D01023 B01021 B02041 B19001 B10051 B19002 B19003 B19004 D16002 15 B08021 B04001 B04002 B04003 B04004 B04005 B01033 B08021 B04001 B04002 B04003 B04004 B04005 B07002 B07002 D16003 10 R09000 B08011 B08007 R04000 B05002 B06002 B10002 B11002 B08007 B08011 D16004 11 R10000 B08011 B08007 B07002 B07002 R02000 B05002 B06002 B11031 B08007 B08011 D16005 9 R08000 B08005 B08007 B05002 B06002 B01026 B19001 B08007 B08005 D16006 12 R11000 B08011 B08007 B07002 B07002 R02000 B05002 B06002 B20011 B20012 B08007 B08011 D16007 10 R09000 B08011 B08007 R04000 B05002 B06002 B19005 B19006 B08007 B08011 D16008 11 R10000 B08001 B08007 B08023 R03000 B05002 B06002 B10002 B08023 B08007 B08001 D16009 11 R10000 B08011 B08007 B07002 B07002 R02000 B05002 B06002 B20041 B08007 B08011 D16010 8 R07000 B08011 B08007 B01022 B05002 B06002 B08007 B08011 D16011 17 R16000 B08011 B01022 B08007 R02000 B05002 B06002 B08021 B04001 B04002 B04003 B04004 B04005 B20090 B08021 B08007 B08011 D16020 5 B01023 B01025 B01027 D01011 D01012 D16021 23 D01023 B02041 B19001 B19007 B19005 B19006 B19008 B08005 B10004 B08005 B10004 B19007 B08005 B08021 B04075 B11040 B19007 R05004 B05021 B05021 R02002 B19003 B19004 D16022 23 B01032 B02041 B19001 B19010 R18000 B08021 B04014 B08005 D01023 B19005 B19006 B10004 B11041 B08021 B04075 B11040 B19008 R05004 B05021 B05021 R02002 B19003 B19004 D16026 2 D16020 D16021 D18001 2 D01025 B24011 D18003 4 D01026 B24005 B24004 B24021 D18004 6 D01025 B04023 B13011 B24005 B24004 B24022 D21001 6 B02101 B02114 B02105 B02106 B02107 B02121 D21003 4 B21051 B21014 B21017 B21030 D21004 4 D01031 B02003 R01000 D21003 D21005 12 B25004 B02121 B02122 B02123 B02124 B02125 B02126 B02127 B02128 B02129 B02130 B02131 D21006 4 B25001 B25002 B25003 B25005 D21007 8 B25009 B25010 B25011 B25012 B25013 B25015 B25016 B25017 D21008 3 B25006 B25007 B25008 D21009 2 B25018 B25019 D21010 13 B02101 B07002 B02102 B02103 B02104 B02105 B02106 B02107 B02108 B02109 B02110 B02132 B02133 D21011 3 B30031 B30032 B29002 D21012 2 R01000 B02135 D35001 4 B08035 B35001 B08036 D01001 D35002 4 B08035 B35001 B08036 B01033 D35003 6 B08021 B04001 B04002 B04003 B04004 B04073 D35004 7 B08021 B04004 B08021 B04004 B35000 D01001 B35011 D35005 7 B08021 B04004 B08021 B04004 B35000 B01001 B35011 D35006 7 B08021 B04004 B08021 B04004 B35000 B01003 B35011 D35007 9 B08021 B04004 B08021 B04004 B35000 B01001 R02000 B01002 B35011 D35010 3 D35002 D35003 D35007 dballe-5.18/extra/Makefile.in0000644000175000017500000002517211754230756013024 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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@ 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 = extra DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_flag.m4 \ $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/python.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FC = @FC@ FCFLAGS = @FCFLAGS@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBDBALLEF_VERSION_INFO = @LIBDBALLEF_VERSION_INFO@ LIBDBALLE_VERSION_INFO = @LIBDBALLE_VERSION_INFO@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LUA_CFLAGS = @LUA_CFLAGS@ LUA_LIBS = @LUA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ 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@ PKG_CONFIG = @PKG_CONFIG@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WIBBLE_CFLAGS = @WIBBLE_CFLAGS@ WIBBLE_LIBS = @WIBBLE_LIBS@ WREPORT_CFLAGS = @WREPORT_CFLAGS@ WREPORT_LIBS = @WREPORT_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ confdir = @confdir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ have_doxygen = @have_doxygen@ have_gperf = @have_gperf@ have_latex2html = @have_latex2html@ have_rst2html = @have_rst2html@ have_swig = @have_swig@ 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@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ tabledir = @tabledir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = \ aof bufr crex csv \ runtest \ test-bufr-table.txt \ test-crex-d-table.txt \ test-crex-table.txt \ test-repinfo1.csv \ test-repinfo2.csv 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) --foreign extra/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign extra/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): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: 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 clean-libtool 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-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 mostlyclean-libtool 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 clean-libtool \ distclean distclean-generic distclean-libtool 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-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am # 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: dballe-5.18/extra/bufr/0000755000175000017500000000000011716501143011753 500000000000000dballe-5.18/extra/bufr/README0000644000175000017500000000073111173330007012550 00000000000000This directory contains test data, at least one file per supported report type. Samples have been selected as the ones with less unset values in the available dataset. Some extra cases are there to test regressions; they are listed here: obs4-142.13803.bufr Contains a longitude of -100.230000, which in the past was converted to -10.023 because the internal storage space was not long enough to store the initial '-'. The dry bulb temperature had a similar bug. dballe-5.18/extra/bufr/obs0-1.11188.bufr0000644000175000017500000000030211173330007014224 00000000000000BUFRb 4}\@LdYt13577 LjKpF  A" A"!T EBd|Mo-6@`<< @1F4hѣF.4PXѪƫRZ7777dballe-5.18/extra/bufr/obs255-255.0.bufr0000644000175000017500000000022011173330007014227 00000000000000BUFR 8 !!!:P@@ &@ bIE@ǀ7777dballe-5.18/extra/bufr/bufr3.crex0000644000175000017500000000054511173330007013577 00000000000000CREX++ T000103 A001 D01036 B12015 B12014 D02024 B22001 B22011 B22021 B13031 B14015 B14031 B20063 B20063 B20063 B20063 B20033 B20031 B20032 B20034 B20037 B20038 B20036++ V2PJ6 000 000 1 2004 11 30 12 00 5410 01210 /// /// /// // //// /// // //// /// // //// /// // //// /// ///// //// //// //// //// //// // /// / // // /// //++ 7777 dballe-5.18/extra/bufr/obs4-144.4.bufr0000644000175000017500000000024211173330007014064 00000000000000BUFRb  4}Ky0Lv-EU4444 yjyFA A!8EU4444 o0bނgȡ@>,$_ hѣF͘F4h7777dballe-5.18/extra/bufr/obs4-145.4.bufr0000644000175000017500000000035611173330007014073 00000000000000BUFRb 4}Y#r8b82DPCV2RA VFN=>F?    " #   )AA!N2DPCV2RAJBNYR3RAk}Y2$L~V?7ѣF4hѣFѿ7777dballe-5.18/extra/bufr/bufr30000644000175000017500000000036311173330007012635 00000000000000BUFRb   4 }KyIGmV2PJ6 ytyF@$    ????! "%&$A' A'!`V2PJ6 [RXWcK4hѣZ4hѣF4hѣF4hѣF4h7777 dballe-5.18/extra/bufr/temp-gts2.bufr0000644000175000017500000001405011435242127014377 00000000000000BUFR([  4"WB`$O2W ~;E tFz;;_-&?4?^w,} $ Wz UJ  Pl l꯯! oJT ?4d!ʑD ʀ!f} n_W? {l/vgjdb L%%*ho*#8: ̕_U_@ @}@?@_Ӈ@u_O@_ @@,@6_g@@@r@^/@I_/_z+@} _@_ _Ȫ~i"@,_@/ZjK@To@.(_R@+@ _ k@ _ZS@_ ?@_@_ ;@~_ ">yc*4/DF ÀkgW`7B`YW?``k`g`q7A7ׁK`&Azr`f74L]w҂/KWBC`GG?B/`84`7`5'R4`1g/p.Ʀ6BW-W҂W`,p*ȃ&͂`$Gfrp C$">O^p7 &ɻ<_+G}om$c F)FeGEMDqmCBA`)@]>>1lWz U  ( { 54 ?  hd   P ZP   ( HttLʊ/?< #Lt?p}n_a ro\t/ ~Jk8)`< v//co{t9X*0`.+`Ogt)@*#8 L+ /^Пԟ@U@7@_@q@\_@EU@d_@?ˏ@w@x~_Rҹ@͟ __J@m_ ej`B@&"_2[@_걋_j@fT:@, ҡ@ @_@k_꠫@_@ _#@/_@ @'7777dballe-5.18/extra/bufr/temp-bad3.bufr0000644000175000017500000000025611526441417014340 00000000000000BUFRbe  4e}1Fli06260 1bFA A!@ (#푌G  ѣF4hѣF4h7777dballe-5.18/extra/bufr/synop-evapo.bufr0000644000175000017500000000472611433002757015047 00000000000000BUFR [  P "#"/>šq`%>t;O$O.X$T PO? n?>G?~DFBOLU g0 w YMy֗i،_oߣ?"*!*/9-i>JJ$O(X&GOpSH`?C L??"ҚJ 8b)d1/C4c.J$ 2'o a@~Ė@@@@@@@@@@@@@@@@` %VAM@,< d?>B?~DBALIKESIR _g0 \N`'Mvٿ?)`d P"U'H/Gf@ ~6@@@@@@@@@@@@@`' 6BGM4WϡP Rơ@ €aA:''1Gȗ)i *h*D ff𞓴пNݚ[!,k %q ?_~GۡOPc ~/PQSӒTRTTSQVQWAY/ &?ͭw? X(H@k{?Є+oߣ?"i)*/f¥Vp2d?^KO$O(&GOo`?] ?'R "Jq8a'o󽿇RHG,P;e$ P(M'lB  Kb0 H~@@@@@@@@@@@`= ]R%o-R R@@% #OO_>O0?e =IU4} 0uF5t BC BNTG/0%%`| L +JZ*r"*q8`):S?.1Kd 2??ߠ??W xߣ17777dballe-5.18/extra/bufr/obs4-142.1.bufr0000644000175000017500000000024211173330007014057 00000000000000BUFRb  4}Y0$8ktACA872  < 4FA A!8ACA872 A!+jpH hѣF4hF4h7777dballe-5.18/extra/bufr/synop-gtscosmo.bufr0000644000175000017500000000055411627722440015571 00000000000000BUFRlN  G  :Z#$/0%8+ *,A-.A2/L07 }x_`<#|x</>?<^h17777dballe-5.18/extra/bufr/gts-acars-uk1.bufr0000644000175000017500000000017611635347612015152 00000000000000BUFR~J    & $ L>@  4LH968 L-"EB)TԀ 7777dballe-5.18/extra/bufr/test-buoy1.bufr0000644000175000017500000000046211376727217014607 00000000000000BUFR2b  4}\P dv61691 2\Z\F # ADAD!x} epG2 ?g€g‚}saOOs|j+|[UsI>g€ˁI ۺ=b1-$՟$YUs= g€sjhhIYۺjY[sj՟$YIjs0UsI>0$ˀۺ1-ۺ՟ۺ՟ˀˀI>$+~~}OsO7jsۺ 55ˀ=btP$[0j7I>ۺ$Y՟Yˀ7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0 $I$I$RI$I$I$mmmI$I$I-mЊc*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[٣d$TȴдUUUU@UUUUUUUUUUUUUUPUUUUUQUU`g€ˁY 1-ۺ՟$$՟$aUsI>g€g‚}saOOs|j+|[UsI>g€ˁI ۺ=b1-$՟$YUs= g€sjhhIYۺjY[sj՟$YIjs0UsI>0$ˀۺ1-ۺ՟ۺ՟ˀˀI>$+~~}OsO7jsۺ 55ˀ=btP$[0j7I>ۺ$Y՟Yˀ7777dballe-5.18/extra/bufr/synop-oddprec.bufr0000644000175000017500000000033411433006516015341 00000000000000BUFRJ   P f2702/Pz;30p089 ?{G4+1?_??On/_~7777dballe-5.18/extra/bufr/gts-acars1.bufr0000644000175000017500000000025211635347612014530 00000000000000BUFRN    &)$<!"@  g B K L % ' M*+,-)>FA!:JEU5331 UG7&,>?f7777dballe-5.18/extra/bufr/bufr1.crex0000644000175000017500000000026411173330007013573 00000000000000CREX++ T000103 A001 D08003++ 44613 010 000 0 2004 11 30 12 00 6827 00968 ///// ///// //// // /// //// /// /// /// //// /// // // /// // // //// // // // 2809++ 7777 dballe-5.18/extra/bufr/temp-gts1.bufr0000644000175000017500000000253611435241731014404 00000000000000BUFR^   4QRC_`a=<# ֶ2t ?  *DGs*Da{];p *9*bW#U/ *h V+T;Α*tTSS,C|*h}RQDM- *PSOLaP*KJl`wQ*ȕsFE|*H;DC|xP6Q*lh7{-PӠ *Ms/%| *@ #-;#$P 8Q*h$sQ Q)㈖Q)XC B X)h_K G i)c[ZlQM ~Q)Hhzȼ#Qg ?)B薅.| 7($7с I(h2*=49QF['(ʼ56Q'xȖ*E6Q 'th26 '9JD &XQ&JȗB*ߊ]$TR %WZzE0WS c$|(к}5gXk>T9q"eB@FRvj xb\óRFaЙ N`Rb`      @cKzMhYH$ ϓ06|D +"iʕ6QQpmQmMm V ` M \\@B$B*#<-s0s>]F˞,\QD.xZe$~[;ߋG`pXiBȇ@)rwnxb$.3Yқ@OI'-m~=VKa4Ъf!a2 @PfP#e<à")\EmǤeNۥثa8$Luj׿\ѥbӤN1BE0K^[ͫÝE9?{ZTNƢpD>=D{t}9h"!M1.j/Rgn*MdC!%bH/N涏l wv:GL1,d5D߱W!~(dڐe!LƧcck5ZY.Hu \T-XUKvL l&qxKIit}So3^2C vžy( Wڗ\-fi[7sh{tp+x ?.Ę!*H`G1V&C!|q:f d jWl:,vi+7f=ƷI 2 8  C1GJTR▣챶'd#Ahʨ1Pq "}1)LdRFt` :\xNN5JΩbՋ À gɎ ͕(|UF.Dźy #$`mtq4΁tPq3NX՞$$` !dudeuuPe.Y0{&Xp(QNE)R#0D䔵Lգ DJ⌘"6KI%JܹoR +H#GoN˹{>pŀ ?o4/8 K B a QI$qn@ ((@(`$G /QÌ(c( rj,r8( I$`acj4-㊷3ۆQĒH Ɩ8bn㮼=eo(9` iC)&4㭺A`11aR²Ru%(Y9 Hd8`llPxx Ս4F C# 2X'!LBTMTj4siϯ  @f2\ǎ83疢dKSs@msr2]mrЫ}eM"qq˘ܷn^nݫvڴfqUN0@qD#Ǘ1i9~ժm\3bzJ&JXc#^C 0kX,5^ɫʖhbס6|$ 8t VI1EZϠol혨RjX4 :haBEDX`h   I ͉{7QYT=[f`@r% dmk^` ׳1x9B}Ձ6q^کכ%ݺOh3&PPL(`^# ] \2nVF<cD96>CG:FF;I5:A7# R~ha B7(gR.H`ze/*櫊ƱКj$=9EDMλO4BF<8 DRί07B%b0+z˅T0#9mFUWaVGa__@ΣD(&/nT ӭb!Ch>"2*ij3`N{}uInQ]l]TiTggK^P(˯&Tүhà@c3&iN0G VTϭ^33q^cisamneiZPS1˺7D23U a2:Ø* EMۋk|vW7BF7777dballe-5.18/extra/bufr/obs2-102.1.bufr0000644000175000017500000000175611173330007014064 00000000000000BUFRbf  4f}KyEYw+LDWR yyFĖA A!LDWR zS(g`ia7` kUP &jH}7Rs(H j7&S="@_pBh Nh)ƍal$~gcasc%R Pjc L8\  i D5!#ma@tZ<  :@[.,#Dw8s Rh>gL-}@[M?]@؉K $@#/ .} D._P/KJE9͂`_nX|?^`JB\@c?A ï$@V3a>=  @p8Cp8Äp hѣFbhѣF4ѣF4hFiQF.4hѥƍ4ѣR*4hѥƍ5(ңF\hѣK4iqF.4hѩF4hFJ4ѣO4hF>4hѣR*4hFJ4ѣK4ѣR*4hF.4hF.4hԣJ4ѣK4ѣK5(ңF.4hF.4hFJ4ѣK4ѣK5(ңF.4hFJ4ѣK4ѣR*4hF.4hF07777dballe-5.18/extra/bufr/bufr10000644000175000017500000000027111173330007012631 00000000000000BUFRb  4}KyH[%x44613 yylFA A !LW"-M(c4hѣF51F4hѣF4hѣF7777 dballe-5.18/extra/bufr/ed2radar.bufr0000644000175000017500000001341611173330007014240 00000000000000BUFR  < !!!    H>' K~hLЙ(@Xj˗/^{ bɓ&lٴhѣV[6lݻw9r˧Nvǯ^|@ PC$H"ŋ4hȑ"L2eJ.\&M6tϟB 4hҥJ:u*TVZիW^ŋlٳjիvܹr۷^~0aÇ,Xɓ&Lr͛>|4hӧNZkׯf͛vݻvÏ|߿>3]ߒFO3b  ?` ? ` @`@ ?1t`vU``S-``@  z p\ W)  \@]`WS@O``ؠ`[`Z`Z@:`W`` & `> @\l N`` ?W7{ @ZY`U1 R[|`]@^]@Vu@ ?4oz  DPZqf ` Ny`^@__Y @ܠY5 ``QtU V`7@xR/ o /@  6h 6<$ࠠ LX?8@U@R MIN@ `L  BD t ~j<L ` `L WZWw`4`X UT@N@ _$ P:ZB@.D N L L\`@@M-T@U` `O@J@(fH N 4h P``m , ` 0}} `4ww` `_?8q q `@<k,k `@g4g `_?Da@a` `@H]H] `LYPY `@PUXU `??TQ`Q` `@XMhM `\IpI `@`GvE `_?dC|C` `h?? ``l== `p99 ` t77` `__x53 `??|11 ` // `--` `+) `)' `@'% `__%# ` `??#! `!! `@ `` ` ` ` @@ `-@@  `  ` `@ `__   @`_O-@ _ `?? `@@?`Lr@ ?^Cq+n @@2]_@^n @x _= _w/`@\! wzn `@w _]xWs@@^)˭y{Wl `@@{ٗut@N `ùd E.nx `W [zz V@TrTL`bQg}yM1A j `@S W6uT21@@ j1k}{mWUC5?IO>`  `@յtt4UM O@ n7[GE=MEQA?h ``@tS TU1NK@ p.4=A3/-#b B @БQtR1n  %` % @ p+A=5-@Fz|  @nNp`OQONN N M@ ) `B`@@A@'@ f-/= %'@HLLLZH>B`  @`PrQ11NMͭ @ @ + k J@%e@ E@ &`@@ f-/7 %ΤҺ $fjrXt~ZnhF p8  a@@`2qPQ/o.@ `(` +@@Kl ˠ @I@I@C, G` )m) E%` @& @(@  f  "4(bv phJdf^|~̆TdFz @c  ) @@Gl )˫LEA@ $` @'@ `  zNd1(VpjTv؜tr `@ f@ @ LJL'@  J&PVp؀j z  @ ( $ EǫJiMH `'@   p *J.dnx. `@ G` %!$&hƆ` $@ `   r LNNbvt|*7777dballe-5.18/extra/bufr/obs3-3.1.bufr0000644000175000017500000003405011173330007013716 00000000000000BUFR8(  80?  I$I$I$I%$I$I$I$mmmmI$I$I$KmmmmPC!Lt%Kc\FSm|g[@ 1Е-sNoD2BT5τe:VutS R>[_C!Lt%Kc\FSm|g[@ 1Е-sNoN@ @ @ @ @ @ @ @ @ @ @ @H$ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWAAAAAAAAAAAAAAAAAAAAAAAAAAAAA@T_J"^3Yg}HIpTVVîٽZ_ht_[݂fP/1b"p*j$du+4N=}l@x6I>V'шWjZI=t/G'bB$,yolqM$1ÓP4&<9zQ݂Zؕgkgb0v6AQE`(HM}B~RSm,whJ*IU.0@9m]l7@`WLd-͌'""!aEw4&57*fXHPt&6W5Ǫ4y#`u7 xJGJ[ >> ;Deו7kQPu/Qm{5dH[Z9\(5AՆ*Roc %LYlq&zBgr'P6 M[C0Om3 U<3A7 ;,P^T3GP vJp|qbkFƠB/V!\K^i  ?+!^֥ AN(Xavb!\F6(R.O&\v-\?{4 !0SA +^0áz%8TT¬)^Kј~@ (/l .$/g`ޓr,3A>_ jW$1m~!`!y `2r7 2 ispϘE*8*5Q(1F 8nTy'3M%yay>rTh*R0׸Q,o%K MVE~bmx-+48Ng#s OWggJ*剪z)b. #0շ΋A0c#KUY7f)PCFQ΀I- (ӷ.cg%̴ Aax֦BPރ#K6K1 w+Յxaȸsګ/w_Y0~q;&nXL]m;qpEmt}ߛ7o_^< d)]#<+$^_H_qsH R03֋"dm1KB4MP y SekB JB6#!>t: E2 @U,!m_AUnm""8U[Zm2C-ȢT!Ck X.[? qQ|/^׵!S.ԍ q @0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `uqvI>m %h?!x1 2P.)Ɲnra!7D)s*ahB4-jR)71a *U 8TB %`:&X<@?3rƠpKT$@Î=t[QVy ͅ)8a@G~ 'jhE ?)%(“ɛ Rhª t hpCx-~WC2<Iջeù_񖟊,.!bhD Njj VjB1F#c @p `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0R-B(3Q I"BpwX5Ԋ\]P($ X+?X%94Ѕ/ ,IŒ`'Lҏ$: `êHB1(i_..Z53D(IAx: b]^^W'hj+v(;U|mzeʡSBjNԃ< I}j6]\1 .nrîk:Z P?ї CCR@TzbLy{ۄy@Ȇ%2A X G )8i%RSʽ%|XaP0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `00T Q?vL(Cg/?S# !XzQ9Lô{˘kb>I R}D>TGP`2n .e#,"KNC T '+4b4d,3sx َ/%x2<ثbXc|x  1qrŮM' kf 5j0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `ג)6>IzG_#:Y 䈖AGXXک?%lbA K2pZ9:UQVSi#C~Ҷt)nHs%mN@i3=XXz(*a^GQku;RI3ᬩ=exk~!ae|֙ZTq3I@%Ƀ#RXvx&F_'kWEAH4 Bш?%i^|bx/ p6V$?|M#3XW|߸jb(i7qb),CNs a;UiiW"(-~vAyRӀ=6 5 0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `i zb7,Ums􀾟OH 6<~KJB9`c9\xb {^09$Ez@ Ȕ%+C$Jz@%sٸN?%6é 3ItC(/Σbr1`SnX|&E@Ku]oa. s* hxb)tE5eYtZ! {l vP\`0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `X> llll􈤤(ٕEnڊ̰||`98UFbĩLMdM011Mu v )}a`E)}a)E}}aa~RnRyya)EEayyɕaaɕya9RnUU9qU9q٥}.~P  @0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `Bh1iii00iɘj2b2bڪx@yA@xyyzzڪBBAQ!QQQ!QP鉹QRRRRZYY)YYZY)“Z*Z+"SQ!Q!S!SIRR:8;q Ѣr:::j:ҡr1 @p `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0iȘ+mb.xJ3D IgF9" rU& 4Y0cRy6f™TA'ǃ$1AucF aD<E.D)3) 7iLFܒFRI8\XKyJ-cpDaV2˄\6 qHR0ƣqhf;`aP0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0.;+:lWy BBi ^6'IYDHDc6 @YzI ɲBf)|P"(8 cBFe {H*z2O8)ǒ:N:N"x6B6 d@Ѭ|RNz>!x>x4 c>b4KR%ɸg r2ȀQcX*p.dq@vP\`0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `a*{ptJc8&EhQ DH 1h$]-ɓy6': 10(D1T ;RO_wJOwqA"DȒ$/@W%GZ3'|)ѠV2|D r)E>_`9`my0/4&8hk1 /DU0WXbwD@ z _, 7|;HZމv  @0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `TK0Z qjQzd&nk&&yVIH|4e#R5XjUV4hѣF4hѣF4`7777dballe-5.18/extra/bufr/C23000.bufr0000644000175000017500000000423611432452756013341 00000000000000BUFRbe 4e}VD`k03882 X&F:D = >A A!A A(: s;03NHfCy,?80@eY/ 'k!dЁK6mdpRlYe\`_(Kxe3`l(`W$|9\ƫEXx?_4ѥƍ4ѣF\hѣK4ѣF4iqF.4hѧƍ4hF\hѣR*4hѥƍ4ѣK4iF4ѣF4iqFJ4ѣF4iqF.4hѥƍ|hѣF.4hѥƍ\hѣK4ѣK4iqFJ4ѣF4hF\hѥƍ4ѣF4hF\hѥƍ4ѣK4iqF4hF\hѩF4hF\hѣK4ѣF4hF.4hѥƍ4ѣR*4hѥƍ\hѣK4iqF4hF\hѣK4iqF.4hFiQF.4hF\hѥƍ|hѣFJ4ѣF4iqF.4hѥƍ\hѣO4hѥƍ\hѩF4hF\hѥƍ\hѥƍiQF.4hѥƍ\hѥƍ4ѣO4hѥƍ\hѣK4ѣK4jQF5(ѣFhѣFJ4hѣF4hѣF4`2/߿~~~߿~߿߿~~߿߿~((zD% j H(x M* HA`v<@r0ha2 އCQC"rXDoR4,S* E"qn^9WُfH NI4ir7777dballe-5.18/extra/bufr/temp-2-255.bufr0000644000175000017500000003255011465025232014176 00000000000000BUFR5hN   ,-9  P       5 } VZ(, JTxy#z*5uJ c7$ &lSTPf²+7uJ 5kpT PS!+8H uJ 4qT P?":8(uJ 328k2CT ($A 7uJ 1PjxT`%Aү* 7(uJ 0\*pTA 6 uJ E.l *ꮲj3Tۧ* 6(%uJ p,"ꮲlTp> 7H*uJ +Z$2ӇT+Vj 8/uJ )%#dPRb vJ @%K #&rd%E.+3 @hCvJ m#8!:cd(R. ? BHvJ !Dk>&d+4A޴kG CMvJ  {@kFr6d-3K CRvJ 4JFSd02K DhWvJ $+kFrFd3ưkG D\vJ Q+FrFd6P+C DHawJ z *kB2DCt9PƳ; CfwJ b+6r8t<{/ڳ+3 CkwJ &pt>b.Aڲ+@pwJ J3tApL-ڱk?uwJ (*qtC9ڰ>zwJ I1ӇtE&/Aڰ*>wJ ok#tHp1A=ȄwJ # 1܈stK`P =hwJ "*rΈÇtM߱* <(wJ  S ڭPp0 ;ȓxJ  *ҭ2cS0:xJ D jƬrU* :(xJ t X/Aҫj 9hxJ rS[@nAƫ* 9(xJ "j2^@Uª 9xJ z*󇄠aP<.ªj 8xJ 0ꢪ2Cdp"- 7趸xJ Xꚩzf-Ω* 7xJ :jn㇄ip. 6yJ #*h3k0Vj 6(ŸyJ 'jZm0{ 5ʸyJ )jzTӇp 0Bjw 5ϸyJ )nJ#rP0Bk 4HԸyJ 6)jBstp’*c 3ٸyJ Zc'^6Çv2j[ 3(޸yJ ~C(%jVr.y{BjW 2yJ #4#jR2,c{@Oi.O 2hzJ 4"J$}V&jG 2zJ $"jFrDB.*C 1zJ #:S 3/Vj7 0zJ 4&6r `!‚*3 0zJ Y(.󇤠1+ 0 zJ C)j&rC1’*# /zJ )*򐓇* . {J (ㇴϰB -{J K(rܑ3Ž* -{J 7))rΑД1i ,{J es)2ȑӇЗ2 ,){J S$))r#Й|) +${J C(()ޝsМNl2~*){J 3 'ҝ2ÇОW)*).{J ()ʜ1ĠС@0))3|J 3c(iqcĠФ+0i()8|J _#(鲚ĠЧ@B'=|J )1|ĠЪB'iB|J ߛ)qrSĠЬ /ši' G|J b)lĠЯ /ž&IL|J *)1bĠвp ưB)%Q}J ;*~\CԠд Bis%IV}J fڣ)rPԠз B)o %)[}J {(nNԠк 0i[$ `}J '^B3Ԡཐ vrW$ e}J &R:Ԡp b/fG#)j}J Պ&iF10ӇԠ@ NBji?"o}J KB&>(#Ԡ@ 9n3" t}J {&i2s %V#!Iy~J $i*1Ç B6) ~~J В"pM6i  I~J Z$) c@ -BV()~J *:&0ܘ0 .Bznpɍ~J X(hރV Ư(&0~J 'ƂdHS@̶f (~J %(#<@ F'(霸J #. /Fg0 J %(c.C bHIJ Dz'(0 pvH髸JMƂ'h~c& b.r@JoŢ'(&:3P Pr2ɵJĊ'i^ >~h2麸J2'节(RӇ ,Bh鿸JR(hL# BĸJb*vHs -¾H ɸJ>R-(^{cÈ` -gPθJj2.hR|" -愧]IӸJ".h>uc@ .B ظJR.6wa򝳈 ˮBg0 ݸJJ-:|$ .ʃgʀi⸁Jj+2|' S -®x縁J+Z+(&{g Ɓh츁JVJ-yf  Bg6 J{b/'rԟC ~.g& )JZ.r`ҟ p o.BgV8Jr0gv$ ^.C&'r`Jj4gv%3$ M-b~^X*J"Z7gue$ ?-}^`* JE8gtdӈ$ 0Æ|FPJn7rޡ#$0 -v{.H J6rܡs4 -^{'H jJ5grޡÈ4P Jzg&` J3pd΢4 .z'X #J1r&ܢc4" y` (J?1'q&֢4%0 ѬxP -Jh1odʣ4',x&P 2J2'zoẹSD* -wfX 7J1gnnȣD, vf` mh¤D6@ lsfҀ PJwZ.2mi¥3T8 _-Brƀ UJ1'*k瀸T; P"r&x jZJ2khӈT> ?2qf _J3'k(#T@ 002p *dJ#3'jsTCPJ!6ox iJL 3hÈdF 0Fnx jnJx 4h(dI Vn&~ JsJ 5fg(cdK Vlj xJ5&edN ⰃJk6P}J4&c%dQ 0C>j*PJ%3aSdS0>j&@JJQ 4&bftV 1Fif*pʌJ4bgtYp CNhf"J5&~`怄Ct\ 1RgePʖJ 5fr_%|t^ 0CZf`ʛJ"5b_&~ta z/^ep꠸J/*6&V_h3dp jfdꥸJ^26F^~f ]0rd%ꪸJc7f:^)|ӈi OzceސJ 7.]z#l B0rbe֐J6f]*xsn 3ZaeΠJ4\xÈr ">`eθJ;3e\xu` /C._%JøJo2e\-vcxp .^%JȸJ1Zr{.\*͸J1eZr~ஃ[ ҸJ1eYnS .Z׸J<j1%XjYܸJa1%X0h󈤡PXḊJ2WpfC.CBWjJ渊J6%vVdЈ.CW%g*븊J:e~Vod㈤.CXeZ J*>%QR3{XJE:A%B.l.&XcJJtRCe~: ӈ^BW JDz9 #SRW JE%z: sġIRW( JJE%~D2Èġ?NW]kJDvF6ġ05/JW$mJ%DnF8cġp*DJVd]kJHRDbF6ġ /DJUYkJlDeRD4ԡDFTMK"JDeJF6Sԡ  DFT'JZDeBI@ԡ@DFT$ ,JD%6I@ԡpDBS$  1JD%.Ha>C/DBRz6J~rD%"G<DBQz;JA}D%G< /DBQ$0@Jd}"De Hd>3p̯DFP@EJ|zDGc<¯DJOr0JJ{DF:ӈNNj8OJ{:E$E8#/VN$V(TJzEC4s!/bM2KYJyFB2É!rL&+^J@y3GdA0!@DvLd  cJgxG$=*c!ǐ0DjK#x+hJwFd6Հ!y0ZJc-(mJwCEd,!0nNIl rJv Dd"I S!ΐd0BH wJuC! !Y0>HbL|J#uCC$ʀ!`O0:GH끸JHtCr$C$!D:FD놸JqsCb#$1@9>E<닸JsCDdV$$1.0JDT됸Jr DF% 3$1P$0RD"P땸Jq Ed>$410ZC\ JqC E6%̀Ӊ41 0ZBd J4p E"% #410^B"T뤸J[pF$$s41bA"T멸Jo[F$ $É41`^@"@뮸JnE#ND11^?b0본JnE#cDAڱf>b@븸JmKF$ЀDA1~=I뽸J0lH$DAP1D<=¸JWkIc#STAD;9ǸJ{kSIc#TA1D:5̸JjIc#TA0D:b5ѸJjI"QCTA19bָJi{Jc$TdR 8E@ ۸J hJ"RdRD7(ถJ <h;K#v Q 3dR1D6帖J dgKf  tRtD6"(긗J gLV ӉtR jD5!(︗J f[NcJӀ #tR `14a8J eOc> stRT3a@J!d$P#. Éb`J2E 2HJ!<dK$Q#T b@2E1HJ!ec$Q#U cbp62E0XJ!c#$P b.2E /X J!b$P b%2 /!`J!b(PV Sb.a`J!a(Q"ր r 0-`J"a ,Qb 󉔡r"p 2,h!J"8`,QW Cr$,p&J"\_,R"W “r&"+x+J"~_{,R"W ㉤r("+!x0J"^,R" 3+02"*x5J"^k0RbW Ã-&):J"]0R Ӊ/ٳ*)!?J#]S4R #2PгE&(aDJ#7\4R"~ـ sġ43'IJ#\\C8QbvY Éġ6'aNJ#[Lˣo#`LJ'O80"Fr@3B$dLJ'8O0."JJCt2$`0LƸJ'bN$-bBH̓wp#xL˸J'N ,=z@1#h,иJ'M{ -b53|Ӱ#p,ոJ'M.1ƀ̓P0B"߰h,ڸJ( L0"-ӊ$ҁİ"`,߸J(3L 1"%#$҄C"h,丢J(^K1)s$҇`2C#h,鸢J(J,1"-Ê$Ҋ03C"߰h,J(JsJ+|B0$"CD0'F'0-CJ+B;($ycD N'0-HJ+A4%ԳT 3b'0-MJ, AC<&yTn' 0-RJ,4@<'"}STĠ n'(0-WJ,`@c4&գTP3Bj(D8-\J ,?0&yÀTC3v'_ 0-aJ ,?8'CT̰~'T8-fJ ,?H("u֓T B'0-kJ ->d'qCTӰ7Br&0-pJ -W=&bq3T۸Z'0-uJ -={$bC׃dڀ9B6)_0-zJ -<""ӊd8(0-J!-(^(-޸J"13tb€t# 87'(-㸧J"23Sx yct##`1@'(-踧J"2O2p bq޳t#&+6'^(-J"22l qBt3)$'(-J#22 St3-@(<8-J#21byߣt30'_ 0-J#31K"mt33>2&0.J#3T0qBCt36C ?2'(.J#30"q€t3:  '^(. J#30bu킀t3=`&޸ .J#3/"i€3t3@<&(.J#4&/SYB჊t3D B%^(.J#4\.]낀ӊt3GP%ި .J#4.]#t3J%ޜ .$J#4.$UstCNp%(.)J$5-8M€ÊtCQ%(..J$55-\@bM€tCTC$^(.3J$5l,8bEctCX`#(.8J$5,$5B㳊tC[B"ތ .=J$5,D)€tC^"(.BJ$6+$%BStCaB"(.GJ$66+4"!B䣊tCeC*"(.LJ$6j+<<%BtChP*!ޜ(.QJ$6*<"CtCkPA!ޤ(.VJ%6*(B哊tSoB ސ(.[J%7 *,b tSr0BA !^0.`J%7:)3tSu@!ި(.eJ%7l)$ꂀ惊tSxB !(.jJ%7)$,bBӊtS|!ޘ(.oJ%7(0!€#tSpC"ޠ(.tJ%8(|8"5stSpC#(.yJ%8A(,@")BÊtSD@"^(.~J%8t'H)邀tS{E"(.J%8'Xb-邀ctSu#^(.J&8'4d b-B賊tc qF"ބ .J&9 &l 1€tcpk#(.J&9B&l b5Stcf#(.J&9t&Ll "1B飊tcBa@#(.J&9%\ b)€tc]"(.J&9%@ )BCtcXÀ"޼(.J&:%l4 ")꓊tcTC@#(.J&::%4 "-tc0OÀ"(.J&:r$<"€3tcJD@~!^|(.J&:$DB냊tcEÀv!^(.J&:$, " 肀ӊtc@@v l(.J&;#"B#tcP<@ d .ĸJ&;?# €stcp7€ h .ɸJ&;l#d0 b Êtc 4C |(.θJ&;#$0 €tc0B!p .ӸJ&;"$ " Bcts,B@!(.ظJ';"$ bꂀts'!(.ݸJ'< "d8 肀ts@$@!^x .⸧J'!#tsFD /J'>:€sts`̀:d(/J'>p \BÊtsN:d(/J'>€tsJ:0 /#J'>`BctspJ^$ 7777dballe-5.18/extra/bufr/simple-generic-group.bufr0000644000175000017500000001601011535436671016622 00000000000000BUFR$V@Y[\X[\] 7777BUFR$V@Y[\X[Y][[=[\XA3<Si0~7777BUFR$V@Y[\X\X[>Y[\XA3!P[ @7777BUFR$V@Y[\X[ Y]Hۙ\H?Y[\XA3a:7777BUFR$V@Y[\X\?[\XA3wkK# }P7777BUFR$V@Y[\XܜY[@Y[\XA3fR1P7777BUFR$V@Y[\X]XY@[\XA3aFR+#P7777BUFR$V@Y[\X\[]H@[\XA3&V40P7777BUFR$V@Y[\X]^HA[\XA3TK0~7777BUFR$V@Y[\XY^\H[\XA3URD @7777BUFR$V@Y[\X[ [ۚ[[\XA3UwRH`7777BUFR$V@Y[\X\[[Y][\XA3FE@ 7777BUFR$V@Y[\XܛZY[HY[\XA3S4߀ 7777BUFR$V@Y[\XX[Y[\XA3E" 7777BUFR$V@Y[\X\[ݛH[\XA3o,07777BUFR$V@Y[\X\[]H[\XA3LbR+2@7777BUFR$V@Y[\X[۝Y[ܚ[[\XA3>-B7777BUFR$V@Y[\XY]HH\Yۘ[[\XA3j&Ӑ7777BUFR$V@Y[\XZ\[HY[\XA3tx7{7777BUFR$V@Y[\X[][\XA3cL}7777BUFR$V@Y[\XYHY[H[\XA38MЇ7777BUFR$V@Y[\X\\H[\XA3!O 7777BUFR$V@Y[\X[X[\XA3@7777BUFR$V@Y[\X\[^[[݈Y[\XA37777BUFR$V@Y[\X[[XH[[\[\XA3n:( 7777BUFR$V@Y[\XY[H[HۙH[\XA3[=>-7777BUFR$V@Y[\X\[ܙ[HY[\XA3FRI7777BUFR$V@Y[\X[ܘX[[\XA3S_2PP7777BUFR$V@Y[\X[YX[H$Y[\XA3)Jё*7777BUFR$V@Y[\X[\[Y\H|[\XA3fIN}7777BUFR$V@Y[\XZ\X[|[\XA3o,B- 7777BUFR$V@Y[\XHYH [\XA3Nc;PP7777BUFR$V@Y[\Xܛ([\XA3z'47777BUFR$V@Y[\XY[H)[\XA3u0 ` 7777BUFR$V@Y[\XXZX]X)Y[\XA3bR#@7777BUFR$V@Y[\X\H)[\XA3zR%Ї7777BUFR$V@Y[\X]^[.Y[\XA3\R'cp͠7777BUFR$V@Y[\XYY\[.[\XA3fx"E7777BUFR$V@Y[\XܝYۛ.[\XA3s$/P 7777BUFR$V@Y[\X\]X/[\XA3]<$p7777BUFR$V@Y[\X[\[X[/Y[\XA3a3Љ7777BUFR$V@Y[\Xܝ[HH\H Y[\XA3i6b07777BUFR$V@Y[\XZ[Y3ę[\XA3th'`7777BUFR$V@Y[\X\Y[HD\[\XA33fRI7777dballe-5.18/extra/bufr/synop-longname.bufr0000644000175000017500000000252611523766060015535 00000000000000BUFRQ  #P"&1 0/( d `MA?C\{UMP dtP(0xS2 `';{+bhh!J>d5嵩>i# @C0@2?:02(292:6741:2:2/( *_ A3Cf\ 4u(`oO;ܑXX[G,3; 'e!'xK?2:ǔ0O@'osJl.Md"vkBPrׂWhc'?BHU@/:V72vσ Kwh7{Kkj_8?!$ @%񞲛+;+![c+c+bg*,UL ??I}|_y2~?_7777dballe-5.18/extra/bufr/obs1-140.454.bufr0000644000175000017500000000026211173330007014230 00000000000000BUFRb4}aE0bOLEIB  F  A A!DLEIB _XA ˀ 9@#2' b4hѣF4hѣF6lhѣ7777dballe-5.18/extra/bufr/gen-generic.bufr0000644000175000017500000025502611173330007014744 00000000000000BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  e ^2d dD?W@ ?,(ј@}VLFVjɐ5* 2d Lɐ2d ] T( %?R @" `N H ?K#)z7777BUFR&   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  I 2ddD?W@ ? ј@|LFVɐ5(x 2d |ɐ2d l u Te2d,dB0Q@ PAdL @@P}de 3 ,?`7777BUFRr   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!!P  ] 2ddD?W@ ?Lј@|LFVɐ5|( 2d Lj$gFR Z,D}d7777BUFRr   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!!P  e X2ddD?W@ ?Lј@{4(@FVɐ5) B Lj"@JWFR\dm7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  9 2ddD?W@ ?  ј@~vLFVɐ5( 2d 2ɐ2df Q Te2d,2dB@v PdqFR%u37777BUFR   !!! !!!!!!!!!!!! ?!!! =!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  d*fLɐ ]2d$W@2d`F@Xɐ5v2d( |ɐd Q Te2d,dB@G P}FRB"7777BUFR$   !!! !!!!!!!!!!!! ?!!! =!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  d*'vLɐ ]2d$W@2dF@0ɐ5{2d( 2ɐ2dr m Ti2d,2dB@d P(AdL @@!}de 4)T07777BUFR   !!!!!!!!!!!! ?!!! =!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  ) 2ddD?W@ ?ѥ2d \` U@2d&l@dUl (/BNd7777BUFR&   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  ݓ 2ddD?W@ ?lј@|LFVɐ5q*X d dɐdr ] Te2d,2dB0m` P(AdL @@;}de 3LW7777BUFR   !!!!!!!!!!!! ?!!! =!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  M 2ddD?W@P ?,ѥ2d ` %d&̙@dUL (﬌pP<T7777BUFR&   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD?W@ ?Lј@}LFVɐ5~*D 2d 2ɐ2dr e Te2d,2dB@Z P AdL @@L}de 3YO7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  i 2ddD?W@ ?,ј@|LFVɐ5( 2d ɐ2d T Q Tid, ,2N h`7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P   2ddD?W@P ?,ј@}LFVɐ5r* 2d 2ɐ2d T ] Te2d, ->2Z X07777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  ) 2ddD?W@ ?,ј@|LFVɐ5( 2d ɐd T Q Tf2d, /2ۡ !٘p7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  ͓ 2ddD?W@ ?,ј@|LFVɐ5( 2d ɐd T Q Ted, 1>2߉ ) 7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  - 2ddD?W@ ? ј@}LFVɐ5y(( 2d ɐ2d T Q Ted, 426 +Ѩ 7777BUFRr   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!!P  ɓ 2ddD?W@ ?,ј@|VLFVɐ5l) d Lj$gFR<';m87777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P   2ddD?W@ ?lј@|(@FVɐ5*l B ɐ2d T Q Ted, 72߉ =7777BUFR   !!!!!!!!!!!! ?!!! =!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  % 2ddD?W@ ?Lѥ2d f 2d' ,@&@dU d @}PdR@f#Ҽ`7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  E X2ddD?W@ ?,ј@|4(@FVɐ5(< B dɐd Z ] Ted,2dB PpFR5a J7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  ! 2ddD?W@ ?,ј@|LFW&ɐ5(< 2d 2ɐ2d Q Te2d,2dB@Q@ PFR4oA )$7777BUFR   !!! !!!!!!!!!!!! ?!!! =!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  d*2L`ɐ ]2d$W@dF@pɐ5u2d) ɐd T Q Tg2d, >2t Y7777BUFR   !!! !!!!!!!!!!!! ?!!! =!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  d)L@ɐ ]2d$W@B@F@ɐ5S2d)  2ɐ2d Q Ted,2dB@ P`gFR3'!"0 7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  !B*dD?W@ ?,ј@|VLFVɐ5( 2d ɐ!B T Q Ted, I>2 +i 7777BUFR   !!! ?!!! =!!! 3!!! !!! !!! !!! !!!|P  ]d0? d4LtR TL EIDՀ7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD?W@ ? ј@|fLFVɐ5* d ɐ2d T Q Ted, J >2 +i`7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  X2ddD?W@ ?Lј@|LFVɐ5(P d ɐ2d T Q Ted, J 2o /G7777BUFRr   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!!P  2ddD?W@ ?,ј@|LFVɐ5( 2d Lj$ gFR/"}$7777BUFR   !!!!!!!!!!!! ?!!! =!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD?W@ ?lѥ2d Y U2d&@&@dUL @L("`F*@P*YH  07777BUFR&   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD?W@ ?ј@|FLFVɐ5( 2d ɐ2d ] Te2d,dB@M P(AdL H@@}de 2(KրQ7777BUFR   !!!!!!!!!!!! ?!!! =!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD?W@ ?,ѥ2d b  2d&@dUl (`o]L,(7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD?W@ ? ј@|LFVɐ5(( d ɐd T Q Ted, _2| 8n7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD?W@ ?,ј@|6LFVɐ5( d ɐd T Q Ti2d, g>2Q [XP7777BUFR&   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P   2ddD?W@ ?,ј@|LFVɐ5( d ɐ2d T ̙ m Th2d,dBԀ P(B2dL@@!}de 2]KnP2`7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  y 2ddD?W@P ?,ј@|6LFVɐ5) d 2ɐd T ] Ti2d, l>2B (\@+7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P   2ddD?W@P ?Lј@{LFVɐ5(( d |ɐ2d Z ] Ti2d, p218 *e)`7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P   2ddD?W@ ? ј@|LFVɐ5v(( 2d ɐd T Q Ted, s>2B B7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  I 2ddD?W@ ?,ј@|fLFVɐ5( d ɐ2d T Q Tfd, t2-P L_7777BUFR&   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  Փ 2ddD?W@ ?,ј@|LFVɐ5( 2d dɐ2d U Te2d,2dB@Q@ P@B2dL @@+}de 2U[4@7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P   2ddD?W@P ?lј@|&LFVɐ5) d 2ɐ2d Z ] Ti2d, w>2" .!7777BUFR&   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD?W@ ?,ј@|VLFVɐ5( 2d ɐ2d Z ̙ m Te2d,dB PB2dL H@@.}de 2.ey5 7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD?W@ ?,ј@|fLFVɐ5( d ɐd T Q Tf2d, z2? 7$@7777BUFR&   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD?W@ ?Lј@|(@FVɐ5)T B ɐ2df ̙ m Tf2d,dB P(B2dL @@0}de 28rZP27777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  Փ 2ddD?W@P ?,ј@|LFVɐ5( 2d dɐ2d Z e Ti2d, ~>2j @X7777BUFR   !!!!!!!!!!!! ?!!! =!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P   2ddD?W@ ?lѥ2d Y Z@2d&@dUL ( @oGUX7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P   2ddD?W@ ?lј@|LFVɐ5( 2d ɐ2d T Q Ted, >2] U7777BUFR   !!! !!!!!!!!!!!! ?!!! =!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  d*/L0ɐ ]2d$W@dpF@tɐ5k2d(  2ɐdR ` Q Thd,2dB01` PpWFRA) 7777BUFR&   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD?W@ ? ј@{LFVɐ5), d 2ɐdr L ] Te2d,2dB0v P(AdL @A!8}de 1L=7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  i 2ddD?W@ ?lј@zLFVɐ5), 2d ɐd T Q Ti2d, >2A c.7777BUFR   !!!!!!!!!!!! ?!!! =!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  A 2ddD?W@ ?,ѥ2d ] i@2d&@dUL ('3V2 7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD?W@ ?Lј@|LFVɐ5( 2d ɐd T Q Tg2d, >2e pa7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  ٓ 2ddD?W@ ?lј@|FLFVɐ5) d ɐd T Q Tg2d,  >2$ c\h 7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  1 2ddD?W@ ?,ј@}LFVɐ5) d ɐ2d T Q Tg2d, "2 uC7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD?W@ ?lј@|LFWɐ5e( 8d ɐd T Q Ted, #>2 [@7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  y 2ddD?W@ ?,ј@{LFVɐ5n* d ɐ2d Z m Tf2d,2dB@ PwFRa&=7777BUFR&   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  = 2ddD?W@ ?Lј@{t(@FWɐ5n* B 2ɐd ] Ted,2dB@> P0AdL @AH}de 0j[47777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD?W@ ?Lј@zLFVɐ5x( 2d |ɐ2d T ] Thd,dBԀ PFR A&7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  Փ 2ddD?W@ ?Pј@{FLFW,ɐ5u) $2d 2ɐd T q Ti2d,2dBԀ P@FR!*b7777BUFR&   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD?W@ ? ј@{LFVɐ5) C2d 2ɐdR m Te2d,2dB@> P(AdL @AL}de 03`7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD?W@ ?,ј@{6LFWɐ5x) d ɐ2d T ̙ m T( %R " ` H  hBk#)aݨ7777BUFR&   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD?W@ ?Lј@{(@FVɐ5(d B ɐ2d Z ̙ m Te2d,dB P0B2dL @AP}de 0z(03`7777BUFR&   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  ѓ 2d dD?W@ ?,ј@|LFVɐ5(d &d Lɐdr e Te2d,dB@v P(AdLYt@AR}de 083`7777BUFRB    !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  ɓ 2ddD?W@ ?Lј@y(@FVɐ5( 1!B 2ɐ2dR m T( %2dR " `sH02'2dV )20b 'W$7777BUFR&   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2d dD?W@̙ ?Lј@{LFVɐ5( !d 2ɐdR U Ti2d,2dB@5 P(B2dL @AT}de 0SP77777BUFRB    !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2d dD?W@̙ ?Lј@{&LFVɐ5)h d dɐ2d& L U T( %2dR" `2H12'x2dV!02= !7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  u 2ddD?W@ ?,ј@zLFVɐ5( $2d Lɐ2dR m T( %R @" ``H C#)`7777BUFRT  * !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! P  u 2ddD?W@ ?,ј@{4(@FVɐ5( )!B LɐdR l q Ted,dB0-L PAdLF&@L %PGFR1( 7777BUFRT  * !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! P  I 2ddD?W@ ?,ј@yLFVɐ5) d Lɐd l Q Tf2d,dB8&&L PC2dLlF&@L :7FRa +*7777BUFR:   !!!!!!*!!! ?!!! =!!! 3!!! !!! !!! !!! !!!P  ɓ 2d^ Gt+&@)4f ɓ 2d _ Z,(~z8@7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  ɓ 2d dD?]@?W@l ?ٓ ј@{LFVɐ5z( d ɐ2d T Q Tf2d,23@7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  } 2d dD?]?W@̙ ?̙ ј@|6LFV2ɐ5( d ɐd T Q Tf2d,dB P@?FRu-CT7777BUFR  !!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  K&@@tf]ɐ`  '5$i@bX8k&@%(I $&@( 2HՓ 0;c&@h b3#)/87777BUFR&   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2d dD?W@̙ ?ј@|LFVJɐ5( d ɐ2df l ] Tf2d,dB0v P0@2dL@(!}de 7?Rw5`7777BUFR   !!!!!!!!!>!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  5 2ddDGUh- #t d3OɐHҀ Y20LP2VLjxDJ2d* L0?FRr)U!:v7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD?W@ ? ј@|LFVzɐ5~( d ɐ2d T Q Ted,2dBK PP@FRq}!-L7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  ɓ 2ddD?W@ ?ј@|fLFVzɐ5( d ɐd T Q Ted,dB P`@FRp!4u87777BUFRF   !!!!!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!!P   2dW@?U? ј@|LFVɐ5~( d >2i(@7777BUFR:   !!!!!!*!!! ?!!! =!!! 3!!! !!! !!! !!! !!!P  2d] Gt3&@)4f - d _@ <̙(oDT7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD?W@ ? ј@|LFVɐ5x) d ɐd T Q Ted,dB P@WFRq>"%X^7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P   2d dD?]@?W@ ?  ј@}LFVVɐ5) d ɐd T Q Th2d,2J[X07777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!!P  2d-dD?]?W@ ?ݓ ј@~6LFUɐ5w)@ d L&@  P@FRs''t7777BUFRF   !!!!!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!!P  #2dW@?U?̙ј@~6LFUɐ5{) 2d .2'I9h7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD?]?W@ ?ٓ ј@{vLFV~ɐ5)@ d ɐd T Q Ted,dB@ P@FRm-Mx67777BUFR   !!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  q 2dQdD?W@2 O0l(a kS@)d@RdBdDFd@ [h}de 8(i: 7777BUFR,   !!!*!!! ?!!! =!!! 3!!! !!! !!! !!! !!!P  M \?WAY2 O0 (a kQ@3d@(|}de 6zP57777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD?W@ ?ј@{LFVɐ5( d ɐd T Q Ted,dB& PA7FRl([K07777BUFRT  $ !!!!!!!!!>!!!!!! !!!!!! ?!!!!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD  GU&@- #t t tLF` Y2 PZ+&@:`>ɐ*&@jɐ-P/( FLPɐ ɐ)@P @_YH ;Tt 7777BUFRF   !!!!!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!!P  ,2dW@?U?̙ ј@|LFVxɐ5) d A >2ziU07777BUFRL  $ !!!!!!!!!>!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! P  2ddD GU #t d3OzɐHҀ ˙2`LP26Ljy DKd* LLC-PJ#dL  (`﬌/R?T7777BUFRF   !!!!!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!!P  œ 2dW@?U?  ј@{LFVɐ5) d E >2^ )07777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD?]@?W@ ? ј@|VLFVɐ5) d ɐd T Q Tf2d,G>2w@ ?7777BUFRF   !!!!!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!!P  2dW@?U?̙ ј@|LFVɐ5) d I>2jI h7777BUFR@   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  œ 2ddD?]?W@ ?̙ ј@|6LFVɐ5)@ d ɐ2d T ̙ ] Ted,dB P0@2dL@(}de 6ʱ47777BUFRt   !!!!!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!!P  2dW@?U`?̙ ј@|LFVtɐ5) d d TN2nLi7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  ,2d dD?]?W@l ?̙ ј@}FLFV2ɐ5~( 2d ɐd T Q Tg2d,P>2w@ 7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD?]?W@ ?  ј@|LFVɐ5( d ɐd T Q Ted,Q2f) 87777BUFRF   !!!!!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!!P  A 2dW@?U? ј@}fLFVpɐ5) d T>2c À7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P   ,2ddD?]?W@l ?̙ ј@}FLFVZɐ5) d ɐ2d T Q Tg2d,2dBK PBFRpu%(7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  5 2ddD?W@ ? ј@}D(@FVtɐ5( B ɐd T Q Tf2d,dB PBFRne%fp7777BUFR   !!!!!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  U ^2dW@?U`?  ј@}LFVNɐ5( d dd,J$RQhV@n`e7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  a }2ddD?]@?W@ ?̙Փ ј@}LFVɐ5( d ɐd T Q Ted,\2|" 8 7777BUFR   !!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  !BdD?W@Y2 P 0挙(= jS@Rd@dBD @ dk}de 7{037777BUFRX   !!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!!P  t x]d0? 2d4&LXtHU Td Td2W\P7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD?]?W@ ?  ј@{LFVɐ5( 2d ɐd T Q Ted,k>2O_7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  ٓ 2ddD?]@?W@ ?̙ ј@{LFVtɐ5)@ d ɐ2d T Q Ted,2dB PCWFRi, &7777BUFRF   !!!!!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!!P  2dW@?V? ј@|LFVɐ5}) d u2Fl M(7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD?W@ ?̙ј@|6LFVɐ5( d ɐ2d T Q Ted,2dB PCFRg !е7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  i 2ddD?W@ ?ј@|&LFVɐ5) 2d ɐd T Q Ted,dB P`CFRhKM"2]7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  I 2ddD?]?W@ ? ј@|LFVlɐ5) d ɐd T Q Tg2d,|>2Y h7777BUFRF   !!!!!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!!P  2dW@?U?̙ ј@}LFVɐ5), d ~2Di+7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  œ X2ddD?]?W@ ?̙ј@|LFVɐ5( d ɐd T Q Ted,dBK PPCFRh1A$J7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD?]@?W@ ?ٓ ј@}FLFVɐ5), d ɐ2d T Q Tg2d,2Vl&7777BUFRF   !!!!!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!!P  2dW@?U? ј@}LFVzɐ5), d >2C*,7777BUFR8   !!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!!P  Q t x]d0? d4LtM U T03I7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD?]?W@ ? ј@}LFVzɐ5) d ɐ2d T Q Ted, >2A 1`7777BUFRf   !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!!P  M 2d?,(ј@uLFV"ɐ5x) 2d 92!MR762HO7777BUFR$   !!!!!! !!! ?!!! =!!! 3!!! !!! !!!P  = 2dW@?U`?ѓ ј@}LFVrɐ5u!>2M 4](7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  œ 2ddD?W@ ?Lј@~(@FVɐ5), B 2ɐd Q Tg2d,2dB@B@ PDGFRlw&S7777BUFRF   !!!!!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!!P  2dW@?U?̙ٓ ј@~VLFVVɐ5)@ d #2Vl?Yp7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  u 2ddD?]@?W@P ?Փ ј@}LFVlɐ5( d ɐ2d Q Ted,$2H @*p7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD?W@ ?ј@{&LFVɐ5( d ɐd T ] Ted,dB PDFRgғF7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  U X2ddD?]@?W@ ?  ј@{FLFVɐ5) d ɐd T Q Ted,&>2.h``7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD?W@ ?̙ј@{6LFVɐ5), d ɐd T ] Te2d,dBԀ P DFRdp7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  ɓ 2ddD?]?W@ ?̙ ј@{LFVɐ5), d ɐd T Q Ted,)>2B7777BUFRF   !!!!!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!!P   2dW@?V?ٓ ј@{fLFVɐ5( d )2!@7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  ! 2ddD?]?W@ ?̙ݓ ј@{LFVɐ5) d ɐd T Q Ted,+>22(1p7777BUFRF   !!!!!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!!P  ] 2dW@?V`?ݓ ј@{LFVɐ5)@ d ,>2z !p7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  œ 2ddD?W@ ?ј@|FLFVɐ5( d ɐ2d T Q Ted,2dB PEFRer!! e7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  } X2ddD?W@ ?lј@{LFVɐ5)h d ɐdf ` ] Ted,dB0 PEFRd 7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD?]?W@ ?Lٓ ј@|VLFVɐ5) d ɐd T Q Ted,/>2, 7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!!P  2ddD?]?W@ ?Փ ј@|LFVɐ5( d Lj"FFRd"7777BUFRF   !!!!!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!!P  ) 2dW@?V?lј@|LFVvɐ5) d 1>2E# 7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!!P  A 2ddD?]?W@ ?̙ ј@|LFVɐ5w) d Lj"pF7FReM$ ~7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!!P  2ddD?]@?W@ ?Փ ј@|vLFVɐ5~) d Lj"FGFRcY$[7777BUFRF   !!!!!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!!P  2dW@?U`?̙ݓ ј@}LFVɐ5( d 3>2(O)07777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!!P  ~2ddD?]?W@ ?ѓ ј@|LFVɐ5) d Lj"FwFRciI%K7777BUFRF   !!!!!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!!P  a 2dW@?U@?ٓ ј@}LFVɐ5}( d 42:7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD?]?W@ ? ٓ ј@}vLFVɐ5v( d ɐd T Q Ted,dB@ PFFRe &7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P   2ddD?]?W@P ? Փ ј@}(@FVɐ5y( B ɐd Q Ted,6>2,707777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  ~2ddD?]@?W@ ?ٓ ј@}fLFVɐ5y) d ɐd T Q Ted,621Ci7ҘP7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  } 2ddD?]@?W@P ?ݓ ј@}LFVɐ5~) d ɐd Q Te2d,7>2,9  7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  u 2ddD?]?W@ ? ј@}LFVɐ5|( d ɐd T Q Ted,72(O:C7777BUFR  ~ !!! !!! ?!!! =!!! 3!!! !!! !!!zP  t x]d0? d4LtvIXڀ7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  X2ddD?]?W@ ?̙Փ ј@}LFVɐ5(x d ɐ2d T Q Tg2d,2dB PG'FRd(27777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  % 2ddD?]@?W@ ?  ј@}LFVvɐ5( d ɐd T Q Ted,:>20s F7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P   2ddD?]?W@ ?L ј@{fLFVɐ5|)@ d ɐd T Q Ted,:2j7777BUFR&   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P   2ddD?W@ ?,ј@{4(@FVɐ5) B ɐdf l Q Ted,dB0 P@2dL!4@)y}de 65 7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!!P   2ddD?]?W@ ?L ј@{fLFVɐ5z) d Lj"GFR_ IR7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  ɓ 2ddD?W@ ?lݓ ј@{FLFVɐ5) d ɐd T m Te2d,dB P HFR^!T&7777BUFRF   !!!!!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!!P  M 2dW@?U?ѓ ј@{LFVɐ5)T d B>2oh 7777BUFR   !!! !!!!!!!!! !!!!!! ?!!! =!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  d*>vL0ɐ t x]!B$W@dvLF@~ɐ5bd)|  ɐd Z ] Ted,ՀC2hMp7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!!P  2ddD?]?W@ ?ٓ ј@{vLFVɐ5p), 2d Lj"HFRa`u #Z7777BUFRF   !!!!!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!!P  ^2dW@?U?  ј@{(@FVɐ5)T B ـE2. ]'7777BUFRF   !!!!!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!!P  2dW@?U?ݓ ј@{LFVɐ5)T d G>2j @'p7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD?W@ ?̙ј@{LFVɐ5( d ɐd T ] Ted,dB PpHFR]N x7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!!P  2ddD?]?W@ ?  ј@|FLFVɐ5) 2d Lj"IFR_!8n7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!!P  ^2ddD?]?W@ ?Փ ј@|fLFVɐ5( d Lj"IFR_ "fs7777BUFRF   !!!!!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!!P  2dW@?U? Փ ј@{LFVɐ5z)h d I>2 I>7777BUFR>   !!! !!!!!!!!! !!!!!! ?!!! =!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  d**Lɐ t x]2d$W@dF@fɐ5e2d*  ɐ2d Q Ted,dB@> P@2dL@)}de 6-07777BUFRF   !!!!!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!!P  ͓ 2dW@?V? ٓ ј@|vLFVɐ5(x d J>2ω'7777BUFRF   !!!!!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!!P  2dW@?U?̙Փ ј@|fLFVɐ5x)h d K>2 +2@7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!!P  % ^2ddD?]?W@ ? ѓ ј@|LFVlɐ5(x 2d Lj"IwFR^y#h7777BUFRF   !!!!!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!!P  u 2dW@?U`? Փ ј@|LFVɐ5( 2d L>2i'#7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!!P  2ddD?]?W@ ?Փ ј@|(@FVɐ5( B Lj"PIFR_#%S%<7777BUFRr   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!!P  2ddD?W@ ?,Փ ј@}D(@FVɐ5( B Lj"pIFR^%D7777BUFRl   !!!!!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!!P  m 2dW@?V?̙Փ ј@}LFVɐ5) d FLER(;@o K7777BUFRr  !!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!!P  5#&@@th]ɐ` 'h$i@b̙Vk&@Z(A Z( d #)t7777BUFRr   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!!P  i 2ddD?W@ ?̙ј@}$(@FVɐ5}( B Lj"IFRaFm&=7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!!P  u 2ddD?]?W@ ?lՓ ј@}&LFVɐ5( d Lj"IFR^mA&L7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!!P  2ddD?]?W@ ? ѓ ј@|LFVɐ5( d Lj"IFR]h'7777BUFRf   !!!!!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!!P  2dW@?U?ٓ ј@}FLFVɐ5{( d Lj"JFR`!'b}7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD?]?W@ ?̙ٓ ј@}VLFVɐ5y( d ɐd T Q Ted,Q2 DP7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!!P  Փ &2ddD?]?W@ ? ѓ ј@|LFVɐ5( 2d Lj"0JGFR]=)xX7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  2ddD?]@?W@P ?l ј@zLFVɐ5) d ɐdr ] Te2d,S>2/ߺ%7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  ] 2ddD?W@ ?Lј@{VLFVɐ5), d ɐ2dr ] Te2d,dB@k P`JwFR[ԫ 7777BUFR@   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P   2ddD?]?W@ ?l ј@{LFVɐ5y)T d Lɐd Z ̙ a Te2d,dB PAdL H@*}de 5=`7777BUFR&   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  } 2ddD?W@ ?lј@{LFVɐ5( d ɐdr l ] Ted,dB0Z PAdL H@*}de 5)0H7777BUFR,   !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!!P  2d?lٓ ј@|LFVɐ5w* 2d W2Hh 7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!!P  ,2ddD?W@P ?,ј@g&LFUxɐ5W)| ;2d ɐ2d& ( J *h7777BUFRF   !!!!!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!!P  2dW@?V ?l ј@{LFVɐ5z) d Y>2IH("7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  Փ 2ddD?]@?W@P ?lٓ ј@{6LFVɐ5n)@ d ɐd T ] Te2d,Z>2}h;07777BUFR    !!!!!!!!!>!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  E &2ddDGU #t d3OHҀ 22(@P 26L DKd* L6LF0JT( l@kCأ7777BUFRF   !!!!!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!!P  2dW@?V ?ѓ ј@{LFVɐ5w* 2d  \>2i.7777BUFR   !!!!!!!!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!!P  ͓ 2ddD?W@ ?,ј@uFLFV,ɐ5x) .d 32!RD<2Nh]Q7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!!P   R2ddD?]?W@ ?̙ݓ ј@|t(@FVɐ5*X !B Lj"KFR[)!|7777BUFR   !!! !!!!!!!!! !!!!!! ?!!! =!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  d*:&Lӈɐ t x]2d$W@2dVLF@ɐ5_2d* ɐd T Q Ted,]2Z R7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!!P  œ 2ddD?]?W@ ?ٓ ј@{LFVɐ5{( d Lj"@KFRYm"}7777BUFRD   !!! !!!!!! !!! ?!!! =!!! !!! !!! !!! !!!P  B*9vLɐ]W<W@dvLF@fɐ5]!B)  _2ӭ S7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!!P  - ,2d dD?]@?W@ ?lՓ ј@|vLFVhɐ5(< d Lj"LFR\~u#d[7777BUFR8   !!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!!P  t x]d0>̙ݲd4vLtC ) THDL7777BUFR   !!! !!!!!!!!! !!!!!! ?!!! =!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  B*?FLpɐ t x]2d$W@dfLF@ɐ5e!B) ɐd T Q Ted,a>2Z +M7777BUFRF   !!!!!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!!P  2dW@?V@?Lٓ ј@{LFVɐ5z) d a2Ƨ@ 7777BUFRF   !!!!!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!!P   2dW@?U?ѓ ј@|FLFVɐ5x*l d b>2ϛi%8P7777BUFRF   !!!!!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!!P  y 2dW@?U?,Փ ј@|(@FVɐ5( B b2թ&)`7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!!P  Y X2ddD?]?W@ ?ѓ ј@|&LFVɐ5( d Lj"pLgFR[%,7777BUFRF   !!!!!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!!P  2dW@?U? ј@|LFVɐ5w)T d c2ˉ)`1 7777BUFR6   !!! !!! !!! ?!!! =!!! !!! !!! !!! !!!P  d*;L#*t 2d4 L1 tM TT!MIz8‰7777BUFRF   !!!!!! !!! ?!!! =!!! 3!!! !!! !!! !!! !!!P  Փ 2dW@?U?̙ ј@|&LFVɐ5u* 2d d2< 01p7777BUFR   !!!!!!!!! !!!!!! ?!!! =!!! 3!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  q 2ddD?]?W@ ?lٓ ј@|FLFVɐ5x(< 2d ɐdr Q Te2d,dB@\ PLFR[`&Jd7777BUFR   !!! !!!!!!!!! !!!!!! ?!!! =!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!P  d*&Lӈɐ t x]2d$W@2dvLF@Jɐ5k2d)  ɐd T Q Tf2d,dB@5 P LFRY4i&k 7777dballe-5.18/extra/bufr/temp-gtscosmo.bufr0000644000175000017500000000026611627716465015400 00000000000000BUFRN     4Al|?^>^ǫ=Tȗ<<xWJ 7777dballe-5.18/extra/bufr/temp-gts3.bufr0000644000175000017500000000117211435242165014403 00000000000000BUFRz[  4R"nWx3'/;z82jl$*v/!v%o$!f!]8"X*/T8K93-8'`&"`!%% 37j;@7777dballe-5.18/extra/bufr/ed4.bufr0000644000175000017500000203261011173330007013227 00000000000000BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0$I$JI$I$I&mmm$I$Immm۶m`d)iR>[\S S_td)lktdc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\٣d$TȴдPUUUUUUUUUUUUUUUUUUUUUUUUUUPUU`= 07| 5I=bUtPtPb$՟   $=b YԀ,ˀb}tPY$n6=b1-=b=bIUn6tPbn6n6U$n6=b=bn6n6I=bU=b jԁY YI1-Y5sUs$ 57s7 5 5$a,,I> 5j$$00 5I>7jtPb$՟1-=b7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@(0I$I$I$I$I$I6mmm$I$I$[mmmFSmpC!Lt%MsN 1Е-sN 1Е-sN 1Е-sN 1Е-sN٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUUaYU=b=b=b1-1-IUs= g€ˀb=bb  $$Y$b1-Yjja= I>I>I>I>՟Y՟՟ˀˀ5՟aUs0= $ 57I>5$jˀ555 ˀaI>= 0 5}77Us$n6j՟j$In6b1- $՟g€a՟ԁ 1- $1- b Ԁ՟Ԁ՟55՟՟557777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@@0I$I$I$I$I$MmmrI$I$I$mЊ 1Е-sN 1Е-sN 1Ж5τe:VD2BT5τe:VD2BT5τe:VD2BT٣d$TȴдUUUUUUQUUUUUUUUUUUUUUUUUUUUUUUUU`ˀ5a,,ˀjj՟Ԁ՟ԁY 1-UI=b$Ԁa,g€5|0$tPbtPbtPUÁYbbԀԀ5$j5$՟՟Ԁ՟j՟ˀg€I>I>0= Usj0aa n6ItPUԀ$ Ubn6tPbn6I1-sI>g€g€aI> 1-UIbn6I1-UbbtPn6UI ՟5ˀa$ 5ja՟=bn6U7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@T0I$I$I)$I$I$Mmm$I-mmvm`5τe:VD2BT5τe:VD2BT5τe:VD2BT5τd2+k" c*[2+k" c*[٣d$TȴдUUUUUUUUUTUUUUUUUUUU@UUTUaI=bUU$$=b$ YYsI>$ 50s5ԁI=bj5$=b1-I1-=b$sg€07a77= = I>= I>0g€5$$IYs= $jjUs,$ $1-Y $ aaa0g€I>$7OOOOa|Usa,ˀjԁ $՟sj+}OsOasa|UssI>I>0= Us7777BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<BUUUUU]kZֵk{{{9s9s9s{{{{{x2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*\#)Ҷ٣d$TȴдUTUUUUUUUUUTUUUUUUUUUTUUUU`g€5ˀ0a0 5}sssOaI>0= 5՟, $$=b$=bIbI 5UsI>s,a0ag€$j 5}aas~~| 5 5$= = 0UsjasԀԀ5aI>a՟Y=b$Yj5j$$$ U=b$jg€0assI>j՟5ssUs00a 5$= 7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0$I$I$II$I$I$mmmےI$I$I$mЊ!:JBJƹJBJƹJBJƹJBJƹJB|"٣d$TȴдUUUUUUUUUUTUUUUUUUUUUUUUUUUUUU `jjOXa }=bI1-IhU[[[[1-ˀa[g€ˀۺaˀ,55=bˀjOXjZ~6-hhhH|0,j,aˀa,υ1-Iۺ$1-1-j,j5υυY1-$=b I=b=b1-  ۺ[j 5I>I>= OX[OXs[g€[aˀjυY Ys,[aۺ5Y1-H7777sBUFRb f2  +,-ZZ!bLEICESTER CENTRE 1% t#StЌ @@<0I$I$II$I$I$mmmےI$I$I$mmm`)Ҷ!:JBJƹJBJƹJBJƹJBJƹJ٣d$Tȴд@_' |RH6+0`!`$c dp0&%[1-1 $Usa é1I?x#`$, \1Pc.B=bV~~:] éV~?x 'jj\.lV`$bZ  -lV`Bn6l&\&%LK@a$z&\ `B@9p@՟?%KTH!9p@ԁzk1 @?x 50Us&\~p#`F0sυd?x09LK@ab1 57777 BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<40$I$I$II$I$I$mmmI$I$I-mЊBJƹJBJƹJBJƹJBK2+k" c*[2+k" c*[٣d$TȴдUUUTUUUUUUUUUUUUUUUUUUUUUUUUUb}|$g€$jj 5 5 5j 5= 0I> 5 5}}tPtPtPbtPb0UsI>= Us[[g€ssa,aaag€[Us0000[ssaaˀ՟ YU=b$=b1-$j5aˀۺ$1-$$U=bUI=b=b$YY  $1-  YY   1-I=bI1-1-Y$՟,j $UtP-H7777sBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<H0 $I$I$RI$I$I$mmrI$Kmmmݶm`2+k" c*[2+k" c*[2+k" c*[2ctd)lktd)lk٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUTUUUUUUUUbb-bn6U$IUbn6n6$Yb1-In6$YtPtPn6tP=bˀsaaI>UsI>= = I>g€ԁ=bIIn6n6Ua$sY$$tPtP=Ib1-n6Y1-Y$=b$=b=b5s= 00++|$UsԀԁYn6tP1- $j,= = $jjaˀ՟՟Ԁ$՟7777sBUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUU[|c1c1c19s9s9skZֵkZֵkZֵ{{{td)lktd)lktd)lktd)lktd)lkt٣d$TȴдUUUUUUUUUUUUUUUUUU@UUUUUUUUUU`1-1-IbtPn6 = , Ԁjj j5$$YԀ55 $ Ԁg€= sԁ1-=b1- $$YԀԀ՟՟$j7~|0I>g€aUsg€aaY՟555,$}~7g€51-UYa՟$Ԁj5j5ag€g€g€0I> 5= = ,ԁ1-$Y$$1-UU=b=b$Y7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I%$I$I$ImmnI$I$I$mЊd)|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:٣d$TȴдUUUUUUUUUUUUUUUUUUAUUUUUQUUUUPU`g€0j0aUs IUԀ՟՟$}ÁU1-g€sUs0UsԀ՟5ˀ,5$YYY1-1-U=b$a,$՟bb1-՟$55$I1-$Ԁ55sI>= jj$+~|jI>UsI>aUsas՟aˀ5ˀԀ՟sUsUs0|$Usssg€Us,ag€aˀg€ˀg€,0j+|= ՟I7777 BUFRb f 2  +,-ZZ!bLEICESTER CENTRE 1% t#StЌ @@<0I$I$I)$I$I$MmmrI$I$I$mmЊ|#)Ҷ!:5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τd٣d$Tȴд@]&\H:5gGIzdKT `O @ 5/M`d@I1> P#`LK@j?bZd 5jj0|(pF0U1dp\,@ F0U X*$ad-X@՟b&\ p5gbc qO#`9^g€d L:= ^ˁYbZ&\H9zW0 L`)2/M`0UsI>$ @ 8u LK@aY @|( PRe577770BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<00I$I$I)$I$I$MmmܒI$I$I%mmn`:VD2BT5τe:VD2BT5τe:VD2BT>[\S R>[\S R>[\٣d$TȴдU@UUUUUUUUUUUUUUUUUUPUUUUUU`g€I>= j+~~7sssj+| 5 5 5j$Usag€g€I>ag€$ 5j00 5,Us= 0$$0= g€UsI>0sa00Us= Ussԁb$n6jԀ$$$ԀssUs+~~7|Usˀ՟a= UsI>00Us,ˀag€= I> 5sUsˀaaUsg€aUs՟YbU5,aaI>I>a7777 BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<H0$I$I$JI$I$I$mmmܒI$I$I-mЊS R>[\S R>[\S R>[\S R>[\S [2+k" c*[٣d$TȴдUUUUUPUUUUUUUUUUUPUUUUUUUUUTU`ˀ$=bn6I $$I$՟՟$a,sUsjI>j7 5= sUsg€saaUsI>Ԁ՟Ԁ5ˀsUs$j$= 0Us= UsI>0Usg€ˀ՟1-Un6$՟aI>a$ˀ՟a$$0$,5YYtP1-$Yˀ,= jI>I>a5j5Ԁ$Yˀg€a$7s+|0aUsUsj0j7777 BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<\0 $I$I$I$I$I&mmm$I$I$KmmmЊ2+kd)lktd)lktd)lktd)lktd)lkt٣d$TȴдB!B!B!!B!B!B!B!B!B!B!B!B!B!B!`,,jtcbZHn6$$Ha55υj$IYYY$jcn6$n6ta$Y$υˀυۺ=b=b=b$I=b1-υj5aˀυ1-IO=b=b[$$[Ohˀ,a5tP$$tP$5,ˀaˀˀj55jˀ,g€g€  h$    O=b1-Y5s,7777$BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUU^s9s9s;{{}{{{!B!B!D!B d)|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:٣d$TȴдUUUUUUUUUPUUUPUUUUUUUUUUb770jsI>UsUs,,5jI$$Ԁ, 50g€ԁ $5ԀԀ՟Ԁ5 $g€= 5 5 5+~7a 5I>sa0= $= = ag€sjI>~7s 5= I>$$I>= jUs$0 5 5$}ass7= g€$I>aI>= Us0I>Usj= ,ˀ= 0j~7+|g€s0I>7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@< 0I$I$I%$I$I$mmmےI$I$I$mmЊ|#)Ҷ!:|#)Ҷ!:ƹJBJƹJBJƹJBR>٣d$TȴдUUU@UTUDUUUUEUUUUUUUUUUUPUUUU`j$0= UsI>j00= jUs0}ssOOs 5= 5= I>= +~+}7$I>$= 7j++| 5jUssˀasI>0I>5Uss,jԀsI>= +|j$s1-1-aˀa՟՟YYbbYj,I>g€aj՟=b$Ԁ5=b$ Y$Y$jsI>j0~|jˀ$YˀUs5ˀYn67777>BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@< 0$I$I$JI$I$I$mmmܒI$I$I-mmv`[\S R>[\S R>[\S R>[\S [2+k" c*[2+k" ٣d$TȴдUUUUUU@UUUUUUUUUUUUUUUUUUUUE`0a0 5s|aUsaaI>ag€$,I>g€aaI>$ 5j 5= $aag€ 5777+| 5j 5$0Usj$aˀI>$՟+~7s՟$UU-=-bb 1bZ}Y-bYb$n6bb1-n6bn61-g€ag€g€Usj 5= ՟Ԁˀaaaaˀa,5j$$ԀUs0I>0+|$s7777>BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<80 $I$I$RI$I$I$mmmI$I$I-mЊc*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[٣d$TȴдUUUUUUUUUUUAUUUUUPUUUUUUUUUUUUU`5YԀja5aˀˀg€g€sg€aa$j$ 5$a5$j5ag€ˀsag€g€g€g€a,,s= I>I>7ja՟ag€,,sg€= = btP=b՟s$5ss7$sI>Usg€I>$Usg€= I>a,0 5jUsUs1-1- j  ˀb }ÁYI$,aa1-U=b =bU1- 7777>BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<L0 $I$I$I$I$I&mmm$I$I$KmmmЊ2+k" c*[td)lktd)lktd)lktd)lkt٣d$TȴдUUUUUUUUUUUUUUTUUUUUUUUUUPUUU`jY$$tPn6bI՟g€ԁ$=b$՟j5$YI՟ˀˀ,ˀaI>a$Ԁ՟5ajjg€$1-Ij,I>I>j+|0՟$՟՟a՟j5ˀ,$Ԁg€I> 5= g€aˀg€,assԀˀˀaaa0j+}s+~~~7= 0j+|$ja05ԁˀ,Us7777>BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<d0I$I$I%$I$I$ImmnI$I$I$mЊd)lktd)|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:٣d$TȴдUUUUPUUUAUUUUPUUUUUUUUUUQEUb|00g€ˀ5,,j$5,,,$+}}ss+|s՟ˀ,,sa՟ Ԁˀ՟Us} 5+~+|g€g€5aI>UsI>ag€I>I>aag€ag€a= s+}jI>Usa= = $I>Us= I>I>= s5j՟ˀaaI>g€jg€5a,,abtPU՟jUs+|Us 5|= I>g€,7777>BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUUUUUUUUU^{@!B!B!D!B!B!B1c1c1c!B!B!@|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:JBJƹJBJƹ٣d$TȴдUUU@U@@UEUUUUUUUUTUUUUU`s,ˀasg€aa51-˃+~7+~|j= a0+|a7+~7 5g€0$$++~7|77ss7++|$Us0$j+|+| 5I>aˀj5ˀ$՟Ԁ5a,Us0,5,sg€sˀ,aI>= Us$$+|0= = 5$saˀj=b ԀԀj5g€a7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0$I$I$II$I$I$mmmےI$I$I$mmn`JBJƹJBJƹJBJƹJBJƹJBJ>[\٣d$TȴдUUUUUUTUUUUUUUUUUUUUUUUTUUU@`I>00 5~77|$ˀԀ5sa5՟55,Ԁ1-Uˀg€0j| 5jj1- $aj$Y=b1-IUbI$1-j,= I>I>g€,a$I>Us$$0I>$ˁYaY՟I>a$jI՟g€aI>Ԁ,Ub$ag€aUs$7+~77~7Usa= 0aI>= 0as= = 0= 0+~}777777 BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@,0$I$I$JI$I$I$mmmܒI$I$I%mЊS R>[\S R>[\S R>[\S R>[\S R>[\S R٣d$TȴдUUUUUUUUUUUPUUUUUPUUEUU@UUUU`= ˀԀg€I>0I>Usag€aI>I>Us$j 5j$0I>g€ˀaaUsab$UY,jÁtPI j++|g€՟aI>$ 5 5j 5$$$j$0jj$070UsI>= 0$$+| 5$0= Us= 00jj}s$jI>aI>Us= I>= g€Usj0+~7assOa|= aUs= $= 07777 BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@@0$I$I$RI$I$I$mmmI$I$I-mmЊ>[\S [2+k" c*[2+k" c*[2+k" c*[2+k" c*[2*٣d$TȴдUU@UUUUUUUUUAUUUUU@UUUU@UUUU`aag€a0 5jaasaOs+|= aUsUsUs= $I>Usaa= 0= g€aj$$ 5= ԀԀ՟jˀ,aUsg€,,Us= I>I>= 57 5$Us5Ub,s,Usg€aI>= 5= 77s+|ajԁY5ˀԀԀ՟,I>= j0j+~}+|= sg€,g€ˀ՟a,g€I>7777 BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@T0 $I$I$RI$I$I$mmm$I$I$Kmmmݶ`k" c*[2+k" c*[2+k" c,ktd)lktd)lktd)٣d$TȴдUUUUUUUUUUUUUUUUUPUUUU@UUUUUU`= I>$Usj$0= ,jjY$ˀ,5ԁY$Ԁ՟Ԁj5ag€saˀԁY$ 5՟Y$ $՟5a,0$$ss7$,՟jjjԀ5ˀ,aaI> 5 5 5~| 5g€ˀ՟՟a,,g€,ˀj,0+~7s+|UsjYԀa5a,a,g€aag€I> 5j= j= ˀԁ7777 BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<BUUUU]kZֵkZֵ{{{s9s9s9{{{{{{lktd)lktd)lktd)lktd)lktd)lk٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa ՟,ˀˀˀsg€sˀjs= j 5I>$= a$a,= Us00jg€a՟ˀUs,sԁtPbI$a5aj0$= a,= ~7|j0= = ,$Y5,ԁ Us$j0a0$ 5jI>՟} $tPI1-=bjjaassasԀˀ$1n6$1-ÁIUU$$$UtP7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I%$I$I$ImmnI$I$I$mmm`td)l|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ٣d$TȴдUUEUUUUQUUUU@UUUUUUQEUUUUatPbb-Iˀ 5+| 5I>՟g€ˀˀ 5$՟aa0+|s|0ssUsUs0$$$$= I>0Usg€I>= 5}ss+| 5j0UsI>s,a,I>,a= I>= 0 57ssas7~~777++| 5= ass= ||jUssg€,,,aaUsI>Usa0I>Usg€j+}++|7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I)$I$I$MmmrI$I$I$mЊ!:τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUUb77= g€a,g€,a= I>I>ag€a= 0 5jI>sˀ՟jˀ,a,as,aa5՟,0j$0aa,ˀjjˀˀ,g€Us= j}+}|= g€5jԀaj՟ԀԁY$$$YˀUs$,saUssa,,՟5՟$ Ԁa,ˀ5՟ˀja0Us,saa007777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<00I$I$I)$I$I$mmmܒI$I$I%mmЊ5τe:VD2BT5τe:VD2B>[\S R>[\S R>[\S R>٣d$TȴдUUUUUUUUUUUUUUUUUUUUUTUUUUUUUUUU`Us$00= I>Usa5՟ ˀUsg€5a5j՟5aˀ5՟ԁ=bb ԁ$tP$jUs= 0s5$1-=b՟j՟՟5sa= 5jj$= s,g€ssg€ss5jaa5,$$|Usjg€Usg€aˀ՟,5ajԁ=bn6=b1-$5aˀԀ$՟j$Ԁ5jj5Ԁ$$7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<D0$I$I$JI$I$I$mmmܒI$I$I-mmv`[\S R>[\S R>[\S R>[\S R2+k" c*[2+k" ٣d$TȴдU@UUUU@@TUUUUUUUUUUPUUUUUUa a 5$7|0= = I>= $ 5jj0 5 5}7saOOas7+++| 5++~+| 50aaa 5++~7|$Usj5ˀUsssajg€aj,aaUs000aUs,saag€g€g€g€sg€UsUsI>= +}7+|j= aaUsI>= I>UsUsg€aaUssj$$$ԀԁY7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<\0 $I$I$RI$I$I$mmmI$I$I-mЊc*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" cKc\٣d$TȴдUUUU@UUUUUUUUUUUUQUUU@UUUUUUUU`ԁU g€aa,I>g€5$sUsUsj++}7jI>sg€g€aI>I>I>a,aI>ab-$ԁ ,ˀg€a,Ԁaj,,ajsg€= = 5 500$| 5j 50$0j$$= UsUs0$+~7~7|$j= aUsasg€saaj5aԁbU=b 5,Uss5j$Y555՟7777BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUU]{9s9s9w{{{ހB!B!B!!B!B!B0FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Ke:VD2BT5τe:VD2BT5τe:VD٣d$TȴдUU@UUUUEUUUUUEUUUTUUUUUUUUUUU`$ˀs55Us+}7|j$0= $0$Us= = Us= I>g€a,g€gƒ+|= 0aYUs= 5j 5 50$ 5$jj 5 5$$jI>,aUsI>0I>j 5j 50+}7~77jUs$$g€ag€ˀ,0j 5,0= = saa0j0j 5$aˀg€UsI>aa՟ItPtP- Ub՟7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@DDEUUUUUUUUUUUVfffffffffffgwwwwwwwwwwwx2BT5τe:VD2BT6td)lktd)lktd)lktd)2*٣d$TȴдUUUUUAUUUUUUUUUUUUUUUUUUUUUUUUU`ˁn6n6$5jˀ$5j 5sg€0s| 5= I>assaˀ,I>51I=b jaaI>,g€ˀaUsg€,s,s,ԁ ՟a$jjj 5 5j+|jjjj= UsI>g€UsI>gbbU1- ˀs,ˀˀˀaj՟5ԁ1-՟ aUsg€aԀ՟U1-Uj5ˀԀ՟j7777UBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<00 $I$I$RI$I$I$mmmI$I$I-mmv`k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" ٣d$TȴдQUUUQ@UUUUUUUUUUUUUT`g€$+|+~|0g€ˀˀ5Ԁ՟ˀ՟5I>,= |7 5sasԀ$$5jY՟j ՟a,,= $= as0$g€,g€s,Ԁjjja,ˀ55s$g€ag€aaI>aUsI>UsaI>+~~77j~7|777aaaaaOss}7s+|= 7777ԀBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<H0 $I$I$I$I$I$mmm$I$I$ImmЊc*[2+k" c+c\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\٣d$TȴдPUUUU@UUQUUUUUUUUUUUUUUEP`UsI>7777777+|}+|~7a5aUsjj$j= g€$ 5= = I>Us$+~7+|jsUsUs0j$jUs$,| 5j0I>= 5 5 5$1-n6b%Q$bn6U1-I Ij՟Ԁ5ˀ5jԀ5ˀjԁI,as0$$ 5+| 5I>I> 5+|j+|7777ԀBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<\0I$I$I$I$I$I$mmm$I$I$[mmmFSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt-sN 1Е-sN 1Е-sN٣d$TȴдUQUUUUUUUUUUUUUUQUUUUUUUUUUUc+|+|j777~|$0j+| 5I>g€Ԁ555՟5ˀˀ55$U=bUbY5jj5j $$5,Us= = = = I>ԁYjˀˀa,՟ˀaaaaa0 5 5+| 5I>aI>0g€5a5Y$1-1-IYˀˀaaa= sԁIIb=bn6b1-$$Ԁ5$57777ԀBUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUU^s9s9s9{{{{{{!B!B!!B  1Е-sN 1Е-sN 1Е-sN 1Е-sN 1ж5τe:VD2BT٣d$TȴдUUUUUUUUUUUUUUEUUUUUUUUUUUUUUEU`ˀ,,ԀԀg€ag€s՟ n6U Yas,g€Usg€5sg€I>ˀaI>I>$0I>I>Uss,=b ˀjj 5a= Us+|$ 5+|a 5ItPb$ Ԁ5,,՟Ԁ,aa,s՟՟՟5jˀԀ՟ssaaUsa՟j5$Y՟՟I Ԁjg€00Us= j+|0= Usaˀ7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@< 0I$I$I)$I$I$MmmrI$I$I$mmЊ5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τd٣d$TȴдUUUDUUUUUUUUUUUUUUUUUDUE`ˁ In6  =b7j+~~| 5tP$btPU =b1-I=b$as,sˀˀaaaa՟Y՟1-$Ԁ55ˀ,= 0Usˀ,ˀaas$0= I> 5 5 5jI>$}+~777+| 50 5|~+|I>,a0= j+|+|j 57777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@< 0I$I$JI$I$I$mmmܒI$I$I%mmn`:VD2BT6[\S R>[\S R>[\S R>[\S R>[\٣d$TȴдUUUE@UUUUPUUUUUUUUUUUUUUUUUUU`++| 5+|I>s,I>= j 5 5+|j~77g€g€,5g€g€g€ag€I>UsI>Us0j+~| 5I>aj$$$ԁ YY$ԁ  $ˀasa,g€$՟՟$$=b$Y5j$Ԁj,ˀˀԀ5jj5ˀˀˀ,j՟55jsUs= $7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<80$I$I$JI$I$I$mmmI$I$I-mЊS R>[\S R>[\S [2+k" c*[2+k" c*[2+k" c*[٣d$TȴдUUUUUUUUUUUUUUUUTUUUUUUUUUUUUU`$I>0j 5$= 0jj$j= I>jUbU$Yj5Yb1-b$ˀ55Ԁ Y$}%Q1 btPbtPb1-$tPbn61-jԁ$Yj=bÂ1Ԁ0a+~~|jUsg€UsI>g€g€,sassˀˀ5Us= = $j 5Usˀs55a,g€I>I>I>g€aˀaˀUsg€= I>0+|j$a,,g€saˀ,g€7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<L0 $I$I$RI$I$I$mmmI$I$KmmmЊ2+k" c*[2+k" c*[2+k" c*[2+k" c,ktd)lkt٣d$TȴдUUUUUUUUUUTU@UQUUUUUUUUUUUU`Usaasg€ˀaaa,ˀ,aUsI>s= I>aUsˀasaa5՟Y YԀ5a,,ˀg€j~|I>$+|$ 50$Uˀ$+}7ss|$I>I>I>= 5+| 5 5$0j= s0 5+~7+~~7+|= 5 =bYˀԁ Ԁj1-j$՟,I>aUs$= ,ajas,$ԁY1-U$$57777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<d0I$I$I$I$I$I&mmm$I$I$KmЊd)lktd)lktd)lktd)lktd)lktd)٣d$TȴдUUUUUUUUUUUUTUUUUUPEUUUUU`a0= I>s5ˀa5ԀԀ$Yn6btPtPI Ԁjj55jaa,sj$=b$՟Usg€ 5+|0I>I>$$I>= $j00= 5saaUs= $+~~777~~}7~77| 5j+~~77~|$ 5 5| 5 5j0g€5jYbb=bY՟Y$jԁYb7777BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUUU^{{{{{!B!B!D!B!B!B1c1c0lktd)|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|"٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUAUUUabtPԀjԀ՟=bԁUU$aaaˀˀs՟Ԁjjaasˀˁ$Ԁ$՟՟ˀ0 5j++|I>51-b1-$$$ =bn6U$՟Y՟Ԁ՟a= ,aa՟   Y$$$U=b  }YtPUI$YItP=U$ԁY$1-1-$$Y5ˀssUs~|0j 5$$jj$g€s7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0I$I$I%$I$I$ImmrI$I$I$mmm`)Ҷ!:|#)Ҷ!:|#)Ҷ!:e:VD2BT5τe:VD2BVƹJ٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU`g€[[I>Us= 5 5 5 5$s5jj555asˀ՟=bUtPh=b$՟ˀˀ՟$Y$՟5s$Y$՟j5ˀۺ՟ۺ,,,aaˀY$ˀaag€$~}|= ۺ$,g€sUs[,a=b  ۺjg€,,ˀ,g€5a[g€g€[saˀaˀs 5}~}}b>7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@(0$I$I$II$I$I$mmmܒI$I$I%mЊBJƹJBJƹJBJƹJBJ>[\S R>[\S R٣d$TȴдUUUUPUUUUUUUUUUUUUUUUUUUUPUUa 5aUsI>UsUsag€sa a,sԀg€sUsj+~~77+| 5+| 5 5= saY=b $s$$$jj= ,ˀja5ˀ5jYIY՟Ԁ,s0= I>0$՟5ˀjYԀ՟jg€$ˀˀag€$ 5= ,,g€,՟՟j,I>$ 5j7$$n6tPI1-7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@<0$I$I$JI$I$I$mmmܒI$I$I%mmЊ>[\S R>[\S R>[\S R>[\S R>[\SKc\FSl٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa1-$1-=bI$$ۺg€~}|jYۺˀˀ5՟՟jۺj,g€g€,[g€aj՟jjˀj5ˀۺ$$ۺ1-1-$$ۺ՟j,aj՟ssUs= [aˀ5UbI=bYa[I>Us5$$YY$ۺ$ۺ$jj՟$$,ˀˀ5j՟ˀa5՟$jۺ՟ˀ07777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@P0I$I$I$I$I$I$mmm$I$I$Immm۶`pC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!L٣d$TȴдUUUUUUUUUUUU@UUUUUUUb~7 5$Usˀ,I> 500j= g€g€jag€$77= Ԁa= 0jjj0ss5sg€Us7saa= g€ˀ= 00jj0Us,g€sUs= 0= j+~} 5$Usg€sUs= $j$$$$$$$ 577aOaa777+| 5$ 5 5 5j$I>0jss|I>7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<BUUUU\9s9sZֵkZֵkZֵo{{{s9s9s9{{{t%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kctd)lktd)lktd)lk٣d$Tȴд@]1-. '~ F0sYI&\ p9d@ˁac  @ P@@bd0 ReKT Y &%X@ˁY1|(0 LK@$z28KT 99Hd0$jaP LK@5b&%ReI  &%Reb p)2d@՟tĴ,@ d@5?n Y,@ d@5bII`3@I1&\ X,@ mۺ7777|BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$I&mmm$I$I$[mmmtd)lktd)lktd)lkN 1Е-sN 1Е-sN٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUaY Y55asss[$j[$0[Usg€,aj՟ۺjˀ[Usj~}~}~}|Us5Y$$ ۺ5ۺj$ۺ$$՟՟$5ˀj5՟ =bY՟jjY=bhb=b$$s0Us= 00aj$U$$ۺ՟ Y1-bIIb1-$ $՟՟5՟ۺY5jˀˀ$Ubbbb՟,7777@ BUFRb f 2  +,-ZZ!rLEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$I6mmm$I$I$mЊ 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1ж5τe:VD2BT٣d$Tȴд@,@ `[*6[,PυaۺC|+[O+7G$ۺPۺυۺۺY$O YۺۺY$P,,OXC#OXg€s,Y6jjaaυυPg€,tP+k7ۺsPP7Gtt$7G7G[7GۺυP$[tPOPh+$Y7G+υۺۺۺY+C|+C|+7777UBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<00I$I$I)$I$I$MmmrI$I$I$mmЊ5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τd٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUaItPtPn6tPb$$tPbY$Y$as$$UYˀ55ˀbYÁtP$$$Ԁ$YԀ55jԁ I1-1-=bUUUI1-$՟Ԁ՟ԀjY$nnIQV%Ib=b=b՟5ˀ,ˀjjj00$ 5$$$j$0= 00= = jj+~7~~7 5jg€= Us$UsUs,j5j7777@ BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<D0I$I$II$I$I$mmmےI$I$I$mmm`:VD2BƹJBJƹJBJƹJBJƹJBJƹJ٣d$TȴдUPUUUUUUUUUUUUUUUUUUUUUUPUUUUP`ˀ,,= j~+k}|I>ag€[[g€g€s[ۺ՟$Y$ۺۺˀass,g€g€[aˀ$Yۺۺa[s[Us,s՟a5ۺۺ$Y$$$YY5,I>[ˀssss՟՟55ag€= $0$~}|$= g€ss[g€g€ˀj,[= j~+k7777@ BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<\0$I$I$II$I$I$mmmܒI$I$I%mЊBJƹJBJƹJBJ>[\S R>[\S R>[\S R٣d$TȴдUUUUUUUUU@UUUU@UUUUUUUUUUUUUUc+~|$$ 5 5 5jjj$= jI=b$$jjI>0+|$a$$ ՟ˁ YbIU Y5s0+~}70jԁ=b=bYԀ5j$bn6I1-$՟js= +~+|I>g€՟ $՟jjjY=bUU$$$$Ԁˀa,ˀ$Y1-$Y$j՟jUtPb=b1-$Y՟jaag€ˀ՟$ Ԁ7777@ BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUU]{|9s9s9s{{{{{{!B!B!B>[\S R>[\S R>[\S R>[\S [2+k" c*[2*٣d$TȴдUUUUUUUUUTUUU@UUUTUUUUUUUUUU`,ԁ=bbtPUIYY՟I>0= Usˀˀg€abUbn6$=b՟s5= j 5 5+|ja0= , 5I>sj=baa0~}ajˀaaˀ5Y55I>= as| 5UsY$UsI>g€g€j1-b=bbYY$n6Y՟՟5j$b$ԁ$U$Y1-$j,a7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0 $I$I$RI$I$I$mmmI$I$I-mmv`k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" ٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU`I>= = 0= j$= I>I>Usas,ˀj՟Ԁ՟5aa, 5s70+|s1-5$$bI1- YY5,ssˀ5ˀj՟ˀ5ˀj$Y 1-Y$Y1-$a= 0a,j,aj5ԀԀԀjYYԀԀԀ5s,ag€ssUsa5jj՟Ԁ՟ja7777BUFRb f 2  +,-ZZ!bLEICESTER CENTRE 1% t#StЌ @@< 0 $I$I$I$I$I&mmm$I$I$KmmЊc*[2+k" c*ktd)lktd)lktd)lktd)lk٣d$Tȴд@ ]Y.d?x q`9b  /M`Re1-?x  @[| >~@@,I. -P,@ X@aYbZd|( 'F0υo )$˨+|OXB$1 L9I>aPaP ''@sc Xw@= mj1-Ĵ Lp)2ReˁI.&\ hp)2Rec hp)2g€?x PO0j$z 5= ||P q '07777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<40I$I$I$I$I$I6mmm$I$I$[mmmtd)lktd)sN 1Е-sN 1Е-sN 1Е-sN٣d$TȴдUDUUUTUUUUUUUUUUUUUUUUUUUUUU`I>= 0= $+|+~77s+|aˀˀ,,a5asa$~~777+|= g€Y5s,aa5$ =bԀ5as= I>= j1-=b=b1-   $IU$=bYYˀs,UsˀԁY=b1-$=bԀUUI$$5sg€0$0I>5Y$b1-IU՟՟$$ԀԁY 57777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<L0I$I$I$I$I$I6mmm$I$I$mЊ 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1Е5τe:VD2BT٣d$TȴдPUUUUTUUUUUUUUUUUUUUUUUUUUUUUU`Usj~|$Usˀj5jˀa$~~77~|$I>= aԁ $Y 1-1-YԀ՟՟jY$$Y$=b1-1-$=b1-Y$Ԁjj$՟55ˀ՟Ԁ5Ԁ$Y$ $ˀ՟Ԁ՟jˀaa= asˀ՟  Y   $  jj,I>I>I>$Us$ =bbtP7777BUFRb f  2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<`0I$I$I)$I$I$MmmrI$I$I$mmЊ5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BTƹ٣d$TȴдUUUUUUUUUUUUUUUU@UUUUUUUUUUUUUUU a$1-$$1-1-$Y1-[1-Y$ۺۺυυ$Y $1-1-1-$aOXI>OXI>aOXjI>,ˀυ5jυυYۺυ5ˀ,g€OX= = 00Z}hH| 5I>saaˀˀˀa,g€OXˀ5jۺ1-UUItPtP$}tށ}tUj5IHIۺ$$$$7777BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUUUUUU^s{{{B!B!B!!B!B!B1c1c1c!@JBJƹJBJƹJBJƹJBJƹJBJƹJ٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUP`$YY$YY Y $ۺ՟j՟՟ۺۺۺjۺ՟$՟j55a,,[,aYY$ $$I1-1-U1-=b$ Y$U$ۺ5՟Y1-=bUbhU1- $ۺ՟5ˀ[j$I>0I>g€Usg€55ۺYۺ5՟ˀ,j~}~}|$j 5I>ˁ jˀg€= ~+k+k+k}~+k7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0$I$I$II$I$I$mmmܒI$I$I%mЊBJƹJBJƹJBJ>[\S R>[\S R>[\S R٣d$TȴдUUUUPUUUTUUUUU@UUUUUUUUUUUUUb7j՟1-II1-$Y$5j$j ՟,g€$0 5+~+|= aY$=b1-1-՟$1-=b$$Ԁa0~770= gI Ԁ$5j$ $Ԁ$$ˀ,= 7ss 5Us1-  n6YU1-II$,g€,sԁ $=btP$$=btPYIUn6$ ja,a= = I>aaˀaa7777|BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<(0$I$I$JI$I$I$mmmܒI$I$I-mmЊ>[\S R>[\S R>[\S R>[\S [2+k" c*[2*٣d$TȴдUU@UUUTUUUUPUUUUUUUUUZUUUUUU`sag€g€= $j77sss|$Us,g€aUsg€aUsI>= $j77|j= $j55j5ˀ5՟՟ j,Us$+~7+~77|j1-n6tPÁU$5a,jԀ՟YY$UUÁYÁb%Q}  }bbÁ1-1-UU$tPn6bbtP1-Y$YԀ7777|BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<<0 $I$I$RI$I$I$mmmI$I$I-mmv`k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" ٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU`ˀˀ5ˀˀsjUtPbUUIUbtPYÁII  $ ՟ԀԀ՟5jj555j55,asUsI>= +~|ss5Ԁj 1-U $$sI>= 0$0՟=bUI$ Un6bn6tPUb1-$՟ˁYIbU1-=b$=bn6tPYtPtPn6n6=b=b1-Ԁˀ7777|BUFRb f 2  +,-ZZ!rLEICESTER CENTRE 1% t#StЌ @@<T0I$I$I$I$I$I$mmm$I$I$ImmЊc*[FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\٣d$Tȴд@ `IU[hYY[=bI=b1-$1-$$$1-UYÁ$YY\?ރuV~h̓V~ނ11ht1ÁYÁ}I=U=bUI[U1-hI=b$$I 1-1-$  =b[$   $$υ5OX= I>sg€[[g€[I>= j$000I>g€,aa= 5$jjI>I>= ss7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<h0I$I$I$I$I$I$mmm$I$I$KmmmЊFSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\td)lktd)lkt٣d$TȴдUTUUUUUUUUUUDUUUUUUUUUUUU`ag€ 5jj 5~7777| 5sjj՟j5Ԁ$$ Ԁ$ˀs0$j$j 5 5 5I>aag€ssg€g€Usa= j$= jj+|+~}0I>sUsUs,sg€ˀg€a= $ 57as 5a,g€ag€asg€5,UsUs= ~}7 5ssYԀ$$$jUsI>ssÀ7777|BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0I$I$I$I$Im$I$I$mmmm`d)lktd)lktd)ljN 1Е-te:VD2BT5τe:VD2BT٣d$TȴдUUUUUU@UUUUUUUUUTUUUUUUUUUUUU`Us[[UsI>0jUsg€$ 5jUs= = g€[I>= I>= = $ 5+~7++|j0sj5ˁY$Y=b[hUtP=b1-1-$ 1-[恘[=b$ۺ$as[0++} 5Us,g€g€s,aj$1-ۺۺ՟՟ۺۺj= = sۺ1-1-$՟ $1-=b1-Y$$Yۺjˀ5ۺۺ 7777|BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@@"""""UUUUUVfffffffffffgwwwwwwwwwwwx5τe:VD2BT5τe:VD2BZ2+k" c*[2+k" c*[2+k" c*[2*٣d$TȴдUUUUAUUUUUUUUUUUUUUUUUUUUUUUUUUU`υ5ˀˀυυ$υ,g€OXI>j~}|sI>$[ag€sY ۺۺ5jjI>I>0= sυI=b=b[htPhhh=b$s$hIO=b1-O YYjOX= $jj= ˀjaˀ,aۺˀss,g€[j0sg€0g€[,I>I>I>= [g€s,a[I>0 57777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@<0 $I$I)$I$I$mmmےI$I$I$mmmm`k" c*\e:VD2BT5JBJƹJBJƹJBJƹJBJ٣d$Tȴд@B!B!B!B!BB!B!B!B!B!B!B!B!B!B!`agH$$zbZaۺY $ˀaa,ۺυυ=bhhOPۺۺۺυP$$asgƒsY$H[$$1-Y1}H$[ ۺˀˀۺ[C|O 5P ۺυYC|C|Yۺs5=b 1-YhYY=bO=b $$Y 5s5ۺP57777kBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@T0$I$I$II$I$I$mmmےI$I$I%mmЊƹJBJƹJBJƹJBJƹJBJƺ[\S R>٣d$TȴдUUU@UUUUDUUUU@UUUUUUUUU@UUUU`= = sI>Usg€I>Us0= $0I>+~7s[= [,asۺ55Y5,I>0+|7 5[ۺg€Us0I>I>Us,s00j77+|I>$I$$՟՟[恀[h=bU $ˀ0 5jsaˀ,jۺˀj5j5՟ۺj50j~}g€jjjI>,5ۺ$=b$ۺۺ1-$ $7777$BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<BU\:ֵkZֵkZֵk[{{|9s9s9s{{{{{[\S R>[\S R>[\S R>[\S R>[\S S\FSmpC!L٣d$TȴдUUUUUUU@UUUE@UUUUUUUUUUTUUTa Yۺˀa,a5ۺ՟Y1-jjۺ1-=bjasj$+}Oj[,g€g€[ˀI>[55ˀaUs$+|j 5$7sOajg€5$55ˀˀ՟j5s[[s= = = Us[a$1-U[hI1-$U$[$1-$՟ۺ,07+|$sjˀ,[g€sa՟sUsUs0+}as++| 5g€j7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$I$mmm$I$I$ImmЊt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\٣d$TȴдUUUUUUUUUUPUUUUUUUUUUUUUUUUDUUa1-U1-1-1-$$YUI1- $ۺa,,aۺ  Y1-YۺI1-=b1-1-jˀ,0+} 5Us5ˀg€ˀa՟՟=b=b=b$ˀ5,0,sUsg€՟ۺ$$՟՟jˀ՟ Y Y 1-1-Y՟s[UsUsg€,,aUs[[,aaaˀ,g€ 5+|ss+|[՟$՟,= Uss7777,BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@DDDDUUUUUUUUUUUUffffffffffffwwwwwwwwwwwwFSmpC!Lt%Kc\>[\S R>[\S R>[\S R>[\S R>٣d$TȴдUUUUUUUUUUUUPUUUTUUUUUUUUUU`s55js= ~}sas+|Usۺ=b ۺ5aˀ $=b=bIU[=b$՟ˀj$$j,ˀaˀ0 5 5 57~7s7I>[0 5 5 5= $I>ˀassg€0~}7[5$$j$Ihh[$YۺjjUs0g€0Y ՟5՟Yj$jg€7777sBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<80$I$I$RI$I$I$mmmI$I$I-mmv`[\S [2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" ٣d$TȴдUUUUUQUUUUUAUUUUUUUUUUTUUUU`,0$+|+|[[$5j5ˀ5ˀۺۺjjas[[7 5~~| 5gY ՟ˀۺ1-$,= 5j0 5 57|s =bYˀ,s,jtP=bUU1-j,[UsI>[a=bYjss[,aaˀˀaI>= j7 5[,s[,saˀ,jۺjg€$+}777|j= 7777jBUFRb f2  +,-ZZ!bLEICESTER CENTRE 1% t#StЌ @@<P0 $I$I$RI$I$I$mmm$I$I$ImmЊc*[2+k" c*[2+k" c*[FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\٣d$Tȴд@]bc L$@@s՟28 hX3ReUbZd 'jI>Yd @p#`5gd@՟I1 9^ˀHI @ 5$bZ~,@ Re,Y?xB@9d@,PO˂Ic  LF05Ĵ h-pF0A=bH)2jz: h'@I>|1f e.ZBUzc  \ReY1d?x~!C#G7777BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUU\c1g9s9s9sZֵkZֵkZֵo{{{!B!B!B FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%MsN 1Е-sN 1Е-sN٣d$TȴдUUUUUUUUUUUUUU@UUU@UUUUUUUUUU`5 O=b[IIˀˀa,s,s5ˀjg€s5IYh[1-$O=b5[aj$ ۺ$ۺ1-$ۺυ,= 5+k}}tP>tP|$j5,g€,g€= 5$}btP>>,>I>1-1-s0= jg€υ5a,sOX 5 5bbb}| 5a 1-υg€I>a, 1-$ˀˀ007777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@< 0I$I$I$I$I$I6mmm$I$I$mЊ 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1Е|#)Ҷ!:٣d$TȴдUUUUUUUUUUUTUUUUUUUUUUUUUUUUUc+|7+|,$1- ۺI1- =1ÁU=b$IhUI1-UIj5$=b՟sUs0 5= [$}|j0I>Us= $jj= [UsI>g€0 5+|+}I>$$Y5g€g€sۺ1-Y$ ՟a[= $0Us= ՟j5[[$htP$$=bhI$ۺˀ՟5$Y=bY7777aBUFRb f 2  +,-ZZ!rLEICESTER CENTRE 1% t#StЌ @@< 0I$I$I%$I$I$ImmnI$I$I$mmЊ|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|"٣d$Tȴд@)2`Psa[6sυY݁[OO ,aaYPυaυۺPυυ,6 56[g€C#[,g€g€,g€YtPtP݁7G݁݁YPυۺhC|h[$PۺυPOXg€Paa66aO7G hht7GOPch $t?7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<40I$I$I%$I$I$mmmےI$I$I$mmm`)Ҷ!:|#)Ҷ!:JBJƹJBJƹJBJƹJ٣d$TȴдUUUUUUUUUUUUUUUUUUUPUUUPUUUUUa-YI[ $ۺ$ I%Q=%Q1-1-Uhhh=bItP[j 5g€ۺ[[恀 Y՟$Y1-IˀaUs0UsUsjtP=b1-,a5ۺY 5j5[ 5$+~7|0 5,aI>UsUs= [= UssUs= $7s7 5UsUsI>= g€I>I>I>I>= ՟՟jI>= I>s$7777aBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<L0$I$I$I$I$I6mmm$I$I$[mmЊBJƹJBlktd)msN 1Е-sN 1Е-sN 1Е-s٣d$TȴдUUUU@UUUUUUUUUUUUUUUUUUUUUUUUUUb}~}|= $jjj$g€= j[0,,I> 5~}|$ˀˀۺυ[OtP1-=b1- Y$$YIÁOυ1- 1-tPHÁ$hOI1-$OhÁtP$jY OY%Q1%Q$I$Yۺυ$=bυۺ5$  jˀjOX0,j1-I=bۺ5aˀ7777aBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<`0I$I$I$I$I$I6mmm$I$I$mmm`N 1Е-sN 1Е-sN 1Е-sN 1Е-|#)Ҷ!:|#)Ҷ٣d$TȴдUUPUUUUUPUUU@UUUUUUUUUUUUUUUUU`j՟ˀaI>= $ 5 5++| 5I>sg€ˀ,s,a,[,[= 0j0 5= 0+~7|j0Us[,0j0= 0$= = $j+~7+| 5+|$I>ۺۺj5ˀ՟5 1-UI՟jˀ$՟ˀۺ[UI$UtP tP$ۺ՟[$[0sˀ$hU1-$ Yۺ$Y}H7777aBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUU^{{}{{{!B!B!D!B!B!B1c0!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:٣d$Tȴд@^cn }h-pOXˁ1-Ic h.lV`(Ahn ' -P O0jaP|(!f;ˀHc  6z1 ' -P)2'@OX|a @ q#`9s>|( q @@g€υ > /M`Re,υ1d~ F0g€$H O'@5% Xpj 5I>a F0g€nKT0I>GۺtbZKT?xj= 0az L!OX$7777IBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0$I$I$II$I$I$mmmےI$I$I$mmЊJBJƹJBJƹJBJƹJBJƹJBJƹ٣d$TȴдUUUUUUUUUUUUUUUUUUUUUPUUUUUUUUU`,5j 1-=b$$ hU$$$I=bjjˀ5j5jˀ5aI>= I>[Ussˁ$=b$5j$՟U-=bUhII$1-  g€ۺ  Yۺ,a5՟ۺ՟aUsUsUs$ 5+~~|0g€,g€asUssa՟jaˁY0j0I>= 5,[g€5ۺ՟5j,ˀ7777XBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<$0$I$I$II$I$I$mmmܒI$I$I%mmn`JBJƹJBJ>[\S R>[\S R>[\S R>[\٣d$TȴдUQUUUUUUUUUUUUUUUUUUUTUUUUUUU@`ag€= 5|jUs51-U1-=bۺ h$H 1}IIۺ՟ 1-1-1-՟,s$j[=bj[I>I>ˁ1-tPI j,[Us,[5aI>Us[ˀsg€I>0= Us,I>~7+~}~| 5s[s0= jۺ$$tPhۺ5ˀ,hY$jˁ1- Ys[+}7777XBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<<0$I$I$JI$I$I$mmmܒI$I$I-mЊS R>[\S R>[\S R>[\S R>[\S RB2+k" c*[٣d$TȴдUUUUPUUUPUUUPUUUUUUUUUUUUUU` 5[g€g€g€ˀ55= ˀ՟j|aI>sI>$~7|j+| 5$I>= Us0Us,I>= 0}sss+~77+|j$jj00$a,g€,I>j}sjj$ۺh=b[$ˁ1-[tP=b=b1-Y Y$=bUtP5՟,ˀ,1-ۺYhU$5ˀ$=bYˀˁYˀ7777XBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<P0 $I$I$RI$I$I$mmmI$I$Immm2+k" c*[2+k" c*[2+k" c*[2+k" c*[2mpC!Lt%sN٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU@`ˁI 5jI$$tP=b$$$[恀 $ˀ[0ˀ[jۺˀˀag€= 0j$OXˀj[I>[g€g€,sυ$ $υg€$j 5j}~}~}|$$ 5jOX[s[0 5j[},j$ 5= jI>ˁY[恀tPOO=bÁY=b$ˀg€$$ 5$aυυ0OX0I>OXg€[,= j}btP7777XBUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UU\9s9s9skZֵkZֵkZֵ{{{s9s9s9{{z 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1٣d$TȴдUUUUQUUUUUTUUUUU@UUUUUUUUUUUUUb~||jaj5,ˀˀs[g€Us0I>$[+|j$= I>՟aˀ5,,UsUsUsI>= I>[,s[j++}$Uh$= Us 5$ 5j 5I>0= j5jˀ= 5+~7+|$0sg€,g€,,,aˀjjYۺ5ˀ,,ss[ˀ,saˀjۺjˀۺj՟  Y՟5aˀ$$՟ۺ7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0I$I$I$I$I$MmmrI$I$I$mmЊ-sN 1Е-sN 1ж5τe:VD2BT5τe:VD2BT5τe:VD2BT5τd٣d$TȴдBP`A @³8@³AA A @³IIm@@~m@~adOABAB@³m@mABAAAª7]B0@AAyBAadymz'+(@I8@@T³³m@BAU/@8@@~ A*vAmB0zz*AU/mAU/AA*vA*vAad8m7]COBOnAAžC9AAABa@CAAAA*vAAAA*CBϚA Am mU/6A8mymaaO@8@A6A*vAAB@7777jBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0I$I$I)$I$I$MmmrI$I$I%mmn`:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BX>[\S R>[\٣d$TȴдUUUUUUUTUUUUUUUUUUUUUUUPUUUETUa$tP՟s1  =bۺۺ tPˀsUs= = Uss= UsUsaUsI>$~~~| 5 5jj0= = = 00= UsUs[sg€I>= $$j$Us5$Y ۺۺ5՟jۺۺU=b$5[[[g€g€ۺjjۺۺ՟5[Us$$ 5+~777|I>I>I>0$00= g€j= 5|$000$+|UsUs7777jBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@00$I$I$JI$I$I$mmmܒI$I$I%mЊS R>[\S R>[\S R>[\S R>[\S R>[\S R٣d$TȴдUUUUUUUUUUUUTDUUUUUUUUUUUUU@AUU`՟ˀ,[sasg€Usg€I>Uss,I>$= 0[ag€sssag€[,= Usjs$ۺjۺjsUs$[[j+| 5 5|j| 5$g€ۺU ,ۺaۺ$ۺۺ՟g€ˀj[g€0j 5jj 5$= Us[I>$0Us[= Us,= $Uss0s+|j~|jg€$Yۺ՟j՟7777jBUFRb f2  +,-ZZ!bLEICESTER CENTRE 1% t#StЌ @@<@D0 $I$I$RI$I$I$mmmI$I$I-mmЊB2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2*٣d$Tȴд@]?x P= ,>@@G[I '~!C#Gzk> @ XOXˀ5zkА @ @j,tА 3@^51-А?x h-PC#wۺtnc |( B@$g€c ,@ ReI1Ĵ6ˁIbZ h0 'B@ 5jPH~`a 2Zg€5zk~&%9ˁtc -P6^ˁzk28 'B@&%Re,7777+BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@X0 $I$I)$I$I$MmmrI$I$I$mmmm`k" c/e:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU`ag€00jI>ah=ba,[s,$Y,g€I>$= $UsۺU-Yj55=bIhY1-UtPhUs= [[,ۺ$j՟5ˀaaۺ$ۺ$s$I>,as[[a5Y5j՟5ۺg€Usg€5aa,I>= I>,aˀUssI>I>[g€I>0$ 5++|7s 5j7777jBUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<BUUUUUUUUUU]{{9s9s9s{{{{{{B!B!B5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BƹJBJƹ٣d$TȴдUUUTUUUUUUUUUUUUUUUUUUUUUUUUUU`0$= $$= 0a,5s$7|j7| 5 5j$0$[I>ssUsss= j0= saj ՟jUhYasYUۺaa[5  jˀ՟ۺ U1-$1-$$5ˀas՟ۺۺ$5ۺۺ$ ˀˀ5U$ۺ,[a5ۺ$jˀj=b55ˁ $ۺۺ7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0$I$I$II$I$I$mm$I$I$mmmmm`JBJƹJBJƹJBTd)lkJBJƹJBJƹ٣d$TȴдUUUUUUUUUUUEUUUUUUU@UUUUUUUUUUa[Y$$hIY՟ˀg€Us,aaaˀa$ۺۺI>UsI>+~~7~|0Us= j 5jj$Usg€,,j$+|$ 50}$Yۺˀ,sa55ۺˀs,j5ˀI>j+~7|= sj5ˀ$ ՟ag€jˀ0j0g€I>Us,ˀˀˀ55ۺ՟jˀˀ7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@< 0$I$I$II$I$I$mmmےI$I$I$mmn`JBJƹJBJƹJBJƹJBJƹJBJ>[\٣d$TȴдUQUUUUUUUUUUUPUUUUUUUUUUUUUUU`js= 0+|j0ˀjsˀˀ՟՟ۺۺۺ՟,[0s,I>I>0= [g€[s,,g€,՟j՟՟j,[= $+~~7| 5$ 5$jI>,0jj0$j 5+~}|[jja,g€ˀˀj$a,aˀg€$j$j,5ۺۺ55$՟$՟5jۺˀI>jI>Us[g€7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<80$I$I$JI$I$I$mmmܒI$I$I%mЊS R>[\S R>[\S R>[\S R>[\S R>[\S R٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUP@PUUUUa=bU=b=bYY  $5j55՟jۺ՟,sssˀ5j5ۺY  YIjss= $= g€ˀˀjˀ՟ۺ5՟,,aˀg€I>j0jUs,[sI>Us[g€00g€g€՟I>$|$+~77j777}+~7$s$Y$jUsˀˀg€Us[Usg€7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<L0$I$I$RI$I$I$mmmI$I$I-mmЊ>[\S [2+k" c*[2+k" c*[2+k" c*[2+k" c*[2*٣d$TȴдUUUUUUUUTUUUQUUUUUUUUUUUEUUUUU`sUs,,g€g€g€sˀsI>g€$00[g€g€[[= Us= [$Us0$g€= I>g€j= +}$Usj՟,s,Usˀa5ۺjjgƒ+|g€g€UsI>Us,Usa5 $ˀss,g€5js= I>j$Us= = [ 5= ,g€= I>0$= I>00= j 5+|jj$ 50$I>j[[g€a,s,Us[I>$7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<`0 $I$I$RI$I$I6mmm$I$I$mmmm`k" c*[2+k" c*sN 1Е-sN 1Е|#)Ҷ!:|#)Ҷ!:٣d$TȴдUUUUAUUUUPUUAUUUUb7}a| 57+}+| 5+|+||I>,j$Usg€$} 5= [g€[[0$j7+|j= 5 5+|as+|= sUsUs[g€= Us0UsI>j 5$I>Us07sss|5jۺˀI>07++~7+|jj++|j70[5՟a0+~~~~+|j 5+|g€I>aۺ,[ss$ I$57777BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUUUUUUUUU^{@!B!B!D!B!B!B1cc1c9s9s9p|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:2+k" c*[2*٣d$TȴдUUPUUUUUUUUUUUUUUP`YIU[$a 5 5}sOaOOa++}~7~7}77}~+~~7Oaas$,= jUsj$[[Usg€0jI>aj,jasˀ,= jjss5,ۺI>Usj0$I>I>j5ۺ$0I>I>I> 5js՟՟5sg€[0+~+|$$7saaassaaOs7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@< 0 $I$I$RI$I$I$mmm$I$I$Kmmmݶ`k" c*[2+k" c*c\FSmpC!Lt%Lktd)lktd)lktd)٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUasa7+}77~++~777+|$[ˀI>jj 5j$= $$$0$777|jg€՟aˀ$$[U=bۺ$U$jssass[s5ˀ՟j՟ =b=b=ba5ajI=bj$tP$Yj,sa$$ۺ[UsI>$$,a7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<80I$I$I$I$I$I&mmm$I$I$[mmЊlktd)lktd)lktd)lktd)sN 1Е-s٣d$TȴдUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUU`j,aa[Usaj $aI>0+~+|I>g€ssI>I>I>I>UssUs$j$UsI>ۺYg€Us0[[$j$Us$j$0sI5UIs,= j0I>Us,,saa5,aaa,s,aˀ[= 5 5[sg€g€Us= = 0UsUsI>I>I>= UsI>$0$ 50= 0= I>UsI>Us,g€g€g€a7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<L0I$I$I$I$I$I6mmm$I$I$[mmmN 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1Е-sN٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUQUUUUUUU@`a,j5՟jag€,,g€g€sg€,,,g€Us,$h Y ˀUs[,g€,sg€ˀ՟$jۺjۺ՟՟՟ˀI>0I>g€g€[g€g€,s,,s,a1-[$$ۺj,I>0jj 5 5 5| 5 5I>g€,[,  ˀ,5՟ۺY$ˀ[s= $jj 5jg€I>j++~77777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<d0I$I$I%$I$I$ImmnI$I$I$mЊ 1Е|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:٣d$TȴдUUPUUUUUUUUUUUUUUUUUUUUUUUUUb~77| 5$$ 5$0+| 5+| 5I>I>07777I>UsI>UsUs0I>I>a՟jU ,=bY$ˀj0j$=b$g€0I>g€Us5՟ۺ$a՟U11$a,[,5$$$՟՟՟ˀ՟Yۺ՟j[$j[5I$ۺˀ[[sI>[$s[= gt=b՟Y$՟ۺۺ$tPU7777BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUUU^{}{{{B!B!B!!B!B!B1c1c0|#)Ҷ!:|#)Ҷ!:ƹJBJƹJBJƹJBJƹ٣d$TȴдTDUUUUUUUQUUUUPUUUTUUUPPUTU`a[7+|0|= g€Usaa[j 5+|s5jg€I>jj 5$Us,Us[s0$= = |g€՟5, 5$,assa,g€$ 5+~|I>a,aaUsj$ 50= 0 5+|$I>0|~|jaj5g€= 5++| 5$++|j 5}ss$Us= = j 5+| 5 5j7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0$I$I$II$I$I$mmmےI$I$Immm۶`JBJƹJBJƹJBJƹJBc\FSmpC!Lt%Kc\FSmpC!L٣d$TȴдUQTTU@TUUUTUUQUUUTUUUT`= 5j 5 5|jUsgƒ+~7777~|$j70[ 57|+~7+| 577~~7+|0}}$g€I>0I>I>0$I>I>[,0$$ 5j 5777| 5,jۺs$ 5$ 5| 5$I>,s[ 5I>UsI>s5[g€ 5+|$= 00= I>I>= UsUs[ 5 5+~|[$I7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<(0I$I$I$I$I$I&mmm$I$I$KmmЊt%Kc\FSmpC!Lt%Lktd)lktd)lktd)lktd)-s٣d$TȴдUQUUUUUUUUUUUUUTUUUUUUUUUUUUUUatPj+|jj= $$[0 5|= |I>[5Y,s= a= ۺˀ[[$a,ۺU$՟ ۺ՟aI>I>Us= 00jsg€aI>g€Us 5j 5+|$j 5 5$$$j 5 5[Ussaˀ5aI>jˀ,,5jaa51-$՟՟ ja,g€,ajYY՟ۺ5ۺ1-7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<<0I$I$I$I$I$I6mmm$I$I$[mmmN 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1Е-sN٣d$TȴдUUUUUUUUUUUUUPTUUUPUQETPUT`ۺ՟j55՟5s,ˀ5YU$=bI՟$jˀaUs,[,sg€[[I>[sjÀ[$ 5 50j 5 5$ 5 5+~7~7s+|j$jjj+|I>= $= = = = = = = 0$= | 5I>I>I>Usj 5 5|+| 5j$Usj+|a$ss777++|0I>s՟g‚|7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<T0I$I$I%$I$I$ImmnI$I$I$mЊ 1Е-sN 1Е-|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUQU`,[g€5j$j$[,jj$aUsg€0 50,5ˁhht[怽5$= = ՟g€0,%Q$Iˀssˀۺ$ۺj5 $$$Y=bj $Y՟5ۺs[՟ۺ1-[$ˀg€s[j,a,sg€0 570[sasUssg€aaa= = g€I>$j+|j~~|= ,,,g€7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<h0I$I$I%$I$I$ImmnI$I$I$mmЊ|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:5τd٣d$TȴдUUUUUAUAUTUUUUEUUUUUUUUUUUUUUU`aUs[ag€UsUs$I>sa,[ 5 5I>$[[Us0+|0$+~| 5$ˀ,5,j+~7}+|0$0$$ 5$$0[g€s,,,= $070a5jaۺ$$ۺY Y$j[g€ˀjjjtP$՟$j1-YYjˀ5,[,,s,jۺYۺ5՟5ۺ՟jˀ՟7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_{B!B!B!!B!B!B1c1c1cB!B!B!JP:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD٣d$Tȴд@]1 ''@00P&\&%dAY28 #`] O2 }0#`6z$t> F0G$HА|(?x,@ ^ PO^szP  5 50|aА 'F0ۺd = ,ۺ KT'@OXI O&%lV`w L w@9^ˀυ 0!F0|$28 P 3@^υ1Ĵdp~`jj7777UBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0I$I$JI$I$I$mmmܒI$I$I%mЊ2BT5τe:VD2BT6[\S R>[\S R>[\S R>[\S R٣d$TȴдUUUUU@UUUUUUUUUUUUUUUUUUTUTUU`$0$$j՟j,j$ajsaUs0~~77|j= = 0UsUsUsUsj՟Y՟jYasag€0Us,ۺY5j՟,j՟1-$ˀjjs,I>I>Us= 5= a5ss[[s[g€$[U=b ,g€,ˀˀg€Us= +}+|sss5I>I>Us= ++|j 5 5UsI1-1-$ˀ57777`BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@,0$I$I$RI$I$I$mmmI$I$I-mmЊ>[\S [2+k" c*[2+k" c*[2+k" c*[2+k" c*[2*٣d$TȴдUUUUUUUUUUUUUUUUUUUU@UUUUUUUUUU&%`,ˀsυ7G tP7G+$ۺ[C#6,υP[g€$6C#,OXas[aOXC#,aaˀY+C|ۺ7GYC|tPυYC|$YPˀ$$ۺaOXj6C#P ˀOX 5~̂~~̂|ˀ$Y P$$$C|$+ υۺaۺۺۺۺυPPYPۺs7777`BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@@0 $I$I$RI$I$I$mmmI$I$I-mmݶ`k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" clktd)٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUU`,g€I>[I>$$j00= I>= Usa5aۺ1-5g€= 5~+|I>jja,[[Us= Ussa[= $j+}+}|= aa,sg€0= = = ssUs[g€I>$jj$I>$$ˀaa5ۺ$IÁ Yjjˀˀjۺ j$U$I$YY$j5,Usg€ˀj7777`BUFRb f  2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@X0I$I$I$I$I$I&mmm$I$I$mmЊlktd)lktd)lktd)lktd)|#)Ҷ!:|"٣d$TȴдUUUUUUUUUUTUUUUUUUUUTUUUUUUU`5՟՟j՟jۺۺ՟՟ˀ,I>j՟jaˀ,s[[[5g€a՟5aasUs= Us 57s7|$$0$j 5= = 0I>ˀˀ[0I>[s,55[[= Usg€g€s,,ssI>j}jsYI$$   $$ YY$s+~7 5Usaa[I>= $I>0$Us,57777`BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<BUUUUUUUUUUUU]kZַ{{{s9s9s;{{@!B!B!D )Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ٣d$TȴдUDUUUUUUUUUUUUUUUUU@UUUUUUUP`[Us0$+|+}| 5g€j՟ˀˀ5ˀۺY՟$ۺj$$j55ˀˀ$Y$$Yۺ IhU[IUI ۺ՟՟5ˀjI=b s[,ۺj՟g€I>[= j0~}7~7}jg€$ۺaUs0$jUs՟ۺ$a,UsI>= [,ۺY$asUs 57|7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@< 0I$I$I$I$I$mmm$I$I$ImmЊ!:|#)Ҷ!:SmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\٣d$TȴдUUUU@UUUUUUUUUTUUUUPUUUUEUUa+|Us՟Y5՟ˀ՟5՟a,g€I>}aa7Us,g€Us= = $՟jI>= Us= $g€ajj5ˀsUs,[[$$IYsj 5 5+~+| 5sa,s,,aˀ5asg€sg€= j 5+~+| 5g€5՟ˀˀ5ˀ5՟,,asUsUsj+|$77+|I>Us,,aasg€s7777BUFRb f 2  +,-ZZ!rLEICESTER CENTRE 1% t#StЌ @@< 0I$I$I$I$I$I6mmm$I$I$[mmmFSmpC!Lt%Kc\FSmpC!Lt-sN 1Е-sN 1Е-sN 1Е-sN٣d$Tȴд@ `,υY[[[C#= $ 5sY1- υs,ss C|hC|$ˀυυYPˀˀˁ YPˀۺYhOtP$ۺ,aaaˀs,$[[1-ÂY,[OXOX$00gtP[O1- 5Y$$1-C|υ[C#j$= $$OX1-Y$$$$C|$[h$[}Á7777UsBUFRb f 2  +,-ZZ!rLEICESTER CENTRE 1% t#StЌ @@<80I$I$I$I$I$I6mmrI$I$I$mЊ 1Е-sN 1Е-sN 1Е-sN 1ж5τe:VD2BT5τe:VD2BT٣d$Tȴд@aYtP1-j[= I>s,sˁ $=b$ÁH}} 5s= 5OXˀOX0I>OX[= [υ Y$$ja,,OXaۺY$j$υυj$ $5ag€I>= I>$jOXYjˀ5ˀaυ=bˀI>j 5$ 5OX5 1-ۺaˀ,ˀjYۺˀ$1-$ˀ[[g€sI>a5$υ7777UsBUFRb f  2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<L0I$I$I)$I$I$MmmrI$I$I$mmЊ5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5Ќ٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUEUUU`ۺˀj$=bI$$I1-՟,[aˀ,՟=b1-=b$=b5saۺۺ $ $ ˀj՟$$$[a$=bU$$=b jaja,,ˀ5ˀsaˀ,a,$1-$$՟՟,I>= 0$I>$Y՟5ۺۺ IIU1-$ۺjˀs= $$|= Uss,[Usg€,,g€I>= 7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<`0$I$I$II$I$I$mmmےI$I$I$mmm`JBJƹJBJƹJBJƹJBJƹJBJƹJ٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUU`I>$$jj[= I>a5Y5ag€g€g€,,՟h1-՟ˀa[I>+|+~+| 5[55j՟ۺYj$՟55՟5g€,sI>= +|$ˀ$,g€55 1-UUII=b1-  Yۺj՟jIh[՟ ˁ$I=bh[恀$j,ag€[= I>I>Ussۺ$[g€s,ˁ=b$=bIY$$j7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUU^{{{{{B!B!B"!B!B!C1c0BJƹJBJ>[\S R>[\S R>[\S R>[\S R٣d$Tȴд@= \I>PH '&%[Ĵ 3@X@. h/M`X@n6&\~w@I>ah&\!= m5bd?x q$ 5I>$I `@@%Ĵ Xp/M`X@1-&\ hB@O 5&\B@-P/M`g€ۺY|(~w@2Zd@1-d ' 'jz$KT XF0a. L&%d@5KT L-P/M`LK@ab|(#`63@ 57777=BUFRb f 2  +,-ZZ!bLEICESTER CENTRE 1% t#StЌ @@<0$I$I$JI$I$I$mmmI$I$I-mmЊ>[\S R>[\S R>[\S S2+k" c*[2+k" c*[2*٣d$Tȴд@)2\ q#۰F0nυ А\*g€υt> P\@@[υbZ> P#`F0n 1n j3@g€ۺtАE#`9,Hd }E-pZB$ > X#۰@@g€υn6> #`@@,C| > 40#`@@,ۺ 5\ F0=bzW0 P= G 28#`3@a|(B@`*OXz Xw@9m$28%bPF0n+7777&BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<$0 $I$I$RI$I$I$mmmI$I$I-mmv`k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" ٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUEa[1-$Yۺυ555j5jjυυυۺۺ5jυυ5ˀaI>OX,a5assg€sg€g€,sOXg€g€[OX[[[OX[[aˀss,55jjυۺۺۺjυ5ˀˀυ=bYυ 1-Y1-$Yۺ$$$   5555ۺ1-[ Y$$ۺ Yjss$|I>7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<<0 $I$I$I$I$I$mmm$I$I$ImmЊc*[2+k" c*[SmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\٣d$TȴдUUUUUAUUUUUUUUUUUUUUUUUUUUUUUUU`5Y1-5j5jY $ۺ5ˀ,= 0j7+|jY$YI[I1-1-U1-$$ۺUs= [,$=bI1-$՟ jۺ=b$Y  ՟՟5՟՟j՟$UIU$Y$՟$1-1-=b$Yg€I>I>= +}0= I>[I>[[,5$$՟j՟jjjjˀ1-՟$$j7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<P0I$I$I$I$I$I&mmm$I$I$KmmmЊFSmpC!Lt%Kc_td)lktd)lktd)lktd)lkt٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUa $U$U1-1-ۺˀg€Usg€I>= g€5՟$՟$1-$ =b=b$$$j,[saUssˀ$1- Y UUUUU=bj՟ˀ,,,Yjjj5՟՟ۺYjj,I>I> 5= g€jY՟5j5՟՟5aas[Usj7+|[ YY$a՟ۺˀˀ,ˀ57777BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UU\9s9s9skZֵkZֵkZֵ{{{s9s9s9{{zd)lktd)lktd)sN 1Е-sN 1Е-sN 1٣d$TȴдQUUUUUUUUUUUUUUUUUUUUUUUUUUUU `υ 5Z|jH|[= g€$jOXasC#ˀg€ۺsPOX66-6-Z|OXg€= ˀsC#g€g€aP5P[,υ  = 00C#s,,,ˀaaˀˀa,,ˀˀaˀPPυ$$$$P55Y$1-ۺˀP$$Y$YۺP5ۺ55PP5Y$1- YY$υ7777BUFRb f  2  +,-ZZ!bLEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$I6mmm$I$I$[mmЊ-sN 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1ж5τd٣d$Tȴд@]&\ -P5gjۺ~w@6mۺHV~ X)2LK@ad0,@ X@aI.&\ L)2LK@aI1Ĵ  ,@ X@aυd0)2X@I.Ĵ h0&%F0sbbZc `F0ˁI.d&%X@5АdpB@-P2ZF0= |aaP`-YI.Ĵ h0`Re՟1-bZ P$$I>$ ')2m t.?x Yw@/M`LK@a7777PBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I)$I$I$MmmrI$I$I$mmm`:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD٣d$TȴдBU@p`@r@@@r@l@_@S@MS@_@l@@@@r@@@Ͱ@F@{@{@Ͱ@Ͱ@iiii4)=5rMSAAAxAxA`,AMSAAxAA`,A`,AAxA AXXlBB$BBAjA>B,N5AB A AAii)=AjAjB5lB$A5BC)S Å}CNڗBڗBbBZj5ABlB`BڗB-BbBlBBXxASASA`,AAA5A`,ASA5r7777PBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<00$I$I$JI$I$I$mmmܒI$I$I%mЊ2BT6[\S R>[\S R>[\S R>[\S R>[\S R٣d$TȴдUUUUU@UUUTUUUUUUTUUUPa1-$1-ItP[UI=b$$ۺ$ˀ,= j7+~77,ۺ=bII1- 1-1-[$Y[ 5}g€ˀjjg€ˀs= 5,,Us$ 5~}~7sa70[g€sUs0$00Us[Us= I>= 5}sa7 5j 5j 5j$0$= I>$$j~~7++| 5$I>7777PBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<D0$I$I$JI$I$I$mmmI$I$I-mmЊ>[\S R>[\S RB2+k" c*[2+k" c*[2+k" c*[2*٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU`$UsUsUsg€sUsaa,55$ I1-tP1-=bIIU[Uhh=b1-$$Y$$$1-hUU$$YY1-Y՟sUs 5j77,UhIU 1-tP[[=b1- $[I>Usˀۺ$Y՟ۺۺYY$  $$՟ۺ55j՟Y$Y Y1-ItP=bU$57777PBUFRb f 2  +,-ZZ!bLEICESTER CENTRE 1% t#StЌ @@<X0 $I$I$RI$I$I$mmmI$I$I-mmv`k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" ٣d$Tȴд@]I IА @ @j|&\ X5gd@jb%  q^jId?x P`*UsYh.I>X@51 != jА?x  X@jb B@-0I>$d0/M`^ˀ$I>I.?x X,@ LK@$?c '\&%I>$IĴ05gjjH28 +|LK@z՟I L C#RebZc |( 'OjI>7777$BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUTD]{{9s9s9s{{{{{x!B!Bc*[2+k" c*[2+k" c*[2+k" c*[2+kC!Lt%Kc\FSmpC!Lt%Kc\٣d$Tȴд@3@XАB@UsPW0jmw@1j,?xj= ajU)2՟А a)2sUАOajUs$I 'j| @ 50PB@I>I>PАB@$a$00P @ 5aI '$PАB@= P @ 5$| @ 5$|Ija 50$АB@0$АjmHW0OI> 5ja '= $5gԃ% Y;`57777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0I$I$I$I$I$mmmI$I$I-mmv`FSmpC!Lt%Kc]N 1З2+k" c*[2+k" c*[2+k" c*[2+k" ٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUQUUUUaY՟5j5ˀˀˀaˀ5՟ Y $$$$Ԁ՟Ԁ$5՟՟ˀjj$  ՟j՟Ԁ՟$jsag€g€s,5ˀ5՟j՟jԀԀj5jˀ5ˀˀˀ5j55a,sg€= = $0= j 5+| 5+++++++|jaassaˀԀԁ$YaUsa+~+|7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@ 0 $I$I$RI$I$I$mmmI$I$I-mЊc*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[٣d$TȴдUUUUUUUUTUUUUUUUUUUPUUT@QUU` 5= a,g€g€g€I>ˀaI>0j~}777+|jˀ$jjjԀԁY՟ˀs,a0+++~7+| 5,b=b   $b1-1- 5= ԁ  Ԁ5jԀjasaaaa$77|jUs,,g€Us= Usajˀg€= $+|~7||= aˀˀˀˀ7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@40 $I$I$RI$I$I$mmm$I$I$KmmmЊ2+k" c*[2+k" c*[2+k" c*[td)lktd)lkt٣d$TȴдUUDUUUUUUUUUUUUUUUUUUUUUUUUUUU`՟5g€UsI>0j+|+}7+| 5 5j= I>ag€ag€g€j՟5ԀԀ55$$Y 1-$$   $ 1-aaaa,ˀ՟jjˁY$ԀYY $$$Y$1- Y$bUII1-=bn6n6$Y ՟ˀjj5aˀ5jYY$IU=b7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@L@"""""""""""#33333fffffwwwwwwwwwwwwd)lktd)lktd)lktd)τe:VD2BT5τe:VD2BT٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUTAUUUUUUUa$ԀԀ՟ˀj5aˀˀˀˀԀj555՟$ 5՟ԀԀ$$YYԀjjg€aaaUsUssa= = = = $0= 0= 0j0jj+|+| 5 5j0I>g€g€a$0= saI>= $$jj+|++|0s5s,I>ag€,,ˀ,Usj0I>jj 5$j$= = ag€s7777 BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<BUUUUU]kZֵkZ{{{9s9s9s{{{{{{5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT>[\S R>٣d$TȴдUUUUUUUUE@UUUUUUUUUUUUUUUUUUUUU`s՟$$1-ԀԀ$$՟ˀg€I>= 0j$00$$j0$$$ 5+| 5 57}77+|jI>jˀg€asass5jUs$= = $j$$$0I>a5jj5jjjԀ՟՟,ag€I> 5j$j 5$aa5aԀ՟5jsaI>= $ 5$j$j0,jԀԀ՟՟՟Ԁ$$5j7777BUFRb f2  +,-ZZ!bLEICESTER CENTRE 1% t#StЌ @@<0$I$I$JI$I$I$mmmI$I$I-mmv`[\S R>[\S R>[\" c*[2+k" c*[2+k" c*[2+k" ٣d$Tȴд@\υn6ĴW0 `O-ۺ?n0!6mۺА 9sjzk Y @@d@jzkV~ = , А )2OXˁ b.#`s dKT Y!= z dw@6mۺtА Lp)2= Ĵ q`3@,c `3@a$ q\O 5||( `&%^5.KTB@#`F0a$.dpO!C#,Y77775BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0 $I$I$RI$I$I$mmmI$I$I-mЊc*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[٣d$TȴдUUUUUUUUUUUUUUUUU@UUUUPUUPUUa$ԀjԀ՟՟$$I$Y Y$ $Y1-1-II1-Un6Á-$tPIԁ  j=b=b$Ԁaaaa,ˀjˀg€,ag€Us0 5j7|$0aUs,g€sI>g€ajs= 0 5~7sa7+|0= 5= sY$5,$saOaa+|a1-U$jY$ˀ7777jBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<00 $I$I$I$I$I$mmm$I$I$ImmmЊ2+k" c*c\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSl٣d$TȴдUUUUUUUUUUUUUUUUUUUUEUUUUTUUUU`$$jaUs$$$ 5j$j 5jI>a5j$ $1-Ԁjjs= 0= I>ˀԁ$n6n6bY$bbtPtP=b1-I =bUn6b=b$$$՟$1-$jaa= +| 5a0j= I>ˀԀˀˀˀaassg€g€0+~7sss| 50aUss,a,,5ˀssI>7777jBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<D0I$I$I$I$I$I$mmm$I$I$Immm۶`pC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!L٣d$Tȴд@UTUUUPUUUUUUUUUUUUUUUUUU` 5~+k,,b>tPb| 5$= I>Us[= I>}b>btP,,+k$s,,ۺajˀ,[= 5}bb>+ktP>tP}| 5[,Us0= = jj$[5j՟sg€,5jjj =bUII՟՟$Y$=b՟aˀ$1-UbI1- bIbtPhU=b=b$$$$  $7777jBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<\0I$I$I$I$I$I$mmm$I$I$[mmЊt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc]N 1Е-s٣d$TȴдUUUUUEUUUUUUUUUTUUUUUUUUUUUUUUabtP=b=bY =bIjˀg€asUsI>UsI>+|$I>s$Ԁ$Y5Y,b$g€I>= $j7 50,g€I>$0sˀ5g$$tPtPUԀUs++|I>ˀ51-IaYUÁ$$tP$n6I$$$=1}n6Y$1-$Á-U=b1-$IÁ-=bsԀ՟b7777jBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUUUUU]{s9s9s8!B!B!B!B!B!B1c1c1c@N 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1Е-sN٣d$Tȴд@a}%Q}IV%}tÁhh}htV%$ItP$ ht%QH-hIYˀ՟$hYbUbhb$tP$$ˀ,[I>[ˀۺ$$$$=bIbb$$jUۺsI>$j 5$I>g€ˀaUsg€ˀ,ˀ,ˀˀ 5jj 5$jYIhj1-hhtP1-U1-ۺ7777BUFRb f2  +,-ZZ!bLEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$I6mmm$I$I$[mЊ 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1٣d$Tȴд@\P `/M`GIz `&%UsUbf )$X3] ]A dp X-PLK@n6 O3UstP1B qp8u ^υ$$ @j5YPI @ 5jUs$IА O0aa$А `F0&\ h2ZzI qp = G,| I ` d@1-bZF0H p 5gd@jéĴ,@ Reˀ7777jBUFRb f 2  +,-ZZ!bLEICESTER CENTRE 1% t#StЌ @@<(0I$I$I$I$I$ImmnI$I$I$mmЊ-sN 1Е-sN 1Е-|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|"٣d$Tȴд@#`\υ1?xdp@@ˁ>?x0j#`@@sυ>|(= tP.&\ $@@[JIc tj,@ 3@= a$ @@zkbZ h P 9bbZ>|(dp '0I>aPI  3@C#G|А@@ˁt @&\ h '@[=bl/M`ReYn6l28 q#`a$1d `!C#I>Pl|( 3@m n?x I>A[7777jBUFRb f2  +,-ZZ!bLEICESTER CENTRE 1% t#StЌ @@<<0I$I$I%$I$I$ImmnI$I$I$mmm`)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ٣d$Tȴд@^. Lp$5gLK@s l~#`LK@5bc p&%X@jzk.d  #`3@ˁ1-UW0 `OLK@a1> L &%^5bbZĴ P#`9a0$А ',@ X@ˁĴ?x5gdAYI&\ 9d?x0#`^՟KT Yp,@ , H X`*$0\@@sυ|( '`9g€υ  'B@j[7777jBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<T0I$I$I%$I$I$ImmnI$I$I$mЊ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUQU`UsUsg€a5Ԁ$$Ԁj=b   $Y$՟j5՟YI=bԀ՟Y$1-U$YY$j՟՟jjԀ$ $$Y$Y$ =bU$$ 5sI>$0I>= Usaag€a= = UsI>UsI>aUsI>$j+| 5j 5+~| 5jI>g€ˀg€ag€ag€sa5ag€I>I>Us$+| 5~770g€aa7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<h0I$I$I)$I$I$MmmrI$I$I$mmЊ5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τd٣d$TȴдUUT@@UUUUUUUUUUUUUUUUUUUUUUUU`asUsI>= UsUsUs 5+|0+|aa7aa++}~|$+|$ $bU=b1-=bˀ՟ ՟,ag€Usa5UÁtPIn6I՟5j,g€a՟ԁ$$՟5Y$Ԁ $n6ԁ1-=bU1-ˀUsˀ5ˀˀ55Ԁ5$ Ub=b ՟aj՟5՟Ԁa$g€= I>g€= ag€7777BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_{B!B!B!!B!B!B1c1c1cB!B!B!JP:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD٣d$TȴдUAUUUUUUUUUUUUEUUUUUUUUUUU`5asUs++| 5a՟5aI>$j0= Usg€I>Ussbbn6II1-I$tP1-1-=b՟Y$5g€ˀ,,Us+|,$՟j 5 5| 5$ 5j$Usg€ˀI>$0I>000aԁ s 5jj= $j= = = g€ԀԀˀUs0 5= ԁ1- Ԁ= 5~}s777+~~} 5 57777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@""""#33333333334DDDDDDDDDDDEUUUUUUUUUUffffffffffffwwwwwwwwwwp2Ctd)n|#)Ҷ!:|#)Ҷ!:>[\S R>[\S R>٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUc~}|j[sa 5I>a,aI>I>g€[Uss,ˀ՟ ۺˀˀ՟YIhb,I>Ussa՟$bbh=bbYU$btP-hÁIUIjtPÁU5j՟՟jass[g€,sUs[s,aa,aˀˀ՟  $jˀa[,[I>g€5jˀ,s[I>Usg€= I>I>a7777BUFRb f 2  +,-ZZ!rLEICESTER CENTRE 1% t#StЌ @@<40$I$I$JI$I$I$mmmܒI$I$I%mmn`[\S R>[\S R>[\S R>[\S R>[\S R>[\٣d$Tȴд@,@ `C#6j6C#66 5C#OXC#[,OXOXOX,g€[,$$ Y+$7G  7G?h7G[$$YY+[[Y,OX*j[P $$$$[hh+h[tPtPhhO+tPt$OP$υYhC|ۺ [C#g€6[$g€a$ۺs$υg€C#sg€[7777BUFRb f2  +,-ZZ!rLEICESTER CENTRE 1% t#StЌ @@<L@""""""DDDDDDUUUUUUUUUUUUffffffffffffwwwwwwwwwwpS R>[\S+k" c*[>[\S R>[\S R>[\S R>٣d$Tȴд@ _ f ,\'@= g€zkd ,p'@Re(A1-d 0w@#`Re5Ĵ -piI ]AU1->|( 3@,Y.|( P#`F0jb.dp P&%= ,Hd$ L0$s d#`F051- zА q 9ۺ А P #`3@sn6 P q#`LK@5c 0-jd?x~)2Re1-1KT P/M`(A1-7777BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUU\:ֵkZֵkZֵk[{{|9s9s9s{{{B[\S R>[\S R>[\S R>[\S R>[\S R>[\٣d$TȴдUUUUUUUUAUUUUUUUUUUUUUUUUUUTA`5Y5ԁY$՟ˀ$Yjjˀ5j Ԁˀsg€I>= s+~|Us= j++~~7+~~7|Us 5Usjj$Us5s,g€a5ˀˀa՟btPbI1-$ ԁ$Ԁˀg€s,I1-1-YˁYg€g€sg€I>I>Us,j՟՟ssaˀjaUsag€I> 5+| 5++| 57777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0$I$I$JI$I$I$mmmܒI$I$I%mЊS R>[\S R>[\S R>[\S R>[\S R>[\S R٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUT@UU`I>j5ˀa,ˀssI>= g€= = $0 5 5$,ԀԀaasg€sjaj1-n6I$՟Yg€ˀ5Y5jjaasa5I՟=btPI՟Ԁ Us$$0$$j0$a,Y=b=bԀ$՟՟1-$= aI>00$j$Ussg€s= = j+|77ja,0$j 57777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0I$I$I$I$I$I$mmm$I$I$ImmmЊFSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSl٣d$TȴдUUUUUUUPUUUUUUUUUUUUUUUUUUUU`jjj 5j$= = +|= jjI>՟YsaI>aUsUs$I>I>$0I>g€g€g€$+|jsˀ՟ˀaI>= I>= = Us= I>0= $a 57s7+|Us5ˀsI>I>I>sI>,$UsI>,aI>0$jI>j$= ,5jˀ՟,s$jI>I>ˀsa,g€I>I>I>Us$+|$= 0,aa0I>ajԁ$bÀ7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@00I$I$I$I$I$I$mmm$I$I$Immm۶`pC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!L٣d$TȴдUUUUUUUUUUUUUUUUUTUUUUUUUUUUUUUa$b=bԀ՟՟ $$551-՟,Ԁa5j$s$=bY$ =b$,aa$0$j$0j00Us՟55UI$1-aaag€a= aUs$jj0|j 5$Uss,ԀԀ5g€asUs= I>0j 5 5jj$ 5 5~7j|jja5g€g€UssaaI>g€5g€I>I>s,,asa0g€,a7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@H@"""""33333333333DDDDDDDDDDDDUUUUUUUUUUUUffffffffffffwwwwwwpt%K[\e:VD2B>[\S R>[\S R>[\S R>[\S R٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUEUUUUUUUU`assUsaj$= = $j՟ԀjˁY$ˀa$ 5jI>a jˀ55ˀ՟ˀ՟$bUsI>aUsI>g€j$$՟j5jY՟՟$ԀԀ,0jj 5$I>,ˀsaa,g€՟I1-j55sa0+| 5j05Y$Ԁ5IUI$$ԁ Y tP 5ˁ$$5ԀˀsaUs= 7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@d0$I$I$JI$I$I$mmmܒI$I$I%mmЊ>[\S R>[\S R>[\S R>[\S R>[\S R>٣d$TȴдUUUUUUUUTUUUUUUUUUUQUUUUUUUUUU`[= ,g€Usg€,sI>ssˀaaUsI>I>Usg€UsI>UsUs= Us[[[= [ˀsˀI>$bbbtPtP}|j$I>= UsI>I>$= I>= j1-Áb$=bY5ۺ $՟՟ $j5$5,= j 5| 5$g€sasUsg€= s,[5,ˀ,g€Us= I>jjjjI>I>,g€j՟ˀ[s,Usg€I>I>7777BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<BUUUUUUUUUUUUUUUUUUUUUUUUU^{{{B!B!B"!B!B!C1c1c1!@[\S R>[\S R>[\S R>[\S R>[\S R2+k" ٣d$TȴдTUUUUUUUUUUUUTUUUUUUUUUUUUUUUUU`g€Us 5+~77 5Us= Us= I>I>I>UsUssg€= $= I>5Y$ˀg€aI>I>= = = 0$00$0$0I>00I>ԁY$՟aUs0= 0 5| 5jj$j 5$$aˀn6bYԀj՟$$,Usasˀsja,ag€I>= = 00aj5j,a՟n6 ˀg€g€7777BUFRb f2  +,-ZZ!rLEICESTER CENTRE 1% t#StЌ @@<0 $I$I$RI$I$I$mmmI$I$I-mЊc*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[٣d$Tȴд@#``5Pۺ5$$ۺPaPۺh$ IˀυYtP$5as[= C#0C#OX= C#,υ$υPsaυY=bۺۺ$h ۺYI$=1-Y g€s[ 50sag€s,sOX,s,s,ag€OXۺÁ[[Yυ,OX= C#OXC#C#0= = $0C#,$,g€sOXC#jg€aa$ υP7777=BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<(0 $I$I$RI$I$I$mmmI$I$ImmmЊ2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+`C!Lt%Kc\FSl٣d$TȴдUUUUUUUUUUUUUUUUUUUUQUUUUUUUUUUU`ۺjۺۺۺ$՟՟Yj,,aYYۺ՟jjۺjjˀas[= jI>aˀ5jaasa,ۺaaˀ$1-$ˀYYI5aaUss,a5Y$j$j| 5jI>jۺg€,g€s[asI>jjI>,g€j,5$Y $1-,[j= $0$= 0$0UsI>I>7777jBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<<0I$I$I$I$I$I$mmm$I$I$Kmmmݶ`pC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%lktd)lktd)lktd)٣d$TȴдUUUDUUUUUUUUUUUUUUUUUTUUUUQU`Usa$$ˀUsaI>= $j 5 5+|++| 5j0= I>aa0asY=bYItP$$55Ԁ$jj$$ ԀjasUsa= = I>s՟՟j,,,ag€aas$0$$| 5= I>ˀ՟ssssg€aaUs$= 0$ 5~~~++|Us,asˀ5Ԁ՟Y jˀ,s= 5+|$ˀ7777jBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<T0I$I$I$I$I$I&mmm$I$I$KmmЊlktd)lktd)lktd)lktd)lktd)lk٣d$TȴдUUUUUUUUUUUUUUUTUUUUUUUUUUUUUUUU`5$Ԁԁ 1- ՟ԀԁY=b=bY$ˀ5ˀg€g€ssԀԀ՟ 51-Y՟ˀa= j$00$= 00= I>g€ 5 5 5 5+|0g€ˀ$jY=b Yj =b1-$=bIԀa$5aUsI>ˀԀ5jԁY$YY5,ˀ՟a$ÀԀ,$j$g€aaˀ՟j$Y$$Y7777jBUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUU\9skZֵkZֵkZֵ{{{s9s9s9{{{td)lktd)lktd)lktd)lktd)lkt٣d$TȴдUUUUUUUUUUUUUUUUUUUTUUUUTa՟՟՟Ԁˀg€UsUs= j$aˀ՟5ag€ˀ5՟ 1-1-1- ՟$j$jY$1- jj5jjˀI>I>$j+~~777$= ag€aUsa,,g€Us= ag€= Us$a՟asg€= j~|+|+++|jj$I>Us0$7ss70= = $ 5j$sg€saI> 5$a0$+|7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$I6mmm$I$I$[mЊd)-sN 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1٣d$TȴдUUUUUUUUUUUUUPQUUUUUTUUUUUUPa+|0I>UsaasUs,$ 5jj$I>$= aYj,$a$I>jI>I>asa,sg€I>$= jj= = Usaa0$j$I>= Us00$+~7++|j0j 5+|++~}7j0g€I>aaaaa՟$j,,ˀ,,= I>s0j+|j00$I>g€g€I>UsaI>= UsjY՟a$= I>00777777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$I6mmm$I$I$[mmЊ-sN 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1З2*٣d$TȴдUUUUUUUUEUUUUUUUUUUUUUUPUUUUb~+|+||jj0jUs= j$jI>՟ˀag€,g€a,aˀaaˀˀ,$j|aajaˀaa,UsUsUsg€g€Us$ 5+~77~7|$Us,s= = 0= 0UsUs,Us00UsUssaI>,sUs= I>aaUsUsI>I>0= = I>Us= I>sI>0++| 5$ 5 5$ 5$= I>g€ˀ,jj7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<00 $I$I$RI$I$I$mmmI$I$I-mmv`k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" ٣d$TȴдUUUPUU@@UUP@TPUU`aa5,sasI>$jj7~+| 5 5j$$$$= $}77++~7~77+|0 5 5}+|$Us,,,I>= $I>I> 5+}7777|+}77~}77+|= g€s,$+~7+| 5+} 5j$jsԀԀ7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<H0I$I$I%$I$I$ImmnI$I$I$mmЊc*[td)|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|"٣d$TȴдUUUPUUUUUUUUUUUU@UUUUUUUUUUUUa$Un6՟՟ˀjYajj= $+~7sas+|$ n6U=bԀ,ˀ՟ˀˀUsI>= Usˀˀˀ,ˀ$$UUI՟jsaI>a,,ˀԁYa5a$= g€aUssg€ 5+~++|$ 5$s՟$jaI>= gU}Ԁjˀ5՟aԁYjˀUsI>sjb IÂ}tP$=b=bj7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<\0I$I$I)$I$I$MmmrI$I$I$mmm`)Ҷ!:5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD٣d$TȴдU@UUUUUUUUUUUUUUUUUUUUUUUUUUUUU\P @~B ,А P#`95bV~ X-P8u ^bZ L@@a1c ?x0^ˁ1-d?x~2Z@@ad O&%I>G՟?V~8u 3@s &\-P F0g€P?xO3@I>|$d h0 50I>P H @ `Oj$YbZ h `j*I>0aI?x 5OF0aaUI ' 5O, @ ' 57777bBUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUUUUUUUUUUU^s8B!B!B"!B!B!C1c1c1d!B!B!B)JR)JP2BX>[\S R>[\S R>[\S R>[\S R>[\S R٣d$TȴдUUUUUUUUUUUUUUUUUTUUTUUc+|$0$$0j$0$Us= = UsaI>$$jUsUsssg€UsI>I>= I>jI>sasasˀjaa,,g€sg€asI>g€g€ass,ag€aa՟1-՟aUsa,Us0s 5ssaOOasaOss+~77~7~777+|0sg€I>j 5 5+~~| 5= I> 5j++++|$,YbIjˀ7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0$I$I$JI$I$I$mmmܒI$I$I%mmЊ>[\S R>[\S R>[\S R>[\S R>[\S R>٣d$TȴдUUUUUUUUUUUUTUUUUAUUUU`ag€sg€ag€sUsg€Us 5s7jUsI>I>I>= 0I>I>UsaUsaag€aˀˀˀˀˀg€,g€sjg€I>sg€g€,ˀ5j5s 5+~~|+|jI>g€ag€g€ss,sag€I>I>j+~|~777j0= 0Us= g€g€aUs$ajI>,asUsaOOOa+|a}ss7 577775BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<,0$I$I$JI$I$I$mmm$I$I$Immm۶`[\S R>[\S S\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!L٣d$TȴдUUUUUPUUUUUEUUUUAUUUUUUUUUUUU`g€s= ~7~7$j5ˀg€I>ssUsY50I> 5j++| 5$$0sjԀ՟ˀ,ˀˀjԁ$s 5+| 5++|Us5Y$՟ˀˀ՟5aaԀˀg€+| 5ss70I>Ԁa՟a00 5j,5=bbYj5$=b$YYj UUIs,jj,ↂt%Q}sY77775BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<D0I$I$I$I$I$I$mmm$I$I$ImmЊt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\٣d$TȴдUUUUUETUUUQUUUUUUUUUUUUUUUUUUUUU`a5,,0g€0= I>g€-tPY՟a+| 5$I> 5j+| 5 5j 50g€a$n6n6s|jj= a g€0a 5= 0$՟$U,aˀ՟,b$=b=b1-}}}Án6IYUb bIԀjj5ˀag€sUsa0,= = a՟$bI ՟$5a,sˀ,aUsI>Us,77775BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<X0I$I$I$I$I$I$mmm$I$I$ImmmЊFSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%lkt٣d$TȴдUTUUUTUUUU@UUUUTUUUUUUUU`5aaaja7|Ԁ5ˀ$a5j,Usj,s= j+~7+~+| 50= = 0$0ag€aI>j5,s07aOOa777~| 5$a,$՟ˀ,5aUs= ssa$$}++| 50g€aj$$՟jj՟js,aaԀ =bYUa՟I=bUs77775BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUU]{{{s9s9s9{{{{{{!Bd)lktd)lktd)lktd)lktd)lktd)٣d$TȴдUUUUUUUUUTUUUUUUUUUUUUUUUUUUU`j= sj= g€՟ۺ՟sۺ5$՟YۺjˀI>}tPtP+k$5՟Us[Us[,g€Usaˀa,= j~+k+ktP}|[ˀˀsssaˀj,sg€՟՟jˀ[Us$= Us,ˀ[[g€,[,ˀ$=baˀa5,[g€sUsg€[I>$ 5I>= $$I>g€g€ۺ$h=b g€0[I>sˀ7777BUFRb f  2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0I$I$I$I$I$I&mmm$I$I$KmmЊlktd)lktd)lktd)lktd)lktd)lk٣d$TȴдUUUU@UUU@UUU@UAU@UUUU@T`aˀˀjj՟՟jˀ,UsUs 5asj$ 5$$asUs= = 0j 5|aas7jUs,I>aI>UsI>$ 5$00= 5+~7saOs 5g€ˀ,s0j++|$= $ 57ssaOa= 55sg€Usg€g€5jjԁ aˀ, 5|aˀaj0+~| 50I>7777 BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0I$I$I$I$I$I&mmm$I$I$[mmmtd)lktd)lktd)lkN 1Е-sN 1Е-sN٣d$TȴдB!B!!B!B!B!B!B!B!B!B!B !B!B!`htPOOjˀsssbZbZtt,aa,YsctHHn6$,j$$ۺυ55ˀυ5ˀssaa,,a5υ=btPÁ$$tPIhOIOI[1-[tPhI=b $OII1- Y$I 5ˀˀg‚bZtHcg€5Y1-$$Y$ۺۺۺ$ $j$Yυ5a7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@40I$I$I$I$I$I6mmm$I$I$[mЊ 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUTAUUEUUUc+}7ˀ5jˀa,a,saˀ$YYY 1-=b $Ԁ5՟ U$$Ԁ$Y%QbZV%%Q n6$YԀ55jYn6$jaUsˀ-HbZ= -tP=bYԁn6bUj= Us$$I>Us,g€ 5 5 5 5|~|I>ssUs= 5 5+| 5j$I>0$I>I>j+}7+| 5I>= 57777BUFRb f  2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@H0I$I$I$I$I$I6mmm$I$I$[mmЊ-sN 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1Е-s٣d$TȴдTUPUQU@UUUPUTUPDUUQUUU`jj+| 5$$+~~7ss|= j,g€aj+|j0jj+~++~}s7+~7~+|= = $jjj$$0= $0jj+~7~~~7j,ˀs= j0+~| 5aI>g€0I>0j77+|0= $| 5~7+| 5$j= = = 5j 5+|,YYsg€a5g€,7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@\0I$I$I)$I$I$MmmrI$I$I$mmm`N 1Ж5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD٣d$TȴдUUUUUUUPUUUUUUUUUUTUUUUUUUUUU`g€aԁ $$jaYYԀԁY=b=bI1-jˀ,$$+~~|$j՟՟՟՟ =bn6tPtPI$ $YjԀ՟,a,,5aaI>$jj7jg€ˀ՟j,,a,ssj$5a0Us 5$I>g€assUsUsUsasaag€a= 0}}7777BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<BUUUUUUUUUUUUUUUUUUUU^s9s9s{{{B!B!B!!B!B!B1c02BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT٣d$Tȴд@UUUUUUUUUUUUUUUUUUUUUUUUTUasa7~|++~|UsUs,I> 5j$++}7 5՟$՟ˀaaˀa՟$1-=bY5,g€,saˀ՟$՟j,aa$$1-=bbU$$a$bZI՟ˀԀ$ԁU$YII Ԁ՟ˀaa5ˀjˀ5aag€sasUssssԀjI>0 5+~|$sԀjg€Us7777BUFRb f  2  +,-ZZ!bLEICESTER CENTRE 1% t#StЌ @@<0I$I$I)$I$I$MmmrI$I$I$mmЊ5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BVƹJBJƹ٣d$Tȴд@\P$Hp8u ^IĴ|(j 5jad  LK@a1 Lp/M`,YА?x  &%3@I>   &%ReYbZc |( `jYR X /M`s՟?280'@= jԁ1-.&%Re|$I28dp5gj5I Y:C#z5dpO:2Zp@՟éR 0\j0P?x= jIV~?xB@ C#|$7777ԀBUFRb f 2  +,-ZZ!bLEICESTER CENTRE 1% t#StЌ @@<$0$I$I$II$I$I$mmmےI$I$I$mmm`JBJƹJBJƹJBJƹJBJƹJBJƹJ٣d$Tȴд@]c ?x@@,$HV~ 6+0X@dAUĴp1PUs O#`F0aԁbRdp '@Re,1-128 O&%LK@G &\|( B@j 5jP L2Z^ˁb -P&%F0aI>|PIB@$g€|P$ @j$aP ' X@1-c |( `*I>z &\ Y-P)2X@?% X /M`RebV~d @ 'j7777ԀBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<<0$I$I$II$I$I$mmmےI$I$I$mЊBJƹJBJƹJBJƹJBJƹJBJƹJBJ٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUAUU`$asaa,aa5$$js$+++~7 50՟Y՟ˀa5ˀ՟n6U1-UY$ Ԁ՟՟Ԁ n6tP1-՟Ԁ$Y1-U=b $j5$j$ 5s՟ԀjˀaˀI՟555ˀj7 5 5 50aˀag€g€Usaaaˀ՟YԀ5a,Us7I>g€g€saaaaa7777BUFRb f  2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<P0$I$I$II$I$I$mmmI$I$I-mmƹJBJƹJB[2+k" c*[2+k" c*[2+k" c-sN٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU`as[ˀsg€a[= $j 5+k>tPtP|I>$ۺjaaaj1-tPbUYjasg€a5՟՟՟jj$ Y$$$Y5sjۺۺ՟՟ˀj$1-UbtPbj՟$$YYۺj555ۺ$YIhh$-$U,I>[Us$ 5= $$1-Yˀ՟Y=bs0jUs007777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<h0I$I$I$I$I$I6mmm$I$I$[mЊ 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1٣d$TȴдUUUUUPUUUU@UUUEUUUUUUUUUUPU`aUssaajsaUssUsg€aԁ Ԁ5gƒ+~77sOa+|$$j$j 50I>0Us՟s0}sa+|I>g€g€,sg€UsI>s5,Us$j 5+|OOaas 5ˀˀa,$$ I$$Ԁg€g€g€՟ jԁYY55j Y1-=b=bˀUsa= ++|jUsj՟7777BUFR&b f  2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUUUUUUUUU_{{!B!B!B!B!B!B1c1c1cB!B!@-sN 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1Е|"٣d$TȴдUUU@UUUUUUUTUUUUUPUU`j$ԀԀ՟՟ˀ= j}ssas7UsԁY$ 5s5I ՟g€= $= 7saa7j= $$$= = UsUsss= = s0+~7+}ssas777~++| 5UsUsg€0$$I>jsO|$I>jˀaI>g€saԀ5ˀg€g€0$+}saOajag€aI>Uss,7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I%$I$I$ImmnI$I$I$mmm`)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ٣d$TȴдU@UUUDAUUUUUUUUUUUUUUUUUUUUUUUaYI>+~7as+|aaUs00aag€j՟ˀaˀ= +| 5+}$,1-U=bԀjԁ$=b1-$Y Y$Ԁ$jjˀ5ԁ$ j՟ˀ՟YY II$1- Ԁss,= g€asˀag€g€g€5 $=btPI$Yb=bYjj՟jj5ˀ՟ԀjԀ՟$tPn6U$ Y$$7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<,0I$I$I%$I$I$ImmnI$I$I$mЊ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:٣d$TȴдUUUUUTUUUUUUUUUUUUUUUUUUUUUUUUU`$$YYY=bbI՟ $$1-I$ 5Us~7sjUsa,a,ss,sj  Ԁ1-$Ԁ,0jUsj=bUY$=bn6$$Yb1-1-=b=bI$I$=b$ $IU=b$1-Y$Y$ԀԀԀ$YYY$Y=bbU$ÁY$tPn6I=b$    7777BUFRb f  2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0I$I$I%$I$I$ImmrI$I$I$mmЊ|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:5τe:VD2BT5τe:VD2BT5τd٣d$TȴдUUUUUUUUUUUUUUUUUUUUTUUUUTUUUU` $$$ԁY$$j$՟Ԁ՟a,a00= jg€g€g€Usaaˀ,g€g€a,ag€= 0+| 50$bUII1-1-1-1-UbtP-YY$55 ,$aUsaj$$՟5ˀaUs 5~+| 5j$a՟$$  Ԁ$jˀa$ 5+| 5Us5j՟$1-$Y$1- UYn67777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<T0I$I$I)$I$I$MmmrI$I$I$mmm`:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUUaUbUb=b ˀg€,5YYjԀԁ =b=b $Ԁ5as,,jjˀˀsas՟Yˀ՟,j$$$$$ 5ˀˀ5՟՟՟I>I>aI>Ussj,ss= I>$I>5j   ՟՟ԀԀ՟5Us0$ 50+}j 50a$ YY$In6bn6=b1-$7777BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUU]kZֵkZֵkZ{{{9s9s9s{{{B!B2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT٣d$TȴдUUUUUUUUUUUUAUUUUAUUUUUUUU@U`jjY=b1-Ԁ5$=b1-$Y$1-Y $Ԁ՟5ԁIbbUb} U YԀ՟ˀ0$ 5 5|ajYYԁY$ˀj ՟,= s+~|aOa+|Usg€s,,a՟՟1-$$1-=b=bYY$$aa0I>= I>UsI>asa$0$= I>j+~77ssss7a5a7777BUFRb f  2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$II$I$I$mmmےI$I$I$mmЊ5τe:VD2BVƹJBJƹJBJƹJBJƹJBJƹ٣d$TȴдUUUUUUU@UUUUUUUUUUUUUUUUUUUUU`,,,5jԁYb=b$Ԁag€UssOsjUs,sI>= Usg€s5Us$|asOsa= ,ˁY$,,j=bU=bI$$  j՟՟j$tPbV%ↂ}I}-$-t U5jj5j5ԁY$YIUI=b$Ԁ՟՟j՟jj555՟՟ԁ ԁ$1-YUYU7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0$I$I$II$I$I$mmmےI$I$I$mmm`JBJƹJBJƹJBJƹJBJƹJBJƹJ٣d$TȴдUUUUUUUUUUUUUUUUUUUTUUUUUUUUUa$bbs,,,sg€a= g€as,aaaaa5՟j՟՟ԁY$$jj55՟՟$ 1-I=b1-՟ajjˀaUsI>I>= aag€g€,,g€I>$ 5 5j 5++|= Ussssg€,Usaaag€g€aUsg€aUs$|7sOs$UsaaI>I>Ussˀ5Ԁjj55j55Usa7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<40$I$I$II$I$I$mmmےI$I$I%mЊBJƹJBJƹJBJƹJBJƹJBJƾ[\S R٣d$TȴдUUUUUUUUUUUTUUUUUUUUUUUUUUUUUUU`$$Usˀ$Y$j=bU=b1-=b1-1-UI=bU$Ԁԁ   YYY$ԁYԀԀˀ,5,0j000+}aUsg€ˀˀY1- Y Ԁj5ag€g€,j՟jԀ5՟ԀԀYY55՟ $$Ԁj՟Ԁˀˀj55,sasaˀ5j7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<H0$I$I$JI$I$I$mmmܒI$I$I%mmЊ>[\S R>[\S R>[\S R>[\S R>[\S R>٣d$TȴдUUUUUUUUUUUUUUPUUUUTUUUUUUUU`ԁ YY՟Ԁ՟5jˀˀaa,,,ˀ՟Ԁˀg€Ussg€s,aˀ,sg€,,,s,aˀag€ag€Usg€g€aaaI>0$ 5+}sas| 5Us5Us+| 5jag€g€ag€aI>0$jj++|jI>0I>g€ssaasag€sg€UssUsj7~+|j= Usa ՟5,ssˀˀsԀ7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<\0$I$I$JI$I$I$mmmܒI$I$I%mmn`[\S R>[\S R>[\S R>[\S R>[\S R>[\٣d$TȴдTUUUUUUUUUUPUUUUUUUUUUUUUUUUUU`՟77a| 5j= I>= $j 5 5I>s555ˀI>= g€Us$aI>= ,ˀˀaˀˀaUs= = g€sg€$5Ԁ5g|g€ˀԀs$Usg€aj՟5j5j5ˀg€sg€Usas,5YY  =bI=b1-Y$YYԀjg€I>a,Us,,g€g€a Y$՟Ԁ՟j557777BUFRfb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUTD^s9s9s{{{{{x!B!B!B!B!B S R>[\S R>[\" c*[2+kd)lktd)sN 1Е-s٣d$TȴдUUUUUAUUUUPUUUUUPUUUUUUUUUUUUU`5՟Ԁ$ԀԀ՟  $ $՟j5ˀaI> 5~7ja$1-YYjˀ5jjԀ՟5sI>Us0+~~}0՟bY 5g€$g€5jajI>ˀg€ 5+}7 5= = I>I>I>,,aa05՟=b1-I$  hhI[[=bIUhIۺ5՟ۺۺˀ՟$$$U1-I1-Y$Y7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@ 0I$I$I$I$I$I6mmnI$I$I$mmm`N 1Е-sN 1Е-sN 2|#)Ҷ!:|#)Ҷ!:|#)Ҷ٣d$TȴдUU@UUUTUUUUUUUUUPUUUUDUUUUP`g€Us0$I>j 57a|$$I>Us[Us= ,ssg€I>Us0$= 5+~7s+|Us$$I>I>[g€s,5j5 ۺ5՟ˀ,,a,5$$=b=b1-ItP[UˀˀI>= +~~|jI>aˀۺ՟ $$YYˁ ՟+| 5+|j$ˀjjj5ۺj՟Y$$՟ۺa777777=bBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@$0I$I$I%$I$I$ImmnI$I$I$mЊ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa0ˀ՟ˀˀۺ,sˀˀj՟ۺY$Yj՟ۺۺg€,[g€55j5j՟՟ۺۺۺ՟jˀ55jۺ$YYY՟jasg€[[I>$I>[Us[g€sg€g€asag€a[Us[I>= $ 5~77 5$[,saˀj [=bY1-Y $ $ۺY5jY1-Ih7777=bBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@80I$I$I)$I$I$mmm$I$I$ImmmЊe:VD2BT5τe:VD2BTFSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSl٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUTUUUU aY$}Y$Y$[[[[C|%QhtP [ Y$$ $   ۺυυYY1-1-hOI1Á$tP[C|$ $ۺۺP $Y1-1-1-1- $5ss0 500OXۺYۺPPˀa5g€= = 0 5 5H}hhZ|$j$j$C#C#C#= ssg€[OX,s07777=bBUFRb f2  +,-ZZ!bLEICESTER CENTRE 1% t#StЌ @@<@L0I$I$I$I$I$I$mmm$I$I$Immm۶`pC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!L٣d$Tȴд@\I>$P `O3@$o Lp+|LK@aI&\ 4\&%I>,$n L2Zjz '~ ``9[1c Lp 9,bn?xB@= zY1dB@#`C#,$1d?x Yw@5gsYn X-P/M`X@ۺc $OX=b1c @@s t -P6sĴdp~!= GYnO.`!`Idp~w@9sY7777$BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<BUUUUUUUUUU\c1c1g9s9s9sZֵkZֵkZֵo{~{B!B!Bt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%τe:VD2BT5τe:VD2BT5τd٣d$TȴдUUUUUUUUUUUUUUUUUUUUUPUUUUUUUUUa=bH}ↁÁ1-Y UtP[tPtPtP$tP=b1-[hPIht1-1-U  $$ÂI YhY=b$$tP- hh1-5՟՟՟= Uss,ˀۺH @g€jjj՟jjjg€j+}7+|jUs,ˀj$Yۺ5jۺ՟՟ˀj,aˀˀsag€,ˀ7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I)$I$I$MmmrI$I$I$mmm`:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUDUUUUUa1-I=b$$ۺ$$ۺ$YU$ۺ՟Y$$Y5aas0jj0$= sˀˀ,,, I[$ˀ՟$jۺۺ5 1-1-[Y՟5ۺ=bhtPhUUY՟a= = ja$$ۺass ۺ,aˀ,I>0+|++| 5jg€s5$$՟՟1-$ÁÁ$tP7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@< 0I$I$I)$I$I$MmmܒI$I$I%mЊ2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT>[\S R>[\S R٣d$TȴдUUUUUUPUUUTUUUUUUTUUUUPUa1- $ۺۺYۺ՟,Usa=b1-$$ۺˀa,sI>$ 5+|+|$I>ˀs[,ˀjg€g€= 5 57+~+| 5[aˀg€$jjI>I>a$+~| 5++~~77,jYˀjۺIY5ۺY5[$+~777+|jg€ۺ5՟ۺ՟g€aj 5+~7+|$}|= Us,[[= = 7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<40$I$I$JI$I$I$mmmܒI$I$I%mmЊ>[\S R>[\S R>[\S R>[\S R>[\S R>٣d$TȴдUUUUUUUUUUUUUUUUDUUUUUUUUUPEUUUU`00I>Usˀss[a՟sUsUss՟Y1-tP$[hIIhI1-$5j ۺ,$jI>g€ˀ5s1-[tPYY,,s0j 5+||j0$= $0I>I>I>[sg€I>0I>jI>= [sUsˁ1-[ ۺ$Y՟j5jg€UsI>$+~70|jjI>Usˀsg€g€I>j$[sˀ[a[7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<H0$I$I$JI$I$I$mmmܒI$I$I%mmn`[\S R>[\S R>[\S R>[\S R>[\S R>[\٣d$TȴдUUUUUTUUUPUUUUUUUUUUPUUUP`,sg€,= $$= g€a$ۺˀs,,a= +~}7~| 5s= UsI>I>Usg€ag€I>0$ 5+~~77jUsjUsUs,$g€,j ۺhYUsUs$[I>I>Us[g€Us,s,,s,,՟s,UsUs0j 5+~+|j$j 5 5 5000UsI>= 0$jj+}77777BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUU[{{1c1c1cs9s9sZֵkZֵkZֵk{{{S R>[\S R>[\S R2+k" c*[2+k" c*[2+k" c*[٣d$TȴдUUUUUUTUUUPUUUUUUUUUUUUUc+|0,ۺaˀs[Us[a$5$ 5+|~7ss+|Us,= = $j 50Usjg€s= 57|0g€[= 0Us5՟s,g€Us[$+++~|jI>ˁ$h=b[$ 5$=b1-tPUY՟,0I>$~77 5s՟՟՟$jˀg€ˀU$$[h IaaUsUsj5ˀa[[Us7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0 $I$I$RI$I$I$mmmI$I$I-mmЊ2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2*٣d$TȴдUUPUUUUUUUUUUUUUUUUUUUUUUUUU`UsUsUsaj,[0= $~7sss+~++~|+~7+| 5$s,s,$ aaaa=bY-h=b=b1- $I$1-=bj$$js[Usg€ˀ՟Y$jۺYۺ՟jjjۺ՟jۺۺۺ5ۺYjaۺ՟՟=bI1-j,[Yˀ,s,ˀ՟U%Q1[g€[,s[g€$$ۺas7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0 $I$I$RI$I$I$mmmI$I$I-mm۶`k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[FSmpC!L٣d$TȴдUUUUUUUUUUUUUQUUUUUUUUUUUUVUUUUU`ˁY1-hUۺsa՟1-hUU1-Y$$$՟ˀj՟՟55g€g€,I>,ˀ,sj0 5= ,,g€I>$j 5$j|0I>0I>[= Us0I>Ussۺ Y $UhtP[IۺtP[=b[[tPY ނↂHht%QI1-U1-$ރh̀+UhtPÂht=Uh=bUU$Y7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<00I$I$I$I$I$I$mmm$I$I$ImmЊt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\٣d$TȴдUUUUUUUUUUUEUUUUUUUUUU@UUUUUaHÁ}YYˀjjYYhtPY=bj,Usg€j=b$g€,g€55ˀ5g€0j 5+|,j$ۺ՟5Y5j$՟$$Ya 577 5$0= 00[ss= [ˀۺˀ,[UsUs[ 5++}~++~+|0[[UsUs$$jj 5I>g€՟ۺۺ՟՟՟7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<D0I$I$I$I$I$I$mmm$I$I$ImmmЊFSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSl٣d$TȴдUUUUUUTUUUUUUUUUUUUUUUUUUUUU`[ˀ$j$υ5= j~}|[,υۺ,g€j0OX,sI>$jbb,b,tPj,OX[,,,ˀa$jjˀ[s= I>[= $j= ˀjۺˀ,,,ˀ,ˀυυ0|0,$OXa$$55OXI>g€s5$ۺ$υ= = OXˀۺۺ55Y1-υ= 0[[,g€aۺY$ۺˀ[7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<X0I$I$I$I$I$I$mmm$I$I$[mmm`pC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%sN 1Е-sN 1Е-sN 1٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUPU`[I>Usj~7|j$I>[sUsI>[jjj՟՟՟,,=b1-$=bIIII1-=b[[I[tP ۺaaaˀa$I[[$$Y[恌[[I$Y,= I>0$I>Usjˀs,s,sg€g€g€[I>$a[s= ,g€0jaY  js[a[I>I>Usg€,0j$ 57+~}+~70= Us7777BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUU\c1c19s9s9skZֵkZֵkZֵ{{{B!B!B!!B -sN 1Е-sN 1Е-sN 1Е-sN:VD2BT5τe:VD2BT٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUPUUUUU@`0$I>0= = I>= = [Ussaag€= = 0= = g€I>= UsUsssas,,[5՟Y5՟՟$  5$ 5 5 5 5 5= [ H$$tP1-ۺۺjۺj[I>I>0= I>Us[5$YtP$[恱YY5,j+}7+|j00= = I>Us= = I>g€g€00I>$0= $0++| 5+~+|7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I)$I$I$mmmےI$I$I$mmЊ5τe:VD2BT5τe:VD2BTJBJƹJBJƹJBJƹ٣d$TȴдQUUUUUUUUUUUUUUUeUUUUUUUUUPUUUU` m, m,8 m%׀Jv\Jvu09n'>uu]u&0h\eu0\\eeh\2 \2 Jve\ʣ'9\99\\nʣ'JρJρu>v;ciT1>L送fꁾ>\ʣ'>&0\\>&0&0>Jρ>&0'>A%׀,,%׀h\''hʣ9u0u097777€BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<,0$I$I$II$I$I$mmmےI$I$I$mmm`JBJƹJBJƹJBJƹJBJƹJBJƹJ٣d$TȴдUUUUUUUPUUUUUAUUUUUPUUUUUUUUUT`5,gtPhh1-=bYIh$ˀa$ ՟jjY,Us0$[0++|0ۺjaI>$$j$$0= Usg€UsI>00++|g€ۺIUI=bI I=btP[$ۺ5,= = $7$= s0j 5 5$g€g€g€I>Us,I>$0[= $$$[悽hthۺs= I>00= $$ 5j 5j+~|}7777€BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<D0$I$I$II$I$I$mmmےI$I$I$mЊBJƹJBJƹJBJƹJBJƹJBJƹJBJ٣d$TȴдUUUUUUUUUUTUUEUTUUUUUUUUUaj[ˀˀ[= = I>Us[ss= g€I>[[00s,0 5= g€$IhU=bۺˁ $$U1-Us$$0Us[Us$+}7= $j$Us= $0$$|0= j$j0$ 577+| 5 57~7~77}+|j$0$$= g€5Y$$$ۺjۺYhY,jj+|$ 5= ˀYۺI>007777€BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<X@"""""""$DDDDDDUUUUUUUUUUUUffffffffffffwwwwwwwwp>[\S R>[\S R-sN 1Е-sN 1Е-sN 1Е-s٣d$TȴдUUUUUUUUTAUUUUUUEUUUUTUUUPUUU`0s,,5[sUs$g€՟jۺ5ˀ5՟՟ˀ[,I>a5g€asˀ՟՟Us+|+~|j5 $ˀUsˀas[Us5$0= g€aˀˀjUs 5jj+|jj= 0g€$I>= 0= Us= $$a$,[0~7|[ag€= j 5$+| 50$j$$ 5}7 5,ˀg€g€[g€s,j77770BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUUUUU^s9{{z!B!B!!B!B!B1c1c1c!@N 1Е-sN!:|#)Ҷ!:ƹJBJƹJBJƹJ٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUTT`5Us05ˀ,I>[0j= ,ۺ$$ˀ55$ YY$=ÁhUYjY[-h5a՟5s[a5j%Q}h5I$U$Á[h$5ˀ$j5gH%QނY$tP[=b asjjaˀa՟I1-ۺ0 5 57s+~~7777+|$jj 5+~7+~|7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0$I$I$II$I$I$mmmܒI$I$I%mЊBJƹJBJƹJBJ>[\S R>[\S R>[\ c*[٣d$TȴдUTPUUUUUUUUUUPUUUUUUUUUUUUUU`$= = 577 5++|$$0|Us7+~7+~|I>sˀg€g€ag€j[= 0g€,= UsUsg€[I>[sasg€[55saۺ s+~++|,ˀۺ 1-$ˀ,s,=b =b1-hY՟՟ۺ՟՟ۺ՟   jˀaaˀ5a,5$h[$5[a[Ussas[s$g€jUs7777~BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@(0 $I$I$RI$I$I$mmmI$I$ImmmЊ2+k" c*[2+k" c*[2+k" c*[2+k" cKc\FSmpC!Lt%Kc\FSl٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUU`,5ˀ,g€՟jˀs$j+}7| 500[g€= 00I>ˀj,[ 5 5++|$Usaˀ,s,[I>I>I>g€I>Usۺۺ$s0$+|$sۺˀa,5U5՟Y=b[5a5ˀ5ۺ$$g€g€sa5ˀۺ-HÁ$j5Yh$js[0I>= $0I>j 5= g€j 57777~BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@<0I$I$I$I$I$I$mmm$I$I$Kmmmm`pC!Lt%Kc\FSmpC!Lt%Kc\FSmpd)lktd)lktd)|#)Ҷ!:٣d$TȴдUUUUDUUUUPUUUUUUUUUUUUUUUPUc+~770g€՟ˀ,,,ˀ5,[[j+|+~7Usˀۺ՟j,ag€,5$5g€ssI> 5+~++| 5= [[[g€UsUsI>= $g€g [U5I>= 0a՟=bY= = $I>g€$1-$5$$j,g€a= 5$$5I>0[j0gYtP= $5Us~~|$jUssˀˀ7777~BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@T0I$I$I%$I$I$ImmnI$I$I$mmЊ|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|"٣d$TȴдUUUUUUPUU@UATUUTUU@EUU`,ˀ5j5$55a0jj0,a՟aj$ 5+|$j[00= = $777$= Us0 5 5++|+~|j0$0j$$ 5$$ 50+++~~~7+~77|I>= = $j= = $$$ 57ssssssss77+|+|+|Us[,Us 5 5 5 5+| 5j7777~BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<B\9ukZֵkZֵkZַ{{{s9s9s;{{}{{{)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ٣d$TȴдTUUTEPUUUUUUUUUUUTA`0= = }ss+~|j0 5 5jjI>$0j+|j+}}s$+~~~~+}++|+|$aI>+++|g€՟ۺ ՟՟ˀUsUs0 5| 5[ˀ0 5j=bjs$I$j 5$$jUsss= +~|= g€aUsj 5 5+~+|~|+|$I>++|7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I%$I$I$MmmrI$I$I$mЊ!:|#)Ҷ!:|#)Ҷ!:5τe:VD2BT5τe:VD2BT5τe:VD2BT٣d$TȴдTDUAUTPUUUUUU@Ub7ssssssss777sss+|= 07~7777++~|+|~7ss+|$Us0j 5~|+~77~}ssssss| 5$ 5j$+| 5~|jI>= 0 5j+|jۺYs[Usg€= $= g€UsI>$$j0 5[jۺ՟[7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I)$I$I$MmmrI$I$I$mmЊ5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τd٣d$TȴдUUTUUUT@@UUUUUUUUUUUUUUUU`= 0[ˀˀ5ۺI>s= +~77+~}+|jg€[I>UsUs= 0= Us$$0I>= ++}~7 57+| 5 5j~7+|[,j$$+|$j 5$0= aa[Usg€Ussg€ˀj,ۺۺI$j՟$jI>ۺ[Us= = Us$0$00 5 5Us[$|= I>a,s5j՟U[1-h7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<,0I$I$I)$I$I$MmmrI$I$I$mmm`:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD٣d$TȴдUUUUUUUUUUUUTUUUU@UUUUUUUUEatP՟a,,$Us00UsUs5ۺˀ[I>Us[a,aas1-U[I>0$+|$,5,aUsUs,,j՟a՟$Ys$ 5j+~7| 50g€aa,aasI>= 0= = 5sssss7~7|$a= = sUsj$Us= UsI>$$0= sjg€= jI>g€sI>+|= $7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<D0I$I$RI$I$I$mmmI$I$I-mЊ2BT5τe:VBJ2+k" c*[2+k" c*[2+k" c*[2+kC!Lt%Kc\٣d$TȴдUUUUUEUUUUUUUUUUUUUUUPUUUUUU`j$[՟5s$ 5= = Us$Us 5I>0s,I>|= j՟ۺ555ۺ՟[,I=b՟ˀ 50+|0g€5sa5a5j$$՟j՟ۺj,ˀˀ,,ˀ՟jI>UsUsg€,[UsI>I>I> 5~777+|0,asssa[I>I>g€g€[Us= 0j~~7+|jI>g€[ˀˀs7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<X0I$I$I$I$I$I$mmm$I$I$ImmmЊFSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSl٣d$TȴдUUUUUUUUUUUUUUUQUUUUUUUUUUUU`[I>,ˁ=ba,00= $j 50  Iۺˀ,,g€g€I>saaUs0 5 50Usg€jˀˀsI>I>,[ˀ[Usˁ Yۺs[,I>0$+|0I>UsI>UssUs,g€[ag€I> 57 5[saaas[[,,g€UsI>= 577|0ssaˀ555,,,g€0j$07777BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUU]o{{{9s9s9w{{{ހ!B!B!BB pC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt)lktd)٣d$TȴдUUUUUUDUUUUUUUUUUUUUUUUUUUUUUU`0jj 5jUssa5$ $ 5՟ˀjjaUs0+|777~|j$[= = 5Usj= sI>UsjI> 5jjUsۺ YItPI[恀U$5[0j= jg€$= g€assss՟$UUtP=bY  ۺ՟[ag€,,aˀaaag€I>jj՟jjaI>j0 5$s,7777BUFRb f 2  +,-ZZ!bLEICESTER CENTRE 1% t#StЌ @@< 0I$I$I$I$I$I6mmm$I$I$[mmЊsN 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1Е-s٣d$Tȴд@ ]?x /M`^5H p#`@@I$ @ P6zυ?x 9aYI1 0^n628)2@@a.Ĵ?x q3@OXn6 P3@^,Yn6zI 5Oj0$ @ @ 5j0|z|(~#`90Yn6z?xp0^b> X0 Reˁ1-n6l /M`@@ۺ1>/M`,|$ @$oc|s7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@< 0I$I$I$I$I$I6mmm$I$I$[mmmN 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1Е-sN٣d$TȴдUUUUUUUUTUUUPUUUUUUUUUUUUUUUUU`0I>= 0sˀI>g€= $Ih ag€g€ˁtbZ= Usaˀ,[ 5jj 5+~7jj 5j$000j 5 5 57~~~7|jI>$jj0= 0I>I>0[g€[= = j[= = 0[5ۺY5ˀsI>[Usg€ۺj՟aI>[I>jj0$$= Us$$$$$UsUs= g€՟՟ۺj,7777>BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<80I$I$I%$I$I$ImmnI$I$I$mЊ 1Е-sN 1Х|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:٣d$TȴдUUUUUTAUUUUQUUUUUUUUUUUUUUUUUU`Us= jUsa՟5jg€s5՟j,ˀsss,Us+|= +~7[ssˀ0= g€,ۺjˀ0$$= g€77|= saUss[Us0[Us,I>Usaaaaa[$+|$I>,g€g€aˀˀj,g€s,sg€ˀ՟s[sg€$0[Usa5j՟5jˀ,[0I>[[0 5j 5 5$ 5= g€[I>7777>BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<L0I$I$I%$I$I$ImmnI$I$I$mmЊ|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|"٣d$Tȴд@UUU@TUUUUUUUUUUUUUUUUUUUUU` 5+~~+~7+~7|$s=bhIۺ,[ag€= $}7$= $ 5g€I>+~} 5g€sI> 5$ 5 5$ 500j$aUsaˀUs= ,j$ۺ,sۺ$UU$ItP=b5՟՟jIY}I,5j1-Uۺ1-1-=bU,sUssˀa[՟tP=b ՟ˀˀg€5sUs7777>BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<`0I$I$I%$I$I$ImmnI$I$I$mmm`)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:ƹJ٣d$TȴдUPUUUUUUUUUTUUUUUUUUUUUUUA`ˀj՟[I> 5= I>I>$= I>I>s՟g€= Us,jj՟՟,ˀa,a5a,sg€ssI>= 0j 5++~}777++~+++| 5 5jI>ۺ0$0I>sg€aˀ,ag€[= 0Usg€,Usg€,$UU=bjˀˀ$Y=b$,g€[s[5$777777>BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUU^{{{{{B!B!B!!B!B!B1c0BJƹJBJƹJBJƹJBJƹJBJƹJBL"٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUTU`jI>s[Us$0$= $ 50g€= j$j 5 5j77 50Usg€[Usg€,s[,ˀˀˀUsjjjj[[ss[[I>[g€I>Us[sUs= I>[g€g€,[I>= UsI>= [I>[Usag€ˀsg€sa5 5jsasUs0 5 5~77~~|I>I>$jjj+}++~7+| 57777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I%$I$I$MmmےI$I$Kmmmݶ`)Ҷ!:|#)Ҷ!:e:VD2BT5τgJBJtd)lktd)٣d$Tȴд@UQUTUUUUUUUUUUUUUUUUTc+++~~7+| 5+++~77++~+|j+~| 5+}sI>I>= 0 5+|$ 5 5} 50[I>Us= j 5$ 5= = g€aI>j= 5 50,aaˀg€j[Â%Q 1-a 5jUs[Usssa[I>Usg€[Us$$=bˀa[aUs0= $+|7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<(0I$I$I$I$I$I&mmnI$I$I$mmЊlktd)lktd)lktd)|#)Ҷ!:|#)Ҷ!:5τd٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU` 50I>$+~~7++| 5 5jj 5 5 5g€g€ۺ,Us= I>0= [g-$h- }$ I1-[[$5jUۺ5՟5՟ۺh=bYs$I5Y j,U[ۺ 5[a՟5ˀ[ 5$ 5 5= g€,s[a,s= Us[a5,aYÁI$Yˀja[tPۺsˀs[[7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<<0$I$I$II$I$I$mmrI$I$Immmmm`:ZBJƹJBJƹJBJƺD2BT6SmpC!Lt%Kc\FBJƹ٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUEUUUUUUUUUaV%$ۺ$j$j,I>Us00I>Us[I>= 0I>ˁY5= g€$ 5jjۺYag€,[I>= = [g€ۺ1-$$1-$g€,a,5Y$Y,Us0I>00$I>0jjUsˁ$Is00= g€Us՟$ 5| 5 50Us$=b$=b=bÁ-=bs$[Y,[[[s՟՟jg€s7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<T@"""""""""""#333333333334DDDDDDDDDDDEUUUXJBJƹJBJƹJBJƹJBJƹJBc\FSmpC!L٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUP`,ss0+|j+|[5՟YaaˀUsˀj5ۺ՟՟jsUs[0I>= I>0 50j$0$ 500[g€[[= 0+| 5+~7++|0= g€,I>I>0= sj՟j[sI>0Us,sg€$j$Us[aˀaUs$ 5I>Y5,5,5g€= ,ˀj$0Us0[Us՟[ 5}|ja7777BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUU^{{{{!B!B!BB!B!B! c1c0t%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUU@UU`s[sˀˀˀ55j$Yh$=bYjI>$ 5 5j,aI>$jI>0= g€[I>= I>0 57s$sassg€I>$0= Usaaˁ=b=bˀaˀj5ˀs՟ˀ[[UsUs0UssˀaUs$~77}|= g€a,s[UsUs[[ˀ,g€Us= I>Usj~+|I>g€5ˀg€I>00$007777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0I$I$I$I$I$I$mmm$I$I$Kmmm`FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\td)|#)Ҷ٣d$TȴдUUUUUUUUUUTPUUU@UUUU@UUUUU`0[ˀˀ$ۺۺˀUs0j 50[՟5՟[[,,aj՟j$Y$5ۺ՟a,[Us= 5}|++|j 50 5 5++}saass+|jj 5$ 5 50 5j,g€Usj+}+| 5,5j[g€g€[UsI>[s,sI>s[0= +~+|$g€a5[UsI>[Us՟YYI0I>5ۺ$ۺ՟7777 BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@(0I$I$I%$I$I$ImmnI$I$I$mЊ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:٣d$TȴдUUUUUUUUUUUPUUUUUUAUUUAPAUPU`ˀˀY=b1-s,s,ۺYÁ[ 5ˀ՟a= g€55՟5՟ۺۺ$$ IU,= s70aˀa5g€Us$= I>UsI>= Usaa[$+}j 5j 5 5++| 5$= = I>[s0$,g€I>g€ 5}sj[= ~7|7+|= [,ۺˀˀI>+~~7j0= j,g€7777 BUFRb f  2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@<0I$I$I%$I$I$ImmnI$I$I$mmЊ|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|"٣d$TȴдUUU@UUUUUUUUUUUUUUU@UUUUPUP`= 0= 00[g€aaUs[0[+}777= as[I>I>= = I>Usaa$5sj 5~7g€555ۺ5YYۺjjYۺ  sg€,sUsg€,ˀ$=b=b՟$Us55ˀ5[= j}ss 5g€,,[Usg€0I>I>UsI>$jj 5 50~+~77j[0~7+| 5j7777 BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@P0I$I$I)$I$I$mmm$I$I$Immm۶`)Ҷ2BT5τe:VD2BTB2+k" c*c\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!L٣d$TȴдUUUTUUUUUUUUUUUUUUUUUUTUUUT` 5$0= 5$= [j= [sa0aaaaas0I>0s= 0= [[I>= Usˀ$U= $jsI>Us[$g€= $I>= $0ˀ 1-$Us 5j 5j= Us,[Us$I>j0g€$j$,j$$$sj$[[sˀa՟ۺ[[[= 5j+~| 50,,s[sg€Us,sg€$j~77}ss7777 BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<BUUU\9s9sZֵkZֵkZֵo{{{9s9s9w{{{ހt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUTUU`,,UsUs0,UsUsg€,[sg€= 0$+| 5++~7 5ˁ I0Us[g€I>aa1-tPI$jjsˀUs= = ,$ 5Usˀˀ $-}YU5= j00j[=bU=b՟tPUtP[I՟Y$5ۺjjۺ $՟ۺ$U$5ۺˀag€UsI>= 0$ 5+|j00= 00= I>0UsI>7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$I$mmm$I$I$ImmmЊFSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%lkt٣d$TȴдUUPUUUUUUUUUUUUUUUUUUUUUUUUUU`[sˀ,5UsaUsj~7|j$$j555՟ۺ =bUhtPhUY$ۺۺj1-I ۺ ۺˀj$ $   $ۺ5I>sa,Usaaag€[sg€g€sa,aaUs$7}$= $j00= = [ 1-IY$[j$[ˀjjˁYh=b[[恀1-ۺۺ,Us7777sBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$ImmnI$I$I$mЊd)lktd)lktd)l|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:٣d$TȴдUUUUUUUUUUUUUUUUU@UUUUUQUUUU`j 50g€՟I1-asg€g€aۺ$$՟aˀ[ 5$0 5Us=b=b[ۺˀۺjۺ hU1-$՟ˀUsI>jI> 5j,aI>ˀ,g€5Y jˀa,0ssajˀˀ,I>Us= 0= sUs[aaI>Usg€I>$+|Usaaˀˀۺ$I>I>a,g€0 5|+}}s+~~|$7777sBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<00I$I$I%$I$I$ImmnI$I$I$mmЊ|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|"٣d$TȴдUUUUUUUUUUUUUUTUUUUUUUUUUPUUU` 5jj}|0I>5ۺ[OX0 5j 5$s5ˀ,g€g€g€ˀˁY j5[ 5I>,5$1-[$Y$$$$$$5,I>$}~+kj[aˀ,g€OXOXI>g€[,ˀa,sg€[[I>= $$= [[OXg€[,asaa,,g€OX[$j+kbtP>+k|$OX[I>I>= 0I>OX,5υ7777sBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<D0I$I$I%$I$I$ImmrI$I$I$mmn`)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)D2BT5τe:VD2BX>[\٣d$TȴдUUUUUUUUUUUUTUUUPTEUUUUUUUUUaY$ˀsas= [g€s5՟ۺ՟՟jstPhI$ۺ,[[aa5aI>s55Yjj+}saa|jI>Usj$j 5 5$$= 0= $+~}saaaOa+|[[= +|+|= [jۺۺ՟5,UsUs= j[sj50Usg€[j՟ۺۺjۺˀaa7777sBUFRb f 2  +,-ZZ!bLEICESTER CENTRE 1% t#StЌ @@<\0$I$I$JI$I$I$mmmܒI$I$I%mЊS R>[\S R>[\S R>[\S R>[\S R>[\S R٣d$Tȴд@]А~5g9ˁbZ!C#m՟Id~B@ 5Аdp 2Z9g.'@Us|=bJIc p&%LK@28 'h+|C#,ۺddp+|Z(Aà o '0w@#`F0aĴ #`c.B$$Ĵ?x'@OXHn #`@@sυ Y&%C# 5I>I> d h )2LK@azI `O-s&\ 0B@ 5$7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUU]{|9s9s9s{{{{{{B!B!B>[\S R>[\S R>[\S R>[\S R>[\S R>٣d$Tȴд@ `0j,Pυυ$$υPυ555Y[ Pˀυ$C|[1-htPhP1-1-1- Y$ÁtPC|1-O1-$1-[=b=b$ۺ$ۺυυ5υ1-uuOtP1-htP1lIÁYۺYPυ$h}ht$  ۺυˀaa[C#= = $0C#C#= = = = 0= OXjOXC#s7777= BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0$I$I$JI$I$I$mmm$I$I$Immm۶`[\S R>[\S R>[\S S\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!L٣d$TȴдTUUUUUUUUUUTUUUUUUUUUUUUUUT`g€g€$~+kb}|= ˀsaOXOX[υjaass= jOXOXOX,,s,g€[saˀ5ۺυˀˀ,s= tP+k= ,a,ˀ5υυg€g€I>I> 5j~}|$jυO1-I$$υ$=b[恘h5a,saj$$υ IO1-=bIۺ$Yۺj}btPtP+k7777= BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@< 0I$I$I$I$I$I$mmm$I$I$ImmЊt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\٣d$TȴдUUUUQUUUUUUUUUUUUUUUUUUUUUUUU`[[I>I>[[= 0ˁ ,I>ss[Usj+|~~7ss= $g€g€s Yˀ[$j 5~|05$1-=b՟5՟j1-h=b$ ۺۺ$5g€g€= [sY$YY$$I[1-I=b ۺۺ՟j51-tP=b1-I[恘$[恱YV%hhtP$1- Yۺ $ۺI1-I7777= BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<40I$I$I$I$I$I$mmm$I$I$ImmmFSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%sN٣d$TȴдUUUUUUUUUUUUUUUUUUTUUUUUQUUUTa[h H$$YY$՟$=b[=b   1-1-UI1-j55,s= g€a= Usg€5ۺ՟,sۺ$ۺjasg€[I>= 0j+}sO7+|0= 00I>I>= sUsI>Us$ 5}+~7 5= ,sg€g€sۺ՟5sg€00 5 5+|I>g€ag€[ssg€,aaaj77777= BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<L0I$I$I$I$I$I6mmm$I$I$[mЊ 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1٣d$TȴдUUUPUUUUUUUUUUUUUUUUUUUUUUUUTb777|= g€[,jj5jj5sUsI> 5++| 5j 5 5Usۺ$UtP$$$h[$j,[I>s,55 ۺj5՟YY  =bI[UI1-[UI=bUh-   Y$ۺ $1-ۺ5[g€g€[Usg€ˀ,g€,,,5$ ۺ,s,UsI>0= j~|js7777= BUFRb f  2  +,-ZZ!bLEICESTER CENTRE 1% t#StЌ @@<`0$I$I$II$I$I$mmmےI$I$I$mmЊ-JBJƹJBJƹJBJƹJBJƹJBJƹ٣d$Tȴд@]I%KT ,@ LK@,~9g€j%KT X-P,@ LK@,d L0&%LK@1c ,@ F0a.&\ ,@ X@ۺ n ~!@@a = zn ~!F0,Y28 }E+|OXˁOcw@6sjddp P0 -ˁ  6LK@a$HB@j000|(/M`d@5bbZ&\ Xw@@@sj7777sBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUUUUUU^s{{{B!B!B!!B!B!B1c1c1d!@JBJƹJBJƹJBJƹJBJƹJBJƺ[\٣d$Tȴд@)2]1-?x q'@F0sza @-, hF0GYd-UsY c ~)0VsYtn 5w@9sۺUbZ>H @`gC|=>|( P#۰] AY1J <)0G`zυ >W0 hj--jUs B@#۰G`G =J }.`!`Gۺ=bl P'@6Us z -g€υn6> tx9w՟>dpB@(oF0m7777XBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0$I$I$JI$I$I$mmmܒI$I$I%mЊS R>[\S R>[\S R>[\S R>[\S R>[\S R٣d$TȴдUUUUUPUUUUPUUUUUUUUUUUUUU`j5YۺۺYYۺ $Y Y$Yja[= 5~+k+k= OXOXg€ۺ,,ˀjYˁ ۺag€s[0|>,bbj 50I>OX= OXOXI>$jjjj 5|>,tP+kI>ˁYυۺυjˀaۺ$5s[[$0|>bb 50$[Y $ ag€I>aaOXbtP>bb|I>55ˀ[OX77770BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<(0$I$I$JI$I$I$mmmܒI$I$I%mmЊ>[\S R>[\S R>[\S R>[\S R>[\S R>٣d$TȴдUUU@UUUUPUUUUUUUUUUUUUUUUUUUUUU`I>UsI>I>aۺU$sj+~7g€ˁ$Y5j5ۺsY$5,g€$j++~++|a=b1- I $1-[恘tPtPh$hI$ $՟$[=bUUhhUUh$[I1-1-$՟5ۺ $I[Y$՟՟jۺj= 0$ 50j$ $as,aˀaˀ77770BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<<0$I$I$JI$I$I$mmmܒI$I$I%mmn`[\S R>[\S R>[\S R>[\S R>[\S R>[\٣d$TȴдPUUUUUUUUUUUUUUUUUUUUUUUUUUUU`j 5+~}sss7+|0a5a0 50$$00$$= = = 0$$j 5 5+| 50Us= Usg€aˀˀg€g€[Usg€g€ˀˀˀˀ5j՟ ՟ YY $$Y=b$hUhhUhY[ YY$՟jas= I>= [sۺjYY  $1-$Y$1-U1-1-$77770BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<T0$I$I$JI$I$I$mmmܒI$I$I%mЊS R>[\S R>[\S R>[\S R>[\S R>[\S R٣d$TȴдUUUUUUUUUUUUUUUUUUUUUTPaI1-UI[I$1-Yˀˀ55aasUs55j5$$ˀaaۺ55ˀˀˀjۺ$$5[[ۺYU=bI$ۺ1- ,,55,j$j0j$h1-ۺ,ˀ0 5}77777$7+|jI>j 5+~77s7+|0077770BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<h0$I$I$JI$I$I$mmmܒI$I$I-mmЊ>[\S R>[\S R>[\S R>[\S R2+k" c*[2*٣d$TȴдUUUEUUUUUUUUUUUUUUTUUUUUU`= [I>Us[Y Yۺˀa$j|7[s5555Y5YY$5՟[0|= g€ˀsg€sg€[I>[[Y$5ˀ[Us,aI> 5j$I=b$UUtP=b՟s[0+~}|= [ss ՟= }s7ssss01-5ajUhh$$ 77770BUFRfb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTD_x!B!B!BB!B!B!c1c1c2!B!B!B)JPkC!Lt%Kc\Jtd)lktd)lktd)lktd)lktd)٣d$TȴдUETUUUU@UDE@UUUUUU`$ag€[+| 5[[Usj+}++|}sO|ss7+}s7I>a՟U՟ۺ55՟ˀ,ˀ0I>g€[saOOsg€I>$ 5+|~|0777sss+~7+| 5 5+| 5$ssss7Us [$՟5 %QYYtP[Uh j[[a[I>a $7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0I$I$I$I$I$I&mmm$I$I$KmmЊlktd)lktd)lktd)lktd)lktd)lk٣d$TȴдUUUUPUUUUUUUTUUUUUUUUUUUUUUa$U ՟j$$j՟5jY,I>ss|= $՟ˀ,[sˀ$I5j5Us[$|05Y=bY[I>I>a5a,I>0$$aaaaa|j$ˀs,a,a$UY՟5ˀ,s= 000$= s,aˀ5՟ $jۺ՟jaI> 5j0Usg€asg€[ss7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@,0I$I$I$I$I$I&mmnI$I$I$mmm`td)lktd)lktd)|#)Ҷ!:|#)Ҷ!:|#)Ҷ٣d$TȴдUU@UUUUUUUUUUUUQUUUUUUUUUUUUUT`,ˀa$jj}= I>5YU1-՟ˀˀˀ5ۺjs0$= Us= as,a5jjaۺۺ՟5[= $Us= 0 5= 7= ,aI>$Us,ˁY=b $ۺˀˀ$a0ˁ1-1-՟5j5$Uˀۺ[= 5saa7= ۺˀaaˀˀjYj5  +|7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@D0I$I$I%$I$I$ImmnI$I$I$mЊ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:٣d$TȴдUUUUUUUQUUUUPUUUUUUUUUUUUa|I>ˀˀsg€g€,a,a,a5jaI>0}sas7g€[= UsUsg€aI>= 0j 5 5+|j~7 5g€$ۺ $՟$Ya$j77+|0+|,$h[=b$tP[UhtPV%tht1Á[YY՟ˁ1-UtPtPtP$$ $I=b=b YY՟g€ 5+|aˀۺ7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@X0I$I$I%$I$I$ImmnI$I$I$mmЊ|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:τd٣d$TȴдUUUUUUUUUUAUUUUPUUUUUUUUEUUU`5jjۺ՟ =b555jۺۺ՟jjY$ Ya,՟ˀ5j՟՟ۺ$$asUsj$$ag€g€ˁ ,[$~}ssa7|= I>$007~7+| 5UsI>g€= j 5I>0s$htPag€,ˀ,ۺˀۺ0I> 5+| 5Us5Ih[=bUsUsa,5Y7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<BUUUUUU]kZ{{{9s9s9s{{{{{{B:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD٣d$Tȴд@`ۺUs$0I>ˀUsa =b=bH-$[恀$-[hIY[恘HYYtP-$YY hhhH}$ÁH} $tP=bۺۺg€[sg€= I>j0s,Us= I>g€5Us$Us= 0$g€ˁYsˀ,s5=b$Yh1- ۺ7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$I&mmm$I$I$KmmЊ2BTtd)lktd)lktd)lktd)lktd)lk٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUTUUUUUU`UsUs՟j  ՟=b1- $$ Y$YY$$U%Q11tP$U$Y=bhh  YYۺ[tPUtPIUY1-UU$tP=b=bY՟՟$=bÁI1-1-1-1-$I[恌[tP՟ˀ= ++|[5՟,,g€aajjۺˀˀ,UsUsj+}s 5 5sjaUsI>I>0[7777YBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$I&mm$I$I$Immm۶`td)lktd)lktd)SmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!L٣d$TȴдUUUUUUU@UUUUUUUUPUUUUTUUUUUU`ˁY$1-htPIsUs,[j+|0I>$ 5$00jjsjag€s,s$j}s7[ۺۺ$՟՟$Y $՟ˀag€I> 5$s1-$Yjۺ5aUs$+~777= ˀag€sg€sˀ$$ۺsۺ5g€= +~~7+|g€՟$[՟ˀaˀ5aˁ$=b ۺag€,g€I>I>= a7777YBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<40I$I$I$I$I$I&mmm$I$I$[mmЊt%Lktd)lktd)lktd)lktd)sN 1Е-s٣d$TȴдUUUUUUUUUUUUUUUU@UUUUUUUUUUUUUUaYtPh$1-$YH $UIYjj,Usg€IUU1- U$Yh[1-$ۺˀˀaUs$Y$=b5,Y՟IYY55ˀj777j[5jˀ,sjjۺ$Yjˀ= j= I>Us I[=bۺU$1-U--UU1- ۺˀUs,=b $jۺjۺۺ 7777YBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<H0I$I$I$I$I$I6mmm$I$I$[mmmN 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1Е-sN٣d$TȴдUUUUUUUUTUUUUUUUUUUTUUUUU@UUUUUa[[[=bI  YY5$1-$j՟ۺ$1-1-[1-ۺ= jj 5+|jg€ˀۺ55՟YY=b ՟,$~~~|Us[[,,a,,= = ՟UtP=b,g€00Us0 5$j$j= $0ۺYUIjUsj7s7$g€՟ Y$ۺjjˀ՟5՟jۺ7777YBUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UU[{{c1c1c39s9s9ukZֵkZֵkZַ{{{ 1Е1|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:٣d$TȴдQUUUUUUUUUUTUUUUTUUUUUUU`$ 5| 5g€ۺY$jjjO$$O1-Y$j55Y[Â%Q[=bۺsjOhO5>+k+k}|jOXυj5ۺaOX[ˀ5υˀsI>j 5 5~}|,,,|I>sOX0$$ 5 5I>I>= g€= 0~+ktP>>tP,b0= j0OXOXsOXOXs,aۺ sOX0+ktPtP>b[j7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@"""""%UUUUffffffffffffwwwwwwwwwwww|#)Ҷ!:|#)Ҷ!:[\S R>[\S R>[\S c\FSl٣d$TȴдEUUPUUUUTUUUU@UUUUDUUUUUUUUU`j+| 5$j 5a YI>0$~}j,$=bYۺ$$$YYh1-ۺa= 5777+|[5ۺjg€ghۺs[Usj 5+~77jI>[sI>Us= = 0Us$g€g€s[00$ 5 5+|7|jjI>= $ 50,a5I  ۺ$$Yށ[怽55ˀ՟՟$Áh$ 7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<$0I$I$I)$I$I$MmmrI$I$I$mmmm`pC!Lv5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT٣d$TȴдUUUUUTUUUUUUUUUUUUUUUUUUUUUUUU`a՟jj5ۺ$$5ˀ5ۺ j5՟Us0+} 5I>55aaa՟I ՟ۺY5[[ˁ[ÁU1-1-$$$I=bI[I ˀUs00 5I>s$$$1-=b1-=btP$hP=b$$5՟՟jۺˀjj55jۺ՟՟1-$j+}77 507777BUFRb f 2  +,-ZZ!bLEICESTER CENTRE 1% t#StЌ @@<<0I$I$I)$I$I$MmmrI$I$I$mmЊ5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τd٣d$Tȴд@&%\0 zn 3@aU28B@ 9ReOXI>GY&\ h`*g€PIĴ q \$I> c P6zۺ&\ h\)2aۺ&\ q3@,Y W0 q!= g€ۺtĴ P`6G[Аdph `\al?x1PZsυn6&\ hp*|hndO$9g€1d qw@I>AYUn?x(F0G 77771BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<P0I$I$I)$I$I$MmmrI$I$I$mmn`:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT6[\٣d$TȴдUUUUUUUU@UUUUUUUUEUUUUUUUUUUUUa=b  $$՟5ˀ՟ۺ՟՟,,sjj I1- ˀI>g€ˀI>ass7 570[aa,՟=b$$1-YsˀjYI[=b asI>,a՟Yˀˀ= 0+|$jUs,g€ˀۺۺ5՟$Y ۺ$Y ՟ˀsI>0= I>,ۺ[[=bۺۺ$՟$ ۺaaI>Us= 0 57777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<h0$I$I$JI$I$I$mmmܒI$I$I%mЊS R>[\S R>[\S R>[\S R>[\S R>[\S R٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUEUUUUUUUU` 5I>,ˀsaa,ˀ՟jY Y5g€,,I> 5 5Us,Yۺ՟ˀ5ˀˀۺ1-՟ jsss 5 5$$aˀˀjۺˀۺ՟ۺ$1-Ys,jjYg€s5I>0= [sjj$[ 5+|Us5I$Y5ۺ5՟5՟ۺ$j[0= = a1-I-$j՟7777BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUUUUUUUUUU_{{B!B!B"!B!B!c1c1c1!B!B!@>[\S R>[\S R>[\S [2+k" c*[2+k" c*[2*٣d$TȴдUUPUUUUUUUUUUTPUUUUUUUUUUUU`ۺˀs[Y$0j+~~7+|j= [g€g€I>I>g€sj՟,I>Us[Us$ 5j 5jg€ˀˀag€g€[0= =b5,I>$| 5++|aUIۺa,aˀj$[Usaaaaa= ag€I>I>I>= j000= 0j 5 5j+~7++|j0= [= I>0[Y1-1- 7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0 $I$I$RI$I$I$mmm$I$I$Kmmmݶ`k" c*[2+k" c*[2+k" c,ktd)lktd)lktd)٣d$TȴдUUUUUUUUUUUUUUUUUUPUUUTUUUUU`I> 5 50aYYY՟ ՟j=b,,5550=hhI  Y՟1- ՟jjss[5՟ 1-1-=b5g€$=b1-tPh$՟$ۺ$jUs= Us,UsjI>j7}+|$UsUs= [sI>[g€a= 0$0j$+}| 5[՟՟jjۺˀˀ5a,ˀg€= ++}7jI>a7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<,0I$I$I$I$I$I&mmm$I$I$KmmЊlktd)lktd)lktd)lktd)lktd)lk٣d$TȴдUUUUU@UUUUUUUUUUUUUTUUUUUUUUU`aˀa,,s,[UsI>js,Us= Us0|jj+~+~~+| 5$0ˀ,,= $ 5 5 5j0jj 5 5j 5$00UsUs000Uss$$05a,s[aja55j,jUs7s|j1-Yۺ5՟ۺ$hI=b5Us= [Yۺ$h$$jˀj՟7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0I$I$I$I$I$I&mmm$I$I$Kmmmtd)lktd)lktd)lktd)lktd)sN٣d$TȴдUUPUUUUTUUUUUTUUUUUUUUUUUUUUUUa=bYYU$ g€j 57+|Us՟՟5jۺ5j5ۺ5aUs[,aI>= 5|Usۺ$ =bjI $$[U$ۺsI>Usj~70= j 5jj 5$I>g€s 5 5j0I>g€[sUs0,,a՟$5j5I>a$ÁhI1-Y$=bUU՟՟ۺjs,ˀa[[s[7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<X0I$I$I$I$I$I6mmm$I$I$[mЊ 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUPUAUUUU`I>= I>0[ˀυ Ysυ$5asOXs$1-$js$0ۺ1-O υˀۺ[,ˀ5YY$ۺg€OXOX$g€ۺ$ۺYۺjasg€[,ۺ5sˀ, 5 5$= ajۺOX[I>[$$[[= $υυۺsˀj+k>+k}~}~}|jI>I> 5+k| 50OXˀaO1-$5sg€a5h1-7777BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUU]kZֵkZֵ{{{s9s9s9{{z!B!B-sN 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1Е-s٣d$TȴдUUUUUUUUUUUUUUUTUUUUPUUUUUUUUU`55a՟j555jaˀ,YjY$$$՟$$j՟ˀ,jۺۺ1-=bۺs0= [= sۺۺ5,sg€= $0= Us= g€[g€[ss$7}sUsaUs[ss,ˀˀ,$j 5 5 5}+|$ 5[$Y$՟ˀj5 $ۺ,[0 5$I>ˀjassg€Us[[s= ,7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0I$I$I$I$I$I6mmm$I$I$mmm`N 1Е-sN 1Е-sN 1Е-sN 1Ж5τe:VD2BT5τe:VD٣d$TȴдUP@EUUUUUUUEUUUUPUUUUUUUUT`g€I>,Us,++~}as+|+|+|~|$$YY5ja[s 5j$I>j$0$0$0g€$ˀag€$| 5I>Y$ۺ5aassUs[$$՟j՟js7s= ˀ5s0I>0[5asUs,I>jsss,[[g€UsUsI>I>UsUs[I>I>[[Usj|7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@ 0I$I$I)$I$I$MmmrI$I$I$mЊ2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT٣d$TȴдUUUUUUUUUUUUT@UUUUUUUUUU`j= [g€ˀa,g€Usg€$1-=b[$$=bjYۺ=bYjۺa5Y՟a,[g€UsUs$I>I>,,5,ˀ,07+|~| 50I>Us$~77|+~7sOOsas$saˀI>I>UsI>= = I>a= $+~}asssI>՟j՟ۺۺY Y$Y5 ag€ 5= I>՟ۺۺ՟7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@40I$I$I)$I$I$MmmrI$I$I$mmЊ5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τd٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUEP`5a5j՟5jˀ,Us= 0[$$$,aˀa,a,$j$g€I>g€5= 50 5 50a՟Y$g€0j= = I>$$I>5ۺag€,Us0j[jۺI> 5 5|~|j= [$ 5 5I>0 5 5 5+}+|$ 5jj$0g€ۺ[恀՟jj+| 5$ 5|7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@H0I$I$I)$I$I$mmmܒI$I$I%mmn`:VD2BT5τe:VD2BT>[\S R>[\S R>[\S R>[\٣d$TȴдUUUUUUTUUUUUUUUU@UUUUUUUUUUU@`= = s  5j h ނhۺ$j$= 00s$ 5+}+}+|g  ۺY ۺ,ۺ$՟ $I>$j0asg€sۺ5$՟,,as[,a,0UsI>+~}+|$I> ՟,  j$1-[1-$ja[Us$ 5$g€Us,g€a5j5ˀ,g€,ˀ,$$}7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@`0$I$I$JI$I$I$mmmܒI$I$I%mЊS R>[\S R>[\S R>[\S R>[\S R>[\S R٣d$TȴдUUUTUUPUUUUPUUUUUUUUUUQUUUa77|j0 5j 5$ 50= jjj7}s~~| 5j 5 5 5[g€0 5~77 5g€aˀa՟ۺ5sUsg€00I>j+~|jI>aa[g€UsUs[0sY=b$ˀ,,,Us0j++}|Us,a,as= g€5՟j 5ˁYg€00+| 5 5,ˀ[= $[ˀ7777BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<BUUUUUUUUUUUUUUUUU^s9s{{{{{{B!B!B"!B!B >[\S R>[\S R>[\S R>[\S R>[\S c\FSl٣d$TȴдUUUUUUUD@UUUUUUUUUUUUUUUUUU`= ՟Yh ÁÁIۺ5g€՟sUs0$00|+|+~}7sa7j= I>I>= UsI>I>= [ˀjY s= 0$Usg€՟՟,[sI>ajUsa,,jg€I> 5+|$I>[g€ss՟՟[Us= = ۺ jj~7|sY=b$a$$ Y[I>= I>j7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@< 0I$I$I$I$I$I$mmm$I$I$Immm۶`pC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!L٣d$TȴдUUUQUUUUUUUUUUUTUUQEUUUU`jj 50I>g€g€Usag€g€= j+|j$s= $g€gƒ+}7s7$0jj$0$Us0$0Us$j$UsI>= j 5| 5+|$ 50= I>ˀ$՟a, $,= j0$jj= = 5j 5 5||0|++|0Usa55ag€aass[,0j+}s77+|$7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<$0I$I$I$I$I$I$mmm$I$I$ImmЊt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\٣d$TȴдUUTUUUUU@UUUUUUUUUUUUUUUUEUU`Us= $0$j 5jj 5+|[j= }~} 5$a[g€0= Ussˀ55՟g€ 57+} 5I>I>asˀj5ˀ,ˀaj$՟ˀ[I>0+|0a5ˀassa,[,ˀ5ۺYI$ۺ[aa$0$$$00$I>g€I>= Us[Usg€ˀjˀ,[0|00jI>a[[7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<80I$I$I$I$I$I$mmm$I$I$mmm`FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Nl|#)Ҷ!:|#)Ҷ٣d$TȴдUUDUUUUUUUUUUUUUUUUUUUUUUUUUUUUU`jۺsI>aUsj||0ۺ=b1-$ۺ5ۺY[ 55jj՟,I>I>0[g€ˀj$՟՟,ˀ$ۺۺ՟aˁ$Yh$g€[a,ۺ  ՟՟aas,jˀ,,ˀI>0j 50g€jˀsag€,s,aaˀ,s[= 0jj 5jUssUs0000UsUs՟,s՟ˀˀˀsۺ7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<P0I$I$I%$I$I$ImmnI$I$I$mЊ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ2BT٣d$TȴдUUUEPTUUUUTUUUUUUUUUUUU`jI>՟ۺjI=b=b[$g€= |jj+~~~++~|g€Us 5~777+~++~~7~~+|$0$0= ++| 5$$j$= 00= [$= Usg€UsI>g jg€~7|[sI>= $= = = = [,5j5ˀs[0+|0g€assUss,aass ՟sI>Us,g€Ussg€g€[7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<d0I$I$I)$I$I$MmmrI$I$I$mmЊ5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2B>٣d$TȴдUUUUUUUUUUUUUUUUAUUUUUUUUUUU`0I>= Us,g€,=b$ ՟j 50 5 50,5aˀa5ˀ5g€0j7|j$[= j[g€g€sg€g€g€jI>I>,a[0j 5 5~~~|j+~|++~+|= = 577~|$Usg€,,sUsg€sg€g€ˀ,g€[j[$[,,[sˀۺˀ555՟՟5sˀ7777BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU^B!B!B"!B!B!C1c1c1d!B!B!B)JP[\S R>[\S R>[\S R>[\S R>[\S R>[\٣d$TȴдUUUUUUP@UUUUUUUUUUUUUUUUUTUUP`aaUsˀUsI>ˀY[5,UsUsg€sg€0= $+~7 5}+|I>,5ag€j5ۺˀ,aag€,0sI>I>g€I$ ՟ۺ5ˀۺaa[j= 0$$$0UsUs[g€[g€s[g€Us[sUsI>0 5I>$70Usj+|+~++| 5= = j+}}ss77777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0$I$I$JI$I$I$mmmܒI$I$I%mЊS R>[\S R>[\S R>[\S R>[\S R>[\S R٣d$TȴдUUUTUUUUUQUUUUTUUUUUUUUUUTT`$aˀaag€ˀ5,= 5j 5 5+}ss7jˀ555ag€a[I>Us[g€g€I>= j 5| 50saas[= UsI>s՟[Us= 0= I>++}= 0I>$00Usssag€g€[s,,g€I>I>I>$ ۺˀ,,,,՟sI>Us0= I>j~}~|j 5+|$$+|7777|BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<,0$I$I$JI$I$I$mmm$I$I$ImmmЊ>[\S R>[\S R>[\S c\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSl٣d$TȴдUUU@UUUUEUUUEUUUUUUUUUUU` 50aˀ,I>$$I>g€I>+~77$ 5 5j+~}77 5$j000Us$ 5 5 5 5+| 5+~}sss+|j[I>j= $= I>I>UsI>Us0jI> 5|0= I>[[UsUs= 0[s,s= I>a,Us= $0,sssۺs,,5,[ۺ$՟I$Y7777|BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0I$I$I$I$I$I$mmm$I$I$Immm۶`pC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!L٣d$TȴдUUUUUUTQPUUUUUUUUPUUUUUUUUU@`ۺ,I>jjI>a55ˀg€[I>0$0$ 5 5jjUsI>[0= ++| 5$j+| 5 5++| 5j 5jI>0sUsjaI>$I>I>j= jI>= 00j0= I>Ussag€j~~|j[sag€UsUsUsI>,s,0,5jaI>$ 5I>g€[Us= 0j$= I>0g€I>j$[Us[$~77 50I>7777|BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<X0I$I$I$I$I$I$mmm$I$I$ImmЊt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\٣d$TȴдUUUU@UUUU@UUUUUUUUUUUUUUUUTUU`sg€s[g€,՟՟= = = [0 5777= ,5a= = I>= I>I>,[Us0Us0= = 5++~+|= s,js[UsUsUsg€[,,[,5՟ۺY$ۺjˀ5,I>Us= UsUss[s5՟1--[ ՟aI>Us,g€Us$= = $Us= s,sa jˀ[ 5+|g€55g€UsI>Usˀ7777|BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUU]kZֵo{{{s9s9s9{{{{{{FSmpC!Lt%Lktd)lktd)lktd)lktd)lkt٣d$TȴдUUEUUUUTUUUUUTUUUUUUUUUUUPP`ˀUsUs,5s$+|[[0= ,as,,a,ˀۺYۺ՟՟j$|I>aUsI>UsI>g€ag€Usg€[I>g€g€ˀ$j,g€g€s= +~| 5 50UsUs= = j= = Usa,g€sg€[UsUs$ 5+| 57|jUsag€,aaaa5ˀ,,՟$ۺۺˀ,,I>0 5= I>$+~~7+| 5| 5++| 577777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$I&mmm$I$I$KmЊd)lktd)lktd)lktd)lktd)lktd)٣d$TȴдTUUUUUUUTUUUUUUUUUUUUUUUUUb| 5 5j7j+}7 50j+|g€0j= Us0Us$$g€,0= ՟YYˀg€,[UsUs,a[= = 5$+|j+| 5g€,g€I>0= j$0$= [I>I>I>0$ 5+| 5~+| 5= g€[[UsUsI>[Usg€ˀasajj$I>0aa[I>[g€ss,UsUs[[[[g€[Usg€s,[0I>[saa,g€s7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$I&mmI$I$I-mmЊlktd)lktd)lktd)2+k" c*[2+k" c+c\FSl٣d$TȴдUUUUUUUUUPUUUUUUUUUUUUUU`aˀaI>g€s,s[jO=ba0j$[as[g€g€OXOXOX= I>OX= I>[a= j}b}tP,>btP+k}}b>>,>tP>bb+k}}btPtP+kbtPtP}| 5= = [$sۺY1-$=b[1-Y $ˀ,,jaajhˀI>= $= s,[I>s= j= 0I>I>[[OX$ 5j7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<00I$I$I$I$I$I$mmm$I$I$Immm۶`pC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!L٣d$Tȴд@UUUUPUUUUUUUUUUUUUUDUUUUUU`+~7|0Us,I>= I>UsI>0I>= I>s[UsssUsI> 5+~7+|j= Us5ˀa,I>= [UsI>UsI>[a[Us 5 5= 7I>= UsUs[I>sg€[[= UsI>UsY$ 1-$ ja,s,[0+| 5$0Ussaj= +|77+|js,I>0I>Us$= a[[[saˀUs,I>$ 5s՟7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<H0I$I$I$I$I$I$mmm$I$I$ImmЊt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\٣d$TȴдUUUUUUUUUUUUUUUU@UUUUTUUUUUUUU`՟,sg€ˀ5$1-$՟ۺ5 ՟j5՟$[[aaˀ,g€ˀ,5՟g€I>= I> 5sjjUs,ˀI>UsUs= 00= 0UsUsUsI> 5I>0+}7= s,,ˀg€Us,sg€g€g€= I>= j$jj}7I>I>00$00= g€UsI>I>= 0,sI>sۺa՟5Us$= ,Usj$[0[= 7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<\@""$DDDDDDUUUUUUUUUUUUffffffffffffwwwwwwwwwwwwFSmpC!Lt%Kc\FSmpC">[\S R>[\S R>[\S R>[\٣d$TȴдUTUUUUUUUUUUUUUUUUUUUUUTT@`0 5 5$g€ 5 5+}sOssss5՟ۺaˀ՟ۺ5՟jY ՟s= = 5[s,a՟ˀjag€g€s,,,[jj$Y5ˀ,aj $j$Y Y՟ˀg€saasssa55j՟ۺ$Y՟55aas[+| 5+}+|}7| 5 5+}777777~BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUUUUUUUU_{{{B!B!B"!B!B!C1c1c1d!B!@S R>[\S R>[\S R>[\S R>[\S R>[\S R٣d$Tȴд@UUUUUUUUUUPUUUUUUUUUUUTPUUa 5}7~~77++~77|~+|= [I>0= I>5IU[恘UY$I1-$j5ˀ$Yۺۺۺaۺ$ۺ5$=bIIgƒ++|ۺ= $ˀ[恀Uۺ՟j5ۺY5՟tPUۺ$$$՟ˀˀ55aۺ,I>g€s,՟Yj0 5|j77$j$1-I7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@PB!B!B"!Bs9{{{!B!B1c1c1cR)JR >[\S R>[\S+k" c*[2+k" c*[C!Lt%Kc\FSmpC!Lt%Kc^٣d$TȴдUUUUUUUU@@UUUUUTUTUUUU@UUUUUah[[[[U=b$  $ۺ55s[= 0 5j 5 5$0 5$0j 5++~|+}$g€ˀ,ˀˀˀaˀg€[[Usg€,g€$= ~~77|jg$,UsI>~~~7Usaj[怌a$= 5g€I>Usg€g€[0 5~~|0jۺ= Uss[Usjj7+~7+| 50[,s= [Usj$= 7777$BUFRb f 2  +,-ZZ!bLEICESTER CENTRE 1% t#StЌ @@<@\0I$I$I$I$I$I&mmm$I$I$KmmmЋtd)lktd)lktd)lktd)lktd)lkt٣d$Tȴд@]1-1Ĵw@6^g€n6АB@9ˁYlW0 `9ˁ?28dpB@6s5|(pLK@ۺĴ L )2ReۺĴ @p9= |U$ '*ˁtnB@#`5g|IbZcdp,@ F0[n6 @ 'O= |n6@@ddp,@ Reˁ?bZI @~,@ z. L&%Re(Ah1n `E&%I>^,7777UsBUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<BUUUUUUUUUUUUUUUUUUUU^s9s9s9{{{!B!B!BB!B!B!c0d)lktd)lktd)lktd)lktd)lktd)٣d$TȴдUUUUUUUUUUUUUUUPUUUUUUUUUU@`Usa[I> I- }$[怌asa՟ۺ=b 5,Usj 5jj= = [,g€[Us= = [g€$$ۺsI>|+}7+|$I>I>0UsUss= 0[a,,I>0j~77+~77|0= [s,g€aˀ$ˁYۺaˀ[I>,ˀjjjjۺ՟՟ۺۺj ՟,= = $ 5+}7 57777BUFRb f  2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$I6mmm$I$I$[mmЊlktd)lktd)lkN 1Е-sN 1Е-sN 1Е-s٣d$TȴдQUUTUUUUPUUUPUUUUUAUUUUUUUUU`j 5|0= $000$j$0+k}~}|jaυۺυ 5[I>= g€ˀjˀsI>$+ktPtP+kbtPb|$[[g€aI>OX0I>5Y50 5+k+k}}tP+k|sۺY$υυ5υ55,OX= g€sOXI>= 5}|[ˀˀaaag€[a5,υj55ۺυ$5υaI1-$5 $7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<$0I$I$I$I$I$I6mmm$I$I$[mmmN 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1Е-sN٣d$TȴдUUUUUUUUDUUPUUUUUUUUUU@UUUUa 5՟ۺ[g€[00j0= I>,sa,g€aas,jg€ˁYˀj= +|7+|~|++| 5I>= g€s$sasaa7 5՟5g€,saaˀ$Y5Y $ ۺ,Us= $g€$$5Us[g€g€[ssˀasI>j}}sa+|Us,j5s[g€,՟ $$$U1-[怌a,7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<<0I$I$I$I$I$I6mmm$I$I$[mЊ 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1٣d$TȴдUUUUUUUUUUUPUUUUUUUUUTUUUUUUUU`Us= 0[5Y  ja[= I>, 1-UI[UU Y$՟jjˀa,sI>[0[I>j= 0j7aajI>g€[jj$ 5+|= Us0$0[a,[I>[,[Ussˀag€UsjUs0I>Us՟ۺYjj,I>+|= YYjsI>I>aa= ,ˀ$$5I> 5Us5՟$tP7777BUFRb f  2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<P0I$I$I$I$I$I6mmm$I$I$[mmЊ-sN 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1Е-s٣d$TȴдUUUPUUUUPUUU@UUUUUUUUUTa 55jjj$5,Us0$sasaa 5$g€g€sUs[= = [g€ˁ=b5aUsUs[+}aO|$sa[[,ˀۺ,ˀ՟[Us 5 57Osaaag€$5ˀaUss՟Ihh5ۺۺˀ՟՟g€[[I>I>[UsI>= I>g€0ˀˀUs0+~7saOOas~|++|j= 7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<d0I$I$I$I$I$ImmnI$I$I$mmm`N 1Е-sN 1Е-|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ٣d$TȴдUUUUUUU@UUUPUUUPUUU@UUUUU`jI>UsUs= 0$ 5}7aYhY,՟j$1-I1-YjsI> 57s 5Usg€sI>g€g€sa[aa[Usag€ 5sas+|I>g€= = 0$0= 0UsUsUsI>ag€0j+}sss7+|= g€= 5 5$ 5= 0ˀjsag€}as[sjˀˀˀ5ۺ5$Y 1-1-YUs7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUUUUUUU_{{{!B!B!D!B!B!B1c1c1c!B!@!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:ƹJBJƹJBJ٣d$Tȴд@ \G HIdpReˁbĴ?x~ X@5zk.c #`-Y=b>?x q 3@jI>P @ '9P  ~#`3@OXG I&%LK@ˀ  /M`^υt|( Lj!$j|А,@ X@bАdp,@ F0[P?x~OG!3@g€$HА P#`I>A$  0X@= I> ~w@6aۺ7777BUFRb f  2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0$I$I$II$I$I$mmmےI$I$I$mmЊƹJBJƹJBJƹJBJƹJBJƹJBJƹ٣d$TȴдUUUUUUUUUUUUUUPUUUU@UUUUPUUUU`ag€g€jۺY$ۺ,= | 5+~|s1-tPh1- ۺ$=b$$Áhh=b$՟՟55jjj$jj՟j5ۺa[ˀ[$ 5 5~777$ˀag€[g€,5I՟՟,= = 5}jˀjˀUsI>Usg€aYI$hI , 577= [Yۺ,s[Uss՟ˀ7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<(0$I$I$II$I$I$mmmےI$I$I$mmm`JBJƹJBJƹJBJƹJBJƹJBJƹJ٣d$TȴдUUUUUUUPUUUUUUUUUUUUUUUUUUUUU`jaUsUsg€sˀۺY1-tP=b=bˀˀ$ 1-1-  ۺsI> 5j 5770a[=b՟$ˀˀ55aa[$}|$a$ 1- 1-$$IUhtP[hIU1- YY,a   ۺj,sˀg€$[g€ˀˀ,0I>s0$$$0UsUsaaaaYYj5՟I>Us$07777BUFRb f 2  +,-ZZ!rLEICESTER CENTRE 1% t#StЌ @@<@0$I$I$II$I$I$mmmI$I$I-mЊBJƹJBJƹJBK2+k" c*[2+k" c*[2+k" c*[٣d$Tȴд@)2` 5C#ۺh[ YY$YC|?$$$7lHtP[恫?+k7%Q\?Pc+ĀPۺ$݁+[+݁7G$$ۺۺYtP?tt$??݁7GY YυۺPۺۺۺۺۺۺυۺ$$Y$$$ۺυaυυυPYYY$ۺυsC#6s,Pυ7777jBUFRb f 2  +,-ZZ!bLEICESTER CENTRE 1% t#StЌ @@<T0 $I$I$RI$I$I$mmm$I$I$ImmmЊ2+k" c*[2+k" c*[2-pC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSl٣d$Tȴд@]Hn-P5gd@b1IW0 jjPl hp,@ d@ۺtА B@C#s$zk p&%j Lp#`C#|=bz&\ `+|= GYn  ^jH 0&%C#,$zn ,X0Vˁ=b1280 9,1 0] ˁ1- eRH.c.h Lh#`= , Hn?x F0X@n?x Y 5gmۺ7777BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUU\ZֵkZֵkZֵo{{{9s9s9w{{{ހ!BpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Lktd)٣d$TȴдUUUUUUUEUUUUUUUUUUUUUUUUUUUUUUUU`g€I>I>OX= aˀ =b[h1-1-I$=btP[1-ۺj5ˀ,$|jI>,ˀυυYjII=bI1-$$1-OYυ5aˀj$$jaaY=b$jjυ5ˀ,s= I>[ˁYOhI$$  $ 1-Y$ۺۺ5aυ =btPh$$j$Y YYja[I>I>OX,j7777BUFRb f  2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$I&mmm$I$I$KmmЊlktd)lktd)lktd)lktd)lktd)lk٣d$TȴдUUUUTUUUUUUUUUUUUUUUUUUUUUUUUUU`$ $5՟՟5ۺ $=b$5ˀ՟jaUsj7$YtP5j1-1-I1-=b$ $՟ js[j$ˁI1-$$[U1-Yۺˀg€,[[= a՟YۺaIItPtPI$$$Y՟՟$$5,$ ՟=b ۺYYUtP-$tP=b $$$ ItP$h=b[hUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$I&mmm$I$I$KmmmЋtd)lktd)lktd)lktd)lktd)lkt٣d$TȴдUUUUUUUUUUUUUUPUUUUUUUUUUTUUUTaI1-$ YY$ˀOXI>$g€,ˀjۺυ$$ $1- $ۺυۺˀ5,5υ$ۺˀ $$Y$$$55I>I>~}~}| 5g€,ˀa,aˀ5=bυ$1- 5Y $ۺ$IY=btPOYjs[ 50$ 5~+k}| 5$,5   1- $$ j+k7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<40I$I$I$I$I$ImmnI$I$I$mЊd)lktd)lktd)l|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:٣d$TȴдUUUUUUUUTUUUUUUUUUUTUUUUUUUasaaas+|$j՟,s5$,I>0Usj7777[aa5ˀsUsg€,I>g€g€0 5|$$ItPh$IYhI[[I$՟sg€I> 5[j=bIU[IIIU=b$jsg€ 5+~~~7$ˁY$$ۺj$ۺ$$՟sI>I>I>j0 5 5051-[7777BUFRb f  2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<H0I$I$I%$I$I$ImmnI$I$I$mmЊ|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|"٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa$[I$=b 1-Y ՟g€I>0+|~~+|j$$I>I>I>aˀ555  1- ۺa= jjI>I>g€I>s,,՟ˀj  Y$1- j$  $U[恥$UU[ItP[=bY$ۺjˀˀ5ۺۺY $$Y$ ՟5asI>[s,a $=b[ItP$7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<\0I$I$I%$I$I$ImmnI$I$I$mmm`)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ٣d$TȴдUUUUUUUUUPTUUUUUTUUUUUatP[UI=b1-$=b$5j$UI ۺ=b$$5ˀ[ss= 5 5}ss7+~|= Us0 5+~7jjOsOaaa|Us[= jj+| 5+}ssOaaas 5aI>j0[[55$՟jۺj՟aI>7~77j 5[,g€= $ 5j= s՟Y $$1-Yۺ07777BUFRfb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUTD^s9s9s;{{}{{{B!B!B!!B !:|#)Ҷ!:|#)Ҷ!:|#)ҶD2BT5τe:VD2BT5τe:VD2BT٣d$TȴдUUUUUUUUUUPUUUUUUUUTUUUUU@`$$j[jjja,g€,aI>[[g€sa= j 5$}7 5= [aj1- aˀˀ՟ۺI>j+~+|jg€Usg€0I>[,,as,g€I>= 5[= 5$= 00= 00= = Usg€I>= 00$++}7+|0,ja,sg€a=b1-YY՟,s,I>0I>~~7+|$ˀI>7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@ 0I$I$I)$I$I$MmmrI$I$I$mmЊ5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τd٣d$TȴдUUUQUUUUUEUUUUUUUUUUUUUUUUUUUUU`ass[՟Y$[ = j$+|++|= $jjg€sY$Y՟51-1-a0$|$ˁ     $Y$$Yۺ$՟ˀUs$= 00= Usj5 $htP[h[Ij,Usg€a՟[h[$hh=b$=b$$jUs= $ 50UsˁU$tPtP$ÁÁI77770BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@ 0I$I$I)$I$I$MmmrI$I$I$mmm`:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUDa$$ˀۺ=b=b1-jˀ,aυ1-[IY $Y[hOOII1-$ $jsOXOXss,aۺ$I[恀tP$hˀs,a$$tPtPtPh 1 OIYYυۺY$ IIhOtP=bυυaOXI>I>0OX00[ÁtPIh O=bI,[OX0|+k77770BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@80$I$I$JI$I$I$mmmܒI$I$I%mЊ2BT>[\S R>[\S R>[\S R>[\S R>[\S R٣d$TȴдUUUUQUUUUUUUUUUUUUUUUUUUUUUUQUUb7+|$[YY$ˀ5$[[s= j$0j+|j= Usˀ՟ۺۺ,ˀjjj5[g€I>= $I>[恘Y,5Y1-=btP[tP $,00$jI>I>5$$Y55aˀ5ۺ1- $ $ۺ[[Us,Y=bU=b$ۺ$՟jjۺ՟5j5I>jj+|jjUs5ۺۺjj77770BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@L0$I$I$JI$I$I$mmmܒI$I$I%mmЊ>[\S R>[\S R>[\S R>[\S R>[\S R>٣d$TȴдUUUPUUUUUUUUUUUUUUUUUUUUUUUUUUUU`555YOtP$ $sj 5|$j[tP $$I$O$tPIO$YY[恌$ Y[恀I[hhOI1-YۺۺYO=bhtP$ Y=bO[hI1-I=b1-Ys55υ=bυ$ ۺjag€sg€,I>OXI>j[5ۺۺ$5j$υυˀs[77770BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@`0$I$I$RI$I$I$mmm$I$I$Kmmmݶ`[\S R>+k" c*[2+k" c,ktd)lktd)lktd)٣d$TȴдTUUUUUUUUUUUUUUUUUUUUUUUUUUUUU`= I> 5+k}tPb+k| 5OXυg€g€g€[saY5OX= $j= ,ۺ [$j5 $OYۺ5j5,I>j 50 5OXj=bO=b1-$υsI>= 0[OX0jsg€$=b5j=bh[1-$1-υ 1-=bYY[Hނ $ υY=b=btPO  $ 1-=bI$ ۺjjj77770BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<BUUUUUUUUUUUUUUUUUUUUUU^{{{{{!B!B!BB!B!B!c1c0lktd)lktd)lktd)lktd)lktd)lk٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUPUU`υυˀ5υυjۺjsI>I>I>OXsaˀ,ˀaˀ5jۺ$ υۺ,sg€aˀυY=b$  1-Oh[1-$$YsjI>υY[恘O[hh=btP$tPIIO$υOX= s$1-OtP=bIۺY$=b[tPhO$a,= 5}}tP}~}| 5,as[OX$$= 7777bBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$I&mmm$I$Kmmmm`td)lktd)lktd)lktd)ld)|#)Ҷ!:٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU`[as$$j$}~}~+k+k}| 5js55ss,ˀ5υsOXg€OX$ 5j 5= g€5aˀa5s[[I>OX0= $$jj0= OX0= 5 5 50= OXυυ$Y5,I>jjj[aOYYtPtPIÁۺaOX0[s [恘OY$1-1-=b$$tPhIg€I>= [1-tPI7777aBUFRb f 2  +,-ZZ!rLEICESTER CENTRE 1% t#StЌ @@<(0I$I$I%$I$I$ImmnI$I$I$mmЊ|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|"٣d$Tȴд@3@`,a,5I1-Y ՟YYYԀ$$ $n61-IY$1-1-zkzkbzkU=b=b $ Y1-ÂbZ$bzkIYn6zkYY$n6U=bYԀj՟Ԁ5ˀasUs,a $=bIYԀ 5jjs 5$= Uss,55ԀԀ ՟aUsUs= $= 0I> Yn6b  ˀa,57777gBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<<0I$I$I%$I$I$ImmnI$I$I$mmm`)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ٣d$TȴдUUEUUUUUUUUUQUUUUUAUUUUUUUUUUU`$ $$5= j+| 5jUs՟ j,sˀjjs= jjjj7 5jˁ=btPۺI1- 5hUhIa$+|~~| 5= aۺˀaaˀۺۺˀۺۺۺˀ,I> 5j+|jI>j=b$ˀg€g€՟$Y$[UIhj I=b=bˀss՟ۺsUs[= [= Usg€ssj, 5 57777aBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<T0I$I$I%$I$I$mmmےI$I$I$mЊ!:|#)Ҷ!:|#)Ҷ!:JBJƹJBJƹJBJ٣d$Tȴд@UUUUUUUQUUUUUUUUUUUUUUUUTU` 5+}+}+~| 5 50j$0 5$j 57}ssI>՟ss= I>= Usˀs,I> 5|7+|jg€=b$ˀ՟5=bh $$Usj= 5$$g€5՟5ˀˀ,Us,s,U[恀1%Q1$[h1-j5$1-$ۺ՟՟ۺY $tPIˀˀ[Us$+| 5Us$hY7777aBUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUU\9s9ֵkZֵkZֵkZ{{{!B!c1c1c2!B!B!@ƹJBJƹJBJƹJBKtd)lktd)lkt٣d$TȴдUUUUUUUUUTUUUUTUUUUUUUUUUUUUahhhÁ=btP=bjˀag€I>OX,=b5g€I>OX0j= [,[υOXjj 5j}}b 5$g€I>$j$jjj$[sg€[0j~+k}|jI>,,ۺυ5 j[1-1-1-$ۺˀˀˁY1-Yj5ˀjj$1-1-$5aI>$}|+k}~+k|= ۺυ555ˀjυۺYI>$j7777bBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$I&mmnI$I$I$mЊd)lktd)lktd)lktd)ll#)Ҷ!:|#)Ҷ!:٣d$TȴдUUUUUUUAUUUUUUUUUUQUUUUTUUUUUUU`= = 0$= I>[a՟$I1-I=b=bU[$II 5ˀI>+|jjj$= g€g€saˀa,aag€g€I>I>$$0sUU$1-[,ˀ՟՟ˀ5[0 5j+| 5j0j$Y$Yۺ՟[[IYۺ՟Yj+~~+|jUs$$՟g€s= [,,jtP-$ˀUsg€[,ˀjYY$՟7777|BUFRb f 2  +,-ZZ!rLEICESTER CENTRE 1% t#StЌ @@<,0I$I$I%$I$I$ImmnI$I$I$mmЊ|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:τd٣d$Tȴд@&%`[OXsaY$ ۺ$+7G7GC|+7G7GOtP$Y$$hۺ7GOtPtPtPYtPY7G+Y Y++C|υˀˀ[ˀs YtPéhtP7G+$Pa[,ˀˀ*s 5$j 5$a Héé7GۺˀP[tPs,$7G  th$PY+h+υۺۺ+t7777[BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0I$I$I)$I$I$MmmrI$I$I$mmm`:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPb -ÁU=b՟ۺIÁHUtP1- tP-%QI%Q-Y=bYY =bۺˀˀaˀۺ 1-$$ۺ5ˀ,[I>I>= ,$UY$ $ۺUhtP[=b՟sg€I>$ j,ˀaˀ՟Yˀs,[0 5 5~7+| 5 5$$[$j= [jag€I>$= +}7777|BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<X0I$I$II$I$I$mmmےI$I$I$mЊ2BT5τe:VD2BT5ЌJBJƹJBJƹJBJƹJBJ٣d$TȴдUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUab}|s5ˀۺˀˀˀˀˀjasg€,aI>~}}tP}| 5[ass[s,υjˁ$1-ۺ00jI>I>g1-[ υ5υaa51-tP1-5jˀs[OX= aۺ 5υ$ IhtP[恌[ۺ5g€I>00OXg€YYY[[sˀjυ$jY[ ۺaaY=b$ۺ,ˀ7777|BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUU]kZֵkZ{{{9s9s9s{{{{{{ƹJBJƹJBJƹJBJƹJBJƹJBJƹ٣d$TȴдUUUUUUUUUUUUUUUUUUUTUUUUUUUUUU`ˀˀsajυۺtPh[1-I$hIIۺυjYa5OXsOXI>g€OXsˀˀa,0$}~}~+k+k}|jOXˀjˀ55$=bOtPtPYtPjaaOXtP[ۺjjۺ $$ۺˀas= $ 5|,$[=bۺ5a5j55ˁ=bυs$jj[I>OX[ˀYۺjas,OXOX[sˀˀ57777bBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0$I$I$II$I$I$mmmےI$I$I$mmm`JBJƹJBJƹJBJƹJBJƹJBJƹJ٣d$TȴдUUUUUUUUUUPUUUUUUUUUUUUUUUT`jˀˀas$՟,Y1-UUUjaˀ5ˀsۺ՟ IU1-՟ˀ= = $ jj00I>0++|0ۺ$55I>jjI>s՟,jˀ[,aˀ$5jsg€I>+~}7+|= I>$g€Us$I>sۺۺaUsj+}O7j[= 5 5 5 50= UsUsUsI>j0+| 5777777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0$I$I$JI$I$I$mmmܒI$I$I%mЊBJ>[\S R>[\S R>[\S R>[\S R>[\S R٣d$TȴдUUUUUUUUUUUUUUUUPUUUUPUPUUb|jˀj՟aˀ՟j՟jˀaUsI>[I>j[$= s1-ۺj 1-$$5555՟$՟jag€aˀ$ۺˀsag€Usg€ssa՟[UtP$[Us 577+|$aUs0 50000jUs 5$$$I>0$$777+|~~7++|j[[0$}7$ۺˀsUsg€7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<00$I$I$JI$I$I$mmmܒI$I$I%mmЊ>[\S R>[\S R>[\S R>[\S R>[\S R>٣d$TȴдUUPUUUUUUUUUUUUUUUUUUUUUUUUUUUU`s5j,,= = $j+~| 5g ,= ,g€$I>ۺa$UtPU1-=bIUIh%Q}h$ۺˀ5j՟՟U$Y$ Y՟=b,,ˀ՟$ $aˁ1-hY5s= [,5UIItPh$ ۺۺۺU1- 5,I>I>$$05$ۺa0jI>5,5ۺ1-1-$7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<D0$I$I$JI$I$I$mmmI$I$I-mmv`[\S R>[\S R>[\S [2+k" c*[2+k" c*[2+k" ٣d$TȴдUUUUUUUQUUUU@QUUUUPUUUUUUUUUUU`$ˀˀa$$$j$1-5ˀI>= [0sUsUs5 g€aj= +|$a=bˀ= I>Us00= = UsI>0UsI>+~~7$ 5+|$= Usˀ5aa,ˀˀa$ˀg€+}70,ˀˀUsaI>[s[,aˀa[j+~7|0s$ ˀˀg€UsI>j[ h$a0g€00$7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<\0 $I$I$I$I$I$mmm$I$I$ImmЊc*[2+k" c*[FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\٣d$TȴдUUUUUUUUUUUU@@UUUUU@UEUUUUUU`Y՟sˀjˁUItPIhh[$Yˀ5a5ۺ՟ˀۺ$ $՟=b $[I>j$0++~|+~+|j 5 5j$$ 5}77+|s  5g€jj= 0aa[ 5 5++}7 5I>ˀˀg€Us+|$jjj0[,g€$j 5I>j 1-ۺg€I>I>$$j7777BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUU]{9s9s9w{{{ހ!B!B!BB!B!B FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSl٣d$TȴдUTUAUUUUUUUUUUUUDUPUUUUUUU`j$$ 5 5 5 57s|= sg€[$++||jUsg€s[Usg€UsUs՟ۺ1-tPÁh1-1-a,ˀ$,Us[[Us[$+| 5$ 500[5ۺ$  j5jj,g€000777+| 5$$ 5j 5++~|j 5I>g€[a$$j= jI>sjY  ,0$j$jj= I>a[[7777bBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@ 0I$I$I$I$I$I&mmm$I$I$Kmmmݶ`pC!Lt%Kc_td)lktd)lktd)lktd)lktd)٣d$TȴдUUUUUTUUUUUUUUUUUUUUUUUUUUUUP`5g€[j 5j0s,g€0jjjjj0 5 5j 577~77+|I>ˀag€Us$jj= Usg€sI>s5sg€Us= I>[aˀ՟  YˀۺUIh[恌jˀUsg€,ۺ,UsI>I>$= , $[tPtPۺI1-I>js0j00ˀss,,5 $=bUs,, 5 57s$,7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@$0I$I$I$I$I$I&mmm$I$I$KmmЊlktd)lktd)lktd)lktd)lktd)lk٣d$TȴдUTUTUUUUUUUUUUUUUUUUUUUUUUUUU`Us= [= I> 5j++| 5 5$$00I> 5+|[՟ۺ5g€aj՟a0j+|+|j[$՟՟$ۺ՟5aˀˀj1-5= 0$ 5j0,YaaaI>[= ˀ՟aj$jI>0 5 5$= ՟jj՟a5ۺs[՟՟՟ۺI= 0,$ ՟YۺˀUs= jI7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@80I$I$I$I$I$I&mmm$I$I$KmmmЋtd)lktd)lktd)lktd)lktd)lkt٣d$TȴдUUTADEUPTUUUTUUUUUUUUUaI$aUssg€g€Us0j~|$0I> 5+|= 5| 5|j+|I>[[= I>[$++~|00j7+}7+~7+| 5777jI>I>= = I>00$$$0$jjj 5 57770Usg€,00I>0UsI>I>= [I>= 00j 577+|jۺ5ˀsg€Usˀasg€ag€Us7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@P0I$I$I$I$I$I&mmm$I$I$mЊd)lktd)lktd)lktd)lktd)n|#)Ҷ!:٣d$TȴдUUUUUUUUUUUUUUUUUT@@UUUUUUUU`$I>0 5I>ۺIhÁ1- YU՟՟5ۺ[$g€[g€a՟ۺ5Y$ˀ,g€sUs,asUs[,՟jI>I>= j[0 5$UssI> 5$= $j$ 5 5I>= 57++}$ 5= +++++|jj 5$= 0= s 5~~~+|$,՟,= g€sI>= $sg€[[$[j= s,,ss= 7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@d0I$I$I%$I$I$ImmnI$I$I$mmЊ|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|"٣d$TȴдUUUUUUUUUUUPEUUUUUUUUUUUU@`I>I>I>00[s[[a$ ՟[I>j00[,$5sa5Usg€[UsۺۺY,,ˀ5ˀ$[++|+| 5+| 5 5$$0s$jjUs[$$asaUs,s= = 0Us0= 0[$՟jaˀs,j,$ 5|= ˁ YaI>j 5~+}sssss7+~+~7 5+|7777BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<BUUUUUUUUUUUUUUUUUUUUUUUU^}{{{B!B!B!!B!B!B1c1c1!@)Ҷ!:|#)Ҷ!:JBJƹJBJƹJBK2+k" ٣d$TȴдUUUUUUUPUUUUQUUUUUUUUUUUUb|| 5+}ss77~} 5$j|$+|= j$ 5 5j 5j0I>sˀ55՟5sI>j0 50Us5$++|I>g€ˀ,,s՟ۺ$tP[H0j+| 50՟$sjۺۺۺ$[=b[ag€ 5g€j$j0 1-= = = as[g€ 5ۺ= ,g€s,7777bBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0 $I$I$RI$I$I$mmm$I$I$[mmЊc*[2+k" c*[2+k" c*[2+k" csN 1Е-sN 1Е-s٣d$TȴдUUUUUATUUUUUUUUUQUUUUUUUUUUUUUU`[[g€= $I>I>$= s[$0[aUsUsI>07 5$j+|= $$0+|0 5I>s1-Us,s,g€5՟jIU[恌I5,ˀj 5sa [0jj$+|= [= = = = I>,g€,saˀۺYg€,aassjasI>UsI>s,,[g€g€s0$0 5j0,ۺۺ՟a՟Yj$I7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<(0I$I$I$I$I$I6mmm$I$I$[mmmN 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1Е-sN٣d$TȴдUU@UUUUUUUUUUUUUUUUUUUUUUUUUUUUUaY՟$$՟Us= +~705jj՟ =bYUI$j՟ $ۺۺ5՟5՟$1-$Us[jjj,5sۺ1- 5a[,[000j 5 5$ 5jjg€sa= I>I>sg€,[ˀ,aag€ˀsˀs5՟sj5ˀa5Yۺ5ˀg€Us,s[g€,[g=btPtP$ 7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0I$I$I)$I$I$MmmrI$I$I$mЊ 1ҥ|#)Ҷ!:e:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT٣d$TȴдUUUUUQUUUUTUUUUUUUUUUUDUDUaYۺ5ˀ$UUs,ˀ[= I>g€aUsa[Us 5+|$jj0$g€sa,sg€g€,[,s 5 5j+~+|0= j $j5aaaˀaˀ$5Yg€s= 0Usˀۺj[sssg€= g€= Us0Us[+|}77~~+~+|+| 5$g€= j|~70[,s[s7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<T0I$I$I)$I$I$MmmrI$I$I$mmЊ5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τd٣d$TȴдUUUUUUUUUUUUUUU@UUUUEUUUUUUU`Usg€[[g€,[$= [,aI>0,= $= s55ag€Us[g€ˀsۺˀ$Uۺa$ۺg€,$aˀۺ5jˀg€sˀ$+~~77 5 5j0$ 5 5j 50j0 5$$j$I> 5+| 5jj= $j= j~~~7+|++| 5jj$jjj~+|000I>Us0$j$$0007777BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUU\9εkZֵkZֵkZ{{{9s9s{{{B!B:VD2BT5τe:VD2BT5τe:VR>[\S R>[\S R>[\S R٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU`= [I>$$= $}+| 5I>Us= g€5[[= 0$0$[,ۺˀ= I>jjUsUs[$00Us= I>asˀ$$Yj[a= 5՟55s,jjaۺUsI>I>,UsI>g€jj5g€Uss$$$Uss[Us[Y Us= j 5I>5jag€g€[g€sg€[Us[a,ssI>= 5j$g€g€g€,s,g€[7777bBUFRb f2  +,-ZZ!bLEICESTER CENTRE 1% t#StЌ @@<0 $I$I$RI$I$I$mmm$I$I$[mmm2+k" c*[2+k" c*[2+k" c*[td)sN 1Е-sN٣d$Tȴд@]Y d~#`,YUO$|% @00a @ 53@I1$ ` 5j00$ @ @j0P @O@@V~~\9g L q`9,?d?x&%^5|UĴ X-P2Zjj1?x P`3@j1-$0#`F00|$А @`3@,Y d @@ˀUc |(I>m՟7777jBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@< 0I$I$I%$I$I$ImmnI$I$I$mЊ 1Е-sN!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:ƹJBJ٣d$TȴдUUUUUUEUTUUAUUUUQUUUUa$ˀ5,[$j[,,g€aۺaUs 5 5g€s0= $$$7 5j00 5 5j++| 5+|jj 50~|$0I>j00 57j+++| 5 5$ 5$}~77ss| 577+~7Usg€$j 5 5+| 5j$$jsg€ajj5$a7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<40$I$I$II$I$I$mmmܒI$I$I%mmЊƹJBJƹJS R>[\S R>[\S R>[\S R>٣d$TȴдUUUUUUUUUUUUUUQUUUUUTUUUUUUPQU`,s,55,= 5007~7+| 5jI>0$$I>$ 5$jaI>jI>g€ˀ$$1-՟g€g€ˀjg€0$j$ 5= Us0 50I>g€= 0 5+|j$Us[a,$= = I>0= 5jj$ˀs,g€Us0+| 5$$ 5 50jjjUsYUs= $ 5 577|+~| 5jUsgY7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<H0$I$I$JI$I$I$mmmܒI$I$I%mmn`[\S R>[\S R>[\S R>[\S R>[\S R>[\٣d$TȴдUUUUUUPUUUQEUQ@UUUUUUUUUUUa- I1-ˀsj՟jaUsg€Us$I>= UssUsg€ˀ,[ 5}7+|[a[[g€I> 5 5 5j$j 5+|+~+}ssa| 5 5jj| 5j 5jj 5+|777s+|$,ˀˀˀ՟j՟ˀˀsg€g€UsUsg€Us= I>g€[a,,sI>g€[ˀjaUsI>=bh $ˀ57777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<`@"""""""""""#3DDDDEUUUUUUUUUUUVfffffffffffwpS R>[\S R>[\S R>[%K|#)Ҷ!:|#)Ҷ!:e:VD٣d$TȴдUUUUUUUUQUTPPU@UTEUU`j՟s0$j= 0$= 0$I>g€[Usg€UsI>aUsj 5 5 5jI>0j 5 5+| 5= $~}sss+|j 5+~++~~77| 5 577~+~~77|+~|Os7jUs 5~7+~777}+| 5+~7~7 5$I>g€s,0j+| 5+| 50= [= = g€= 07777IBUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUUUUUUU_{{{B!B!B!!B!B!B1c1c1cB!@2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT٣d$TȴдUU@AUUU@UUTUUUUUUUUUUUUUUQUUUEU` 5$I>[g€g€g€g€ 5++|+|$$ 5}$$[0I>$j 5+}+|0Us,[[ 5$| 5s1-$1 = 0= 0$= I>j$g€50= $0$[ˀۺÁY,,՟UtPI }} UU ˀ[՟ 1-$ 5+| 5j= $I>sˀj 5+|I>sUss,7777bBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I)$I$I$MmmrI$I$I$mmЊ5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τd٣d$TȴдUUUUUUUUUEUUUUPU@UUUUU@UUUU`UsUs= I>I>I>UsaۺI[j՟g€,g€ag€aY=bg€$+~|0$$,,= 00g€j= jjj7$[I>I>UsI>I>Us[ˀ,0$= 007777s77~~|$ 5++|j 5$ 5~7+~}~| 5sˀg€5ˀjˀ5jY,I>= jj++~7 5$5j55j5jjۺ$$ˀ7777jBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<(0I$I$JI$I$I$mmmܒI$I$I%mmn`:VD2BT>[\S R>[\S R>[\S R>[\S R>[\٣d$TȴдUPUUUUUUUUUUUUUUUUUUUUUUPUUUaYˀss$++~|aY[[$Us= 0,g€g€51-[j 5j 5$$,ۺ5ˀ,ssjUsI>= [assˀ՟= j= $=b5,g€a,՟55,jUsjˀ00 500$j$j0$$I>= Us,,g€0j0j777~+| 5 5$$Usˀˀg€= ˀg€7777jBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0I$I$I%$I$I$ImmnI$I$I$mmЊS |#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|"٣d$TȴдUUUUUUUUUUUUUUUTUUUUUUUUUUUUU@E`,՟$a[5ˀag€[ ajۺ$$5ag€Us[g€UsaUs$I>I>g€I>,,sI>I>[[,jˀ5Usag€aY ˀj1-= j 5+~~| 5I>s[g€s,ˀ5՟ۺˀˁY jaˀ[[= Usjۺ5ag€s5g€g€,,s5$g€$jUs 5 5I>,UsI> 5+~~|+|7777jBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<T0I$I$I%$I$I$ImmrI$I$I$mmm`)Ҷ!:|#)Ҷ!:|#)Ҷ!:τe:VD2BT5τe:VD2BT5τe:VD٣d$TȴдUUUPUQU@UUUUUUUTEUUUUUUUUUUU`$UsI>$$Us[ˀajI>I>j7|j= 5I>j+|~7+|j[ˀ[$$+++| 5 5j$[0$j0 5 57~|I>I>g€Us= Us0I>0= g€s,s,[0|0+|[՟$5,Usjhh[ [恥$U$5I>Us= 0g€,jˀˀ[sUsg€[,ˀa5,Usg€,g€I>7777jBUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UU]kZֵkZֵkZ{{{9s9s9s{{{{{{2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT٣d$TȴдUUUUUUUUUUUUUUUUUTPUUUUUUUUUUU`= ,aۺY՟sg€= g€as,ˀ[tPU1-1-Yۺj՟[[,sa5ˀa1-}[=b$՟jj5aUs0[$= 0j00I>$՟a 5+~~7j$Us0+~+|j$jj0[Ussˀs= = 0= a՟jg€a,,ˀ5՟$՟5ۺˀ5j5ˀ[ۺ57777bBUFRb f  2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0I$I$I)$I$I$MmmrI$I$I$mmЊ5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τd٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUU@QUUUUUUa$՟aۺ՟ۺ$-hI=bYY hUY1-a= g€g€,sh 1bZ5sa,՟1-I$HYjj[UsI>$0 5sjۺIۺaۺUtPY0+|jjj= ss՟s[$j0$0$[g€ 57777jˀa5,ˀ$1-1- YYY-V%tP՟j5ۺ5,7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0I$I$II$I$I$mmmےI$I$I$mmm`:VD2BT9JBJƹJBJƹJBJƹJBJƹJ٣d$TȴдUUUUUUUUUUUTUUUUUUUUUUUUUUUUUa=b ,$ 5|0ss[I>$0Uss,s55$h[ 1- $՟  jag€g€ag€,g€[g€Usj$ 5}|0ۺ$ ՟g€a[Us[[g€5ۺ1-[tPhUj0 5ss՟a$jI>Us[Usa$=b5ˀ5՟1-s[[g€a,5s,s5$II$| 5|7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0@DDDDDEUUUUUUUUUUUVfffffffffffgwwwwwwwwwwwxBJƹJBktd)lktd)lktd)lktd)lk٣d$TȴдUUUUUUUUUUUUUUUTUQUPUUUUUb77j|[,= [Us= 000Us՟1-1-Yg€g€jjjg€5$$g€[g€$1-ajsUsUs5j,= Us0I>I>Us[5j[I>$|jUs$+|++|+| 5$jI>$ 5~+|~77+|j$g€= 5,g€[g€Us 5+~7saa00[g€[g€a57777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@P@"""""#33333333333DDDDDDDDDDDDUUUUUUUUUUUUffffffffffffwwwwwwptƹJBJƾ[\S R>[\S R>[\S R>[\S R٣d$TȴдUUUUUPUUUU@UUUUUUUUUUUUUUUUPUUa1-[ۺ5[= a,ˀˀ[ˀ5ˀ,0 5$77UsۺY՟aˀg€aۺ5ۺˀs 5 5j7+|Us՟ۺsˀ[ˀ5U$$ I> 5 50I>j՟5sˀ5՟IIhtPIUa5՟I>= $[,I>0jI>s0= 0I>jI=bY5I>7as7$5$ˀˀsˀ7777BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<BUUUUUUUUUUU]kZֵk[{{|9s9s9s{{{B!B!B>[\S R>[\S R>[\S R>[\S R>[\S R>٣d$TȴдUUU@UUUTUUUUUEUUUU@UUUUUPUUUU`,ˀ5ۺ $՟jsI>= }7+|g€aˀsUsg€sUsjjj js= $jUs++~7|I>5g€5,g€ˀˀ5Y՟ 5՟ 5jj+|jj1-[Y$՟aˀjaˀˀ[[$+}77+|jsˀˀˀ,ag€I>[I>Us,g€00 5 5 5jI>7$0g€0$ 5j0 5$$0,g€[57777bBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0$I$I$JI$I$I$mmm$I$I$Immm۶`[\S R>[\S R>[\S c\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!L٣d$TȴдU@QU@UUUUUUUUUUUUUUUUUUUUUUUU`= [ 5= 0+}}77|j+|$= I>= 5+}a7+|$ˀۺۺˀas,ۺY 51-1-՟ۺˀ,ˁYÀ՟՟YhY-$[=bU$5jY[--[怱j՟$IÁY-$[U$,sۺ1-Y$ Y$=bUI=bYۺ,[I>I>00j07777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@< 0I$I$I$I$I$I$mmm$I$I$ImmЊt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\٣d$TȴдUUUUUUUUUUUUU@UUUUUUUUUUUUUU`5ۺˀa,aj՟ۺ$[sI>= 0g€$j++|0= = [g€UsI>g€aj5sg€ˀ՟՟,Usg€= j 5 5[s,Us+|j++|j0j[ 5$+~77aۺ՟5ˀI>I>Ussa1-$$  $՟՟j=btP1-js՟ۺ$1-[恌}}YIۺ[5=b}IÀ՟57777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<40I$I$I$I$I$I$mmm$I$I$ImmmЊFSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSl٣d$TȴдUUUUUUUUDUUUUUUUUUUUUUUUUTUUUUU`$UÁtP$ jۺ=b}5g€,[aj5ˀˀg€[|$ssjI>,sUsg€a jsg€Us0I>sˀj5[= = [ˀ՟՟j՟՟a,a,a5assaˀ,g€[I>I>I>Us0= Usg€aaUsI>$j|jI>g€[0j 5 5 5 5j= [aa,Us= I>7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<H0I$I$I$I$I$I6mmm$I$I$[mmm`pC!Lt-sN 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1٣d$TȴдDUUUTUUUUUUUUUUUUQUUUUUEUUUUT@`j+|7|j0g€I> 5 5 5$= Us00$$ 5+| 5j$I>g€sUs$$I>I>g€s5jag€I>0= jjj= g€s[g€,sˀ55555555a0+|$Y՟g€sa5՟Y5ˀˀۺ5g€= +|jI>[g€= s= 0[[g€g€g€aۺs= jj7 57+~77|j7777BUFRb f  2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<`0I$I$I%$I$I$ImmnI$I$I$mmЊ-sN 1Е-sN!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|"٣d$TȴдUUUTUUUUUUUUUUUUUUUUUUUUUUUUUUU`$j 5jag€sjj= = = I>g€077|= 5jassۺ $$Y՟a,Us$j[5ۺ,,as5$YY$Y$Yۺjg€[sj1- jۺˀ5jY $$5aaj 5j0ˀۺ1-1-$  1- hItPtP[[hP$$՟ۺۺ5ˀˀ՟ =b1-UhI7777BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUU^s;{{}{{{!B!B!!B!B!B0)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:e:VD2BT5τe:VD٣d$TȴдUUUUUUUPUUU@UUUUUEUUUUUUUUUUUa$=btPh[[tP$$jjˀg€a,g€g€jg€g€gYˀ,Us[= ++}ssg€ 5$j00Usˀs,g€Us[0+}7ss7I>՟5ˀˀۺj5aj[[ˀ,= j 5+|jUsI>sYj,= I>[[I[hhU$aI>= 0= [$[ ,j$ II[恀h YۺˀsUs7777bBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I)$I$I$MmmrI$I$I$mЊ2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT٣d$TȴдUUUUUTUUUUUUUUUEUUUUUUUUUUUUU`g€= g€ۺ j5՟5 ˀsI> 5 5~~7+|$Usa,s[Usj Y՟g€I>$+~+~77s7j= $0= 0$= [ $՟jaUs= +|0jj՟5Y5ۺ$YY $YYۺ,[j05$$$YY $1-=b=b$Y$ۺ՟ۺY$ۺۺY$ۺ՟7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<$0I$I$I)$I$I$MmmrI$I$I$mmЊ5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τd٣d$TȴдUUUUUUUUUPUUUU@UUUUUAUUUUUUUUU`jYIUUI=bUIU=bU$$ =b[[Y$ $1-=bIj[[= 5+~77sۺ=b  ,ˀۺY$jˀˀ5,++~77+|[5 $$,Us,$$$jۺۺ՟g€+|I>՟j՟jj$՟ˀsˀ5jˀs= j0UsUsI> 5 5jj= j[U7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<80I$I$I)$I$I$mmmܒI$I$I%mmn`:VD2BT5τe:VD2BT>[\S R>[\S R>[\S R>[\٣d$TȴдUUUUUUUUQUUUUQUUUUUEUUUUUUUUUUU`$5ۺ,ˀ,a՟[ÂIYUtP[恥$tP[  $5,0$|g $ۺۺˀ$hhh[=bsI> 5+| 5[ 1-$՟ۺ՟$tPI=b jj7$sY[恘Uۺˀ,ˁ1- ˀ՟՟ss0+|+|= I>1-[$՟ˀ5ۺۺ$ۺ55ˀˀa,0$j$7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<P0$I$I$JI$I$I$mmmܒI$I$I%mЊS R>[\S R>[\S R>[\S R>[\S R>[\S R٣d$TȴдUUUUUUUUUUUPUUUUUUUUUUUUUUUTUU`= sˀ55s,,a$ ۺυjˀ,OXasg€OX[g€,5ˁY$YY$$Y$a+k}|= 5jۺυ$$ =bh$YY$υ5jυ 1-υ hhtP[hIYۺ[[}~+k}}bOXj υˀ,sυ5g€[g€j}~+k>b+kjI>j1-=bY j7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<d0$I$I$JI$I$I$mmm$I$I$KmmmЊ>[\S R>[\S R>[\S c\FSmpC!Lt%Kc_td)lkt٣d$TȴдUUU@UUUUUUUUUUUTUUUUUUUUUUA`5ۺIU$= ,Us$j 57sa+|0sjˀ,a,ˀ,[ۺYUUˀg€a,j,Y$՟$YY՟$,,I>0j~}aas+| 5700j$= jj 5+~~77$,5$IhtPUI[Uh[恌}h1- $jsI>5 ۺ5ˀasˀg€a[ 5++|7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$I&mmm$I$I$KmЊd)lktd)lktd)lktd)lktd)lktd)٣d$TȴдUUUTUUUUUUUUPUUUUUUUUUb77770j$sI>I>I>Usˀ$5[[= +}sas$ۺ=b1-$ˀ,j$$ۺ՟5՟s7sss7j[0 50j 5Usa5[sg€,a,$+~~+|j[՟[I>00= = [sag€,$j 5}+|aasaa  YY՟5g€ 577|= 7777BUFRb f  2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$I&mmm$I$I$KmmЊlktd)lktd)lktd)lktd)lktd)lk٣d$TȴдUUUUUUUUUUUUUUU@UUUUUUUUTUU`jˀsasI>,s Us= = j 5+|7|$0jU=bjۺsˀ5,j՟ۺ =bۺUs= j= j 5ja՟$$5j5jۺˀjˀ5g€0 5+|0g€5ˀaaˀ5՟ jjUs 57 5[$$1-I1-$1-tPhIY՟0j$$g€j~7|Us=bh1-՟sg€aa7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<,0I$I$I$I$I$I&mmnI$I$I$mmm`td)lktd)lktd)|#)Ҷ!:|#)Ҷ!:|#)Ҷ٣d$TȴдUUUUUTUUUUUUUUUUUAUUUUUUUUUUT`= I>g€I>I> 5 5$|~77= [g€g€g€sˀg€I> 5j 5 577+~7+|j$$IhI1-I$UUI=b $=btPUI=bۺ[0,jY$ۺY[恀tP[Y,Us0,aj++|I>՟՟$=b1-=b5՟Y I=b=b=b[=b1-s= I>[,ˁ1-1-$ۺY$=b=bU՟ˀˀI>0+|7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<D0I$I$I%$I$I$ImmnI$I$I$mЊ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUTUUUUUAUass70aۺۺ,5Yۺ1-=b[I=b$ jۺ,sۺ$1-hÂV%%Q$h=bIItPtP=b$I=b1-jg€= Us[= g€g€sg€s5Y՟ۺ=b $՟ 1-hÂ1}  Á$[I1-II1-=b1-UU = j+|$Usj՟ۺY$sUsg€= $ 5+~|Usg€ag€7777BUFRb f  2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<X0I$I$I%$I$I$ImmrI$I$I$mmЊ|#)Ҷ!:|#)Ҷ!:|#)Ҷ!BT5τe:VD2BT5τe:VD2BT5τd٣d$TȴдUUUUUUUUUUUUPUUUEUUU`[ssg€g€s,s[ 5Us0I> 5j$,5ۺ5ۺaUs0j+}7$UsY1-՟՟a0j$777ssaO|+|sjI>՟Us+~7sa+| 5++|7+|000[sa= 0Us 5s|j0|ja$1-jY  YIY7777BUFRfb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUTD]kZ{{{9s9s9s{{{{{{!B:VD2BT5τe:VD2B>[\S R>[\S R>[\" c*[2+k" ٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUAUUUUUUa=bI1-Y՟,$ 5= [sg€jj$$1-IU1- j$ˁ=b՟՟jj՟$Y5$j՟ۺ1-=bhU$ۺ՟55 ۺˀ[s5՟Y$$ۺY[=bU[h1-1-$ۺ5=b$ 5$ $$  $$ $j՟ۺ՟՟g€,+~|jUs Y1-$Yۺ$=bh$1-I $s[[$j7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0 $I$I$RI$I$I$mmmI$I$I-mЊc*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[٣d$TȴдUUUU@UUUUUUUUUUUUUUPUUUUUQUU`g€ˁY 1-ۺ՟$$՟$aUsI>g€g‚}saOOs|j+|[UsI>g€ˁI ۺ=b1-$՟$YUs= g€sjhhIYۺjY[sj՟$YIjs0UsI>0$ˀۺ1-ۺ՟ۺ՟ˀˀI>$+~~}OsO7jsۺ 55ˀ=btP$[0j7I>ۺ$Y՟Yˀ7777 BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0 $I$I$RI$I$I$mmrI$I$I%mmn`2+k" c*[2+k" c*[2+k" c*[%:VD2BT>[\S R>[\٣d$TȴдUUPUUUUUUUUUUUUUUUTUUUTUUUTU`,5$$՟՟,g€gƒ++~7sjsjag€I>= = [ˀ5$ YۺYIY,,g€= Us[,ۺI$ۺg€Ussa$[hhhI$՟՟5$YIhhUI=b1-YYY՟j$++|$51-5jˀۺjaag€j7ss|0ˀ$Yۺۺ $ۺۺۺ5I>I>j 5+| 5007777 BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@40$I$I$JI$I$I$mmmܒI$I$I%mЊS R>[\S R>[\S R>[\S R>[\S R>[\S R٣d$TȴдUUUUUUUUUUUDUUUUUUUUUUUUUUUUUUUU` 5sYIh Y$$=btP$$hU$ۺ,Usg€YI[[ ۺYY55,g€g€UsI>0j|+|$I>,ˀss55=b 1-1-1-=b,UsI>0,j՟Y Yۺ՟Y 1-1-Y$ۺ,= 0$,$UssۺY՟$Y $Y1-UIII1-$ۺUs[5ˀa5jۺ$ۺ $7777 BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@H0$I$I$JI$I$I$mmmܒI$I$I%mmЊ>[\S R>[\S R>[\S R>[\S R>[\S R>٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUPUUUa $I1-$$j՟,s5ۺۺۺY=bY$Yۺ5ۺI}%Q  -hIU[YYY$$$$5$$=b1-1-$I ۺsj՟՟$ۺ5՟ۺۺ$1-1-=b=bUs0$~7Oaa= I>0$[sUsUs,a[00 5= 5+~}700$= = Usg€g€,Y  7777 BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@\0$I$I$JI$I$I$mmmI$I$I-mmv`[\S R>[\S R2+k" c*[2+k" c*[2+k" c*[2+k" ٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU@`ۺj5՟ۺ5sa 1-1- $1-UÁYH$hI $Y՟՟$=b-$=b$$h[1-1- $$$ $$ $ $1-UI[$$  Yۺ՟ۺjjۺY $$$$$Y1-$II$$1- 5s= Us$$[՟jˀˀ5ˀa,sUs= j$ 5jaa7777 BUFRVb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<BUUUUUUUUUUUUUUU^s9s9s{{{{{x!B!B!BB!B c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[٣d$Tȴд BB!B!BB!B!B!B!B!@B!an6ttcccctt,g€g€,gƒttcctbZ$n6t51-tHbZctttHcHn6H$zzzbZˁ=bC|  1-C|[1-Y=bYۺ55ˀgƒbZbZHts$$ YYC|OO$5g€aˀY=b[OY5P  h=bY$$$˃ttbZt5$$étPO7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@< 0 $I$I$RI$I$I$mmmI$I$I-mmЊ2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[t٣d$TȴдUUUUUUUUUUUUUUPUUUQUUU`$Y=b1-Y՟,ˀg€+~77$s5ajjj5j՟,,s0= j+|7+|$sUsUsUsUsUs[55g€I>0I> 5~}7+|0g€I>I>[UsUsUs0Us[Usj}as|jˀ$ۺ՟ˀ,s[,g€[= j+|sa7+|I>ˀˀˀ[$$$jUsj~77s7777aBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<$0I$I$I$I$I$I&mmm$I$I$KmЊd)lktd)lktd)lktd)lktd)lktd)٣d$TȴдUUUU@UUUUUUUUUUPUQUT@EUUUUUUasas|0՟$$5ss0I>,՟$jjsI>77s7jI>Us,a[I>= UsˀY=bhUs= I>0jUsYYY,g€s,5Y$ۺ5j[Us= }s$Us0 5 5j+| 5,5՟g€I>+| 5+~} 57 50I>0 50$$[ˁI[[恌tPtP[=b=b=b Y$[7777aBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<80$I$I$JI$I$I$mmmܒI$I$I%mmЊq[\S R>[\S R>[\S R>[\S R>[\S R>٣d$TȴдUUUUUUUUTUUUUUUUUUUUPUUUTUUUUaU Y1-$I[ ,[j$ 50[ۺtPU[՟ۺYY II$g€$$j~77| 5$ 5[0jj0= sj,[I>g€ۺg€Us$= ,1-=bU 5s,YU ˀI>g€,$Us7+|Us$Y s= = 0= [[I>0,= 5+| 5 5$[sˀg€[jsaa՟=bU7777aBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<L0$I$I$JI$I$I$mmm$I$I$Immm۶`[\S R>[\S R>+k" c*[\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!L٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUa[[I1-$$$՟5$ $Y՟,՟ˀ IYۺۺj5sI>I>jj[a$1-ۺ,ssg€5$Y$ÁY[$$$U1-tP-I=b jˁYUtPtP=b =b1-Yۺs,,ˀ՟,ˀ5ۺ55ag€0+}ss$ˁtPU՟a՟YUI=bˀg€= j$j|I>7777aBUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUU\c1c1g9s9s9sZֵkZֵkZֵo{{!B!B!BB!B t%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\٣d$TȴдUUUUUUUUUUPUU@UUUUUUUUUUUU`$Y՟ˀUs0I>sˁY[恥$[=bY$a= Usaˀ5g€j= = g€sˀUs= jj 5++|777| 5++| 5$$ 5j 5$j77|0Usa ja5jj՟j1-$$ۺjjUsۺ5[,5՟ ՟aˀ5,UsUs0j+}s|= Y$ˀag€Us= ,7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@< 0I$I$I$I$I$I$mmm$I$I$ImmmЊFSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSl٣d$TȴдUUUUUUUUUUUUUUUUUUUUEUUUU@UUUU`sˀˀˀ,g€UsUs[g€g€I>s5$,Usg€[UsUssaU ۺ՟$  ˀ՟$j՟ˀsI>$$= I>= $g€a[Usa0$~|jI>ۺjs[sg€ۺ1-jYg€aUs0 5 5 5|$g€՟ˀjs= sI>[5aۺ5g€g€077+|I>g€ag€Us= 0$$= = 0I>$j7777sBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@< 0I$I$I$I$I$I$mmm$I$I$Immm۶`pC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!L٣d$TȴдUUUUUUUUUU@UUUUUUUUUUUUUUUUDc~+ktPbtP>>|g€sOXI>0I>[,5ˀ,[[00$$[5ۺj,ass[[[[[g€OX= I>= j~+k+kb>>b 5j$0$OXI>OX[aۺυۺ,OX[0 5 5,[j 5j 5 5$$sˁ1-1-$Yˀ,,I>I>[sυj5ˀ,ˀ [= = s0b 5+k+k+kb|7777sBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<80I$I$I%$I$I$MmmrI$I$I$mmЊt%Kc\Ҷ!:|#)Ҷ!:5τe:VD2BT5τe:VD2BT5τe:VD2BT5τd٣d$TȴдUUUQUUUUUUUUUUUUUUUUUU@UUUUUUUUU`[ˀ[s[0I>g€g€[= j+| 5g€U,sI>= g€g€,ۺag€,,ssg€5$jjI> $ ۺ՟j5ۺۺ1-1-=b=bY$,UsI>jsg€Uss1-1-1- $$ˀ5՟jˀ,sg€Usa7|$g€g€I>= 0I>,j$h ՟1-$ۺ$ 1-1-s,ssI>$00a7777sBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<L@"""""333334DDDDDDDDDDDEUUUUUUUUUUUVfffffffffffgwwp:VD2BT5τe:ZBJ2+k" c*[2+k" c*[2+k" c*[2+k" ٣d$Tȴд@ aY $1-$ Pˀ,ˁ YۺYY1-O[[C|1-C|O=b  $=bOC|C|OυPυ=btP$$1-ˀˀC#0aυυۺPaaۺ$$ 1-$ 5C#C|[$5Yυ[$[tPC|C|=b=b5Pۺg€5,,g€g€C#ˀ= $[$tP=bOY$ˀ5a,7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<h0 $I$I$RI$I$I&mmm$I$I$KmmЊc*[2+k" c*[2+k" c*[td)lktd)lktd)lk٣d$TȴдUUUTUUUUUQTUUTUUUUUUUU`[[aa,aUsj| 5$= aI>ˀˀI>0}7|$,՟ۺg€s$I>= = $+~777asaasja5Us$$$0 5+|$jj7as$g€a[= I>= = UsI>I>Us= $}+~777|I>ۺ $,s0[ˀjˀj՟Y՟1-1-$U$$[htV~ YY1-=btP7777sBUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_{!B!B!BB!B!B1c1c1cB!B!B!JPtd)lktd)lktd)τe:VD2BT5τe:VD2BT5τe:VD٣d$TȴдUUUUUUUUUUUTTUUUUU@DUUUUUUahh-$=b5I>՟Y$Yja՟[= g€5a[Us[,g€j՟Usj0g€Us,ˀUs0+~7$UsˀI>= +~7+~777$ˀ5՟ۺ,g€ssI> 5++~+}OsaO| 5Usˀ,= = jI>g€Usag€I>++|+|+| 5  jg€sI>I>ˀ0= Usj,sg€a7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I)$I$I$MmmrI$I$I$mЊ2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2B٣d$TȴдUUUUUUUUUUUUUUUTUUUUUUU`՟YI$HI>7~+| 50$ۺII>jUsUss[= =bۺg€[[ssˀ5[HYtPtPh=bhI1-j5jg€g€[,ˀsˀ˂}+~~777asss7++}sass7j,,,j= j$Usˀ,[tPaˀg€ˀۺjag  1- Yۺ7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<,0$I$I$JI$I$I$mmmܒI$I$I%mmЊ>[\S R>[\S R>[\S R>[\S R>[\S R>٣d$TȴдUUU@UUUU@UUUUUAUUUUPUTUUUUU`ۺa,sUs$jj~~|= ˀasg€as= [g€j,ˀ$+}|aa|՟5$I=b j$jj[ۺ5j5= $+~7sۺjs[,s[= = $I>j$|$jj7| 5I>I>[I>I> 5+|jUsUsUs[Usjۺj$j՟jۺa$}ssOs+|$7+|7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0$I$I$JI$I$I$mmmܒI$I$I%mmn`[\S R>[\S R>[\S R>[\S R>[\S R>[\٣d$TȴдUUUUUAUUUUPAUUUU@UUUUPUUUU@b}asss,a5sUssg€,g€= j= [ˁ[=bˀjj++|$ 1-$g€5Y$j՟՟s0= I>$}~7j,IU ag€g€g€as[0s}O7jUsag€sˀg€,I>[Us,s= j}7|j[g€Us[I>0g€I>= s= I>aUs 5j+}s7}7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<X0$I$I$JI$I$I$mmm$I$I$ImmЊS R>[\S R>[\S R>[\S c\FSmpC!Lt%Kc\FSmpC!Lt%Kc\٣d$TȴдUUUUUUU@UQ@UUUUUUUUPUU` 5= 0= [a,g€a,ˀhY[$[$0[a[ 5++~}77j= I>g€g€0 5+|ss77g€I>~| 5}7}+}+}7 50I>Us[[Usa[,s0+|j 5jj[,ˀˁ 1-՟aI>Usj$, 5}+|77$g€[0$$0[7777BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUU]kZֵo{{{9s9s9w{{{ހ!B!B!BFSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSl٣d$TȴдUTUUUUUUUUUUUU@UU@UUU@`j0= = 0}7 5j0[a՟,[$ 5j0[ˀˀˀs[$$}77jjjI>,,0= j$$00= a$YtPh1-1-ۺg€g€,aˀ,[0+~7s7j[g€I>j 5j|I>g€= ssss|= 0 5as$s= jjjj 5I>55[ 5+}77777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0I$I$I$I$I$I$mmm$I$I$Immm۶`pC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!L٣d$TȴдUUT@UUUPUUTTUQUUTPPas}$aUsI>[[= g€I>Us0+|+~}7~| 5= g€[[UsUsI>= 5 50 5++~}sas7|= sUsUs0$00j$0j+|= 5 5~77+++~7+|0Us$$Usj7jj$0= UsˀI>0j|jUs= }77+++~~7|,7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@ @"""""""""""333333333t%Kc\FSmpC!Lt%Kc\FSmpC!Lu-sN 1Е-sBT5τe:VD2BT5τe:V٣d$TȴдUUUUPUUUUUUUUUPUUUUUUUUUU@`ˀ5ˀ5j՟g€00[g€g€= s 577I>jۺja,a5ˀI>$g U,s[= j 5a5jˀ,[[Us0$$= = 5~+~77+|0,I>$$$++|jjs$ۺ$՟[[[UsUssaaUs$$ 5}7 50[= 5$ 5 5j= = a5$5sj7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@H0$I$I$II$I$I$mmmےI$I$I$mЊBJƹJBJƹJBJƹJBJƹJBJƹJBJ٣d$TȴдUUUPUUUUUUUUUTUUUUUUUPUa$Us= 0g€g€g€Usg€0= I>0jj 5+}7s+|j= I>= = I>g€Uss[,aa,ۺ55s,I>jUs,ˀsg€a[[UsasI>Us0jj= j7$$+|$~~~|+~70I>= 0I>UsˀUs 57j 5 5Us5,,,ˀ5՟$jUs,5$s[I>0}|sˀۺj,a7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@\0$I$I$JI$I$I$mmmܒI$I$I%mmЊ>[\S R>[\S R>[\S R>[\S R>[\S R>٣d$TȴдUUUUUUUUUQUUUUUEUUUUU@UUTP`,ˀss= Usˀ,,a55ۺ$,g€[g€[ۺI=b1-Yۺa= [|$Usg€g€I>= 0= $ 50[I>ˁU $ˀ$= +| 5ۺ ˀ5՟$ ˀag€jYۺˀI> 5 57} 5+~~7+|0= 0 5j՟5g€j++~77+} 5~77}$s7777BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<BUUUUUUUUUUUUU]|9s9s9s{{{{{{B!B!B" [\S R>[\S R>[\S R>[\S R>[\S R>[\٣d$TȴдPUUUUTUUUUUUD@UUUUTUUUUUTaYUs7+~~7}ss7~}70a I$՟[Us՟5sUs 5jˀ$$70j[5՟UsUsg€ˀ5$=bY$ss[0Usa$$՟aI>I>|| 57$= I>I>$I> 5= = 0j$ 5 5jj$0asas$= $I>00I>Us= I>Us= [I>UsUs= = 0j0I>j|7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@< 0$I$I$JI$I$I$mmmI$I$I-mЊS R>[\S R>[\S R>[\S R2+k" c*[2+k" c*[٣d$TȴдUUUUUQ@UUUUAUUUUUUUUUUUQUU`0= 0I>0$j 5I>I>= = [UsUsg€ss}sasOOOsas77+|0$j 57++~+|0Usg€,ag€sss5ۺ1-U1-Ysg€= j+| 5,՟5sg€,UsssI>$ 5j= I>I>= 0I>UsI>sa,,a$Uss[g€ˀ$1-1-I>$j0= |= ajsg€[I>g€I>7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@< 0 $I$I$RI$I$I$mmmI$I$I-mmЊ2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2*٣d$TȴдUUUUUUUUUUUUUUUPUUUP@UQUU`I>,a՟5j՟Y [[0g€ˀj$ 5,՟Y$5UYˀ՟Us[$= $,[5aaUs[= [[0g€sg€[j5ˀaa= 577s7777+| 5I>I>s77I>[0jjI>= [sg€Us= = $~7 5+}ss|j= $j= j+|jI>[I>0g€7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<40 $I$I$RI$I$I$mmmI$I$I-mmv`k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" ٣d$TȴдQUUTEQUUUUUPTTUUQPUUUQPUU`= $|0s= [jjag€UsUs 5+|= j 5j+|= I>$$jj0sˀۺg€s[Usˀg€ˀg€Us= [a[j+~~7+}0,= 7j$ 5|j$ 5= $0$+| 5$ 5+~+|jI>0$jjj$0I>= = = $[,= +|j+| 5+|j 5++~}77+~~7++| 5j00jUsj,7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<L0 $I$I$I$I$I$mmm$I$I$KmmЊc*[2+k" c*[FSmpC!Lt%Kc\FSmpC!Lt%Kktd)lktd)lk٣d$TȴдUUUUUQUUUTUUUU@UUUUUUUUUU`5Yˀa,jg€I>I>sUs0I>,g€g€$ 5I> 5+|00= ,j[s5ajjj+~7|$00$j 5 5 5j$jUsg€I>[[I>7s|= = 50= I>I>j= [0g€I>+|0= 5$[s0g€Us,I>= 00j$+|}}|0= 0= UsUsUsUsg€7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<`0I$I$I$I$I$I&mmm$I$I$KmmmЋtd)lktd)lktd)lktd)lktd)lkt٣d$TȴдUUU@UUPUUUUUUUUUUD@TUQUP`UsI> 50= 0000s[0 57|jj 500= $j0j~77+}+|jUsI>ˀ5՟՟ۺ,aۺ5I>[00[[Us= ˀsg€as5[恘[=bۺ$[՟0sUs$j|$+~+~7| 5= $$++~7777+~~77 5$$77 5a7+| 5 5 5| 5 50$0= +~77777BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUUUUUUU^{{{!B!B!BB!B!B!c1c1cB!@d)lktd)lktd)lktd)lktd)|#)Ҷ!:٣d$TȴдUUUUPUUUUTDUTUU@UPUa77|jI>g€,[= 0I>0I>= I>I>I>UsUs= 0$ 5}}+| 5 5$= jI>[g€Us$$= UsUs,ˀ= = 777| 5+| 5j$j+||$Usj$ 5+~~}7= ,Us= UsI>[0I> 5~7+++}ssas7I>= [Us[ 5j7~~7~77~77g€,g€s7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I%$I$I$ImmnI$I$I$mmЊ|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|"٣d$TȴдQAAUUU@UUUUUUPTUUU`Us 5|+| 5|j7|+|j= g€Us$= = Us0I>[j~~77s7$I>[= g€a,[= ۺˀI>$0I>[$ 57|+| 5 5$ 5+|j+}~7+|= sI>7sassasa| 5 5jI> 5+~}s70I>[ۺ5,ˀjs7777jBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<(0I$I$I%$I$I$ImmnI$I$I$mmm`)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ٣d$TȴдUPUUUUUUUUUUUUUUUTUUUUUUUUUUU`Usj0 577|jI>sas[,UsI>Us[I>g€g€UsUsa[js[$= ,,aˀsag€j[Us0Us= = = j= sg€I>$UsUsUs,ss,[= 0$$I>I>0jj++|7$I>Us= 0j= 0= UsI>= 0$= UsUs0jI> 5 5= 0 5jj$0= $$= 0$j$g€I>jjUs7777jBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0I$I$I%$I$I$MmmrI$I$I$mЊ!:|#)Ҷ!:|#)Ҷ!:5τe:VD2BT5τe:VD2BT5τe:VD2BT٣d$TȴдPUUUUUUUUUUUUUUUUUUUUUUUUUU`0j~7as77+|= = = $$= I>j0[,՟5s[,asI>ssUs[Us0I>jj$ajۺYg€I>I>[I>Usg€$0jI>I>,,= ,g€g€= I>00I>I>0= = 0[UsUs= = ˁY$ˀˀ5ˀˀj՟UsUs$= [g€[Uss= 5$a,,= 0$0|$[ˀۺg€I>07777jBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<T0I$I$I)$I$I$MmmrI$I$I$mmЊ5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τd٣d$TȴдDUUUUUUUUUUUUUUUa7}7+~7~77}ssss}+| 5 5+|++| 5+~77s7ssss777}sa+|$I>I>Us[[= Us[[assI>00= 0[g€Us$g€asg€,[[,ۺ՟ˀaUsg€g€ˀ՟$ۺ5,՟$ˀ,5sY7777jBUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<\9εkZֵkZֵkZ{{{9s9s9s{{{{{{:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD٣d$TȴдUUUUUUUUUUUUUUUUUTUUUUUUUUD`՟Y$=bg€,ۺ$$YaaI>[0aajg€ۺgYۺjۺjaˀaˀg€= = I>Us0Us5,$g€ˀ,ssjg€jUsg€s0j 5 5 5 5jjj+| 500sI>0s$7s7+|[js 5}~+|= Us= I>g€as5s= = Us[UsI>I>[a[$7|7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0$I$I$II$I$I$mmmےI$I$I$mЊ2JƹJBJƹJBJƹJBJƹJBJƹJBJ٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUU@c+| 5$[g€= j+| 5j= 0jaˀ= 55[j$I>g€s= = $Us[ 5 5$0 5g€$ˀg€,+~7+~|$jUsUs[g€s5jۺˀ[[g€I>0j 50ˀss00I>Us[[,UsUsj 57 5+|j 5 5 5 5 5 5j$$jj= 00$ 5+~7s++|7777€BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@UUUUUVfffffffffffgwwwwwwwwwwwxƹJBJƹktd)lktd)lktd)lktd)٣d$TȴдPUUUUUUUUUUUUUUU@UUUTUUUUc+~7+| 5+~7~777= = Us00j000Us= g€g€g€g€[aj1-jˀ= ۺˀ5՟5a[[[I>I>Us= [ 5$= aˀˀsUs$++| 5 5j 5j$$g€s= j= 7}as+|$I>[g€Usg€I>= 0= = 0 5 5$0= |I>$j0= UsI>0j0I>Usg€= ,7777=BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<<0$I$I$II$I$I$mmmےI$I$I$mmm`JBJƹJBJƹJBJƹJBJƹJBJƹJ٣d$TȴдTUUUUUUUUPUUUUUUUUUUUUUAUP`ssI>7+|70= I>UsI>I> 5 5I>$UsI>= ˀg€I>$7|$ 5[[I>0j0+| 5j= Us0I>՟՟5,s 5 5++| 5= [g€g€Usg€ˀ,a0= jj՟sUsj= g€$ 5= = [= 0 5 5$$j$Us 5jg€aa,5ۺ,s[g€s$+~7 5+}}+|$= jUs+}7777€BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<T@333334DDDDDDDDDDDEUUUUUUUUUUUVfffffffffffgwwwwwwpBJƹJBJ2+k" c*[2+k" c*[2+k" c*[2+k" c*[٣d$TȴдUUUUUUUUUUUPPUUUUUUPUUUUUb|= = s$,a[[ˀˀ5j,= 0$,jjUsj0[aۺ5s= g€ U$I$-$[ ۺ,g€ 5+~}77+~~~7+|7~~+| 50ˀ$ۺsۺa՟ˀtPۺ$ۺ5[$Us+~~77= +~7|j 5 5[$Y՟j5aI>[Usssj0g€= 7777=BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUU]{9s9s9{{{{{{!B!B!B2+k" c,ktd)lktd)lktd)lktd)lkt٣d$TȴдUUUUUUUUPPUUUUUUUUUUUUEUUUU` 5= 5g€sˀˀs,$aasˀ5ˀۺ$jaۺs 5|j7[՟5՟Us++~777~7 5I>j~+|$$g€I>ˀۺ $՟ˀg€j՟1-j5[ 5 5,j= $= g€[g€Us00= a,a5Y1- jˀ,,I>j+|= Usg€s[g€I> 5$ss$I>UsI>= = 7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@ 0I$I$I$I$I$I&mmm$I$I$KmЊd)lktd)lktd)lktd)lktd)lktd)٣d$TȴдUTUUUUUUUUUUUUPQUPUUUUUUUT`$0 5 5= 77~7s77$sjjj5ag€[= Us,tPIjˀa[g€UsajhÁYtPIYa,j55jj՟ˁ $ ՟,++|jj+|$g€a[0++~+~|jjjI>0I>g€I>$$ˀs,ajˀUs0sa0I>Us0 5 5++|I>g€,7777|BUFRb f  2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@ 0I$I$I$I$I$I&mmm$I$I$[mmЊlktd)lktd)lktd)lktd)-sN 1Е-s٣d$TȴдUUUUUUUUUUUUUETUUUUUPUUUPUUU`g€UsUsUsI>Us55j5j5՟5j55j5,g€Us[0$Us,Us$[I$Usj 5 5 5 5 5~~|0$= $$+|$,[j 5+~| 5 5Ussg€g€UsssUsUs,aYj[j55ˀjjs+|,g€0$ 50UsI>Us0Us0[0$+~~~+|$= [UsjjUs0g€ۺ7777|BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@40I$I$I$I$I$I6mmm$I$I$[mmmN 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1Е-sN٣d$TȴдUUUUUUUU@UUUUUUUUUUUPUUUU`j$YYY՟,sI>jUs,՟ˀ55j5՟ۺ՟՟jjj7jg€5j՟5j5jaj՟5asj++}+~7+| 5 5 5j$ 5 5$j0jj00I>$g€0 5$I>0g€I>+~7+~+|= [g€ۺۺs[[ssaa7= ,g€a5՟ssjۺs[a= = [,7777|BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@L0I$I$I$I$I$I6mmm$I$I$[mЊ 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1٣d$TȴдUUUUUEUUUUUUUUUUPUUUUUUA`0 50[g€s,as,g€,ˀ՟Y5 5j+~|I>+|j+| 5g€5,[g€= [0,g€՟hU5j5[I>= = g€,g€Us0= 0I>I>$Uss= UsUsI>I>j7++}s+|ag€UsUsUsI>= [,՟=b[1-ۺsa,g€Us00$I>I>= $~| 5}77~777777|BUFRb f  2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@`0I$I$I$I$I$ImmnI$I$I$mmЊ-sN 1Е-sN 1Х|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|"٣d$TȴдUUUUUUUUUUUUUPUUU@UUUU@UUU`00sg€ˀ$$jsˀ5, 5j= ՟j5ˀaj՟aUsI>j}s777j= ,a՟s[I>g€s[aˀa 5OOa7+|Usa[Us[0I>I>I>I>0 5+~~7}O 5++|0a՟ˀ[[[aˀۺۺˀj 5+++|g€j++|I>s$= 00I>jj= g€j7777|BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<BUUUUUUUUUUUUUUUUUUUUUUUU^s;{{@!B!B!D!B!B!B1c1c1c@)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ٣d$TȴдUUUUUUUUUUUTUUUUUUUUUU@UUUUU`j[$$00 5++|$[g€[0I>sg€= g€Usja=bۺjaa[0[,,,g€sg€I>= = g€0[Us$= 77|jUsg€= 0$0j0= UsI>s5$ۺ՟[j 5j0= saas,g€[[UsUsI>j$ 5 5}sss|[ˀ[[Us= I>[5Y Y$55g€$ 57777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I%$I$I$ImmnI$I$I$mЊ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:٣d$TȴдUUUUUUUUUUUUUUUUU@UUUUUUUUUUAUb}j0ˀ,Us= = g€g€saˀ,s[s= j0j$Us,,a,sg€,ˀjۺ55j5Yj5g€0= sˀssasaˀ,Us 577$I>j= 0$+| 50[,Usa,jˀˀ,0= Usa՟jg€g€[[g€Us0[ۺ$ۺۺ,5s= 5++|0a՟aI>7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<(0$I$I$II$I$I$mmmےI$I$I$mmЊƹJBJƹJBJƹJBJƹJBJƹJBJƹ٣d$TȴдUUU@UUUUUUUUUUUUUUUUUUUUUUUUUU`j 5 5$ˁ$j[$$Us0j7$a5jjsI>ss՟Y  ۺ,g€,I>UsI>Usˀˀ55՟՟h$՟$$՟5a,,a55555ۺ5ۺ  I1- ˀs= 0g€a,ˀas,g€,ˀ,a= s0++~~}$+| 5 5$= I>= ˀ= $՟7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<<0$I$I$II$I$I$mmmےI$I$I$mmm`JBJƹJBJƹJBJƹJBJƹJBJƹJ٣d$TȴдUUUUUUPUUUUTUUUUUUUUUUUUUUUUU`555՟a,,aˀsˀۺj5,ˀ,0$$j+++|I>I>Us=b$5՟,Uss՟$jg€0jss 5ۺ5jg€[ˀ$$Yj5g€g€ˀj ՟sˀs[I>,$$$Isg€Usaˀۺۺj՟ˀaa,ssajۺY Y5ˀaˀUsUs7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<T0$I$I$II$I$I$mmmI$I$I-mЊBJƹJBJƹJBJƹJBJƹ+k" c*[2+k" c*[٣d$TȴдUUUUUUUUUUTUUUTUUU@UUUUUUU`I>[a5ۺۺ5՟ۺ555Y Y$j5ˀˀUsUs= [s,s[,,g€ssaaag€[j}aaۺˀsg€,= I>0g€[ag€jssa= ՟ۺ,I>ssaˀ[0j 57sa7$Us= 0j 5$= I>g€,ˀ՟=bۺg€s$= 07= ՟$=bg€0j$7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<h0 $I$I$RI$I$I$mmmI$I$I-mmЊ2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2*٣d$TȴдUUUUUUUUUUUUTPUUTQUUUPUQUU`$I>aۺI=bjˀg€$j+~|$,ˀag€ss$ۺ՟I1-Y 5ˀ[I>0I>Us= j[$$$jj0= [0+|I>}ss 5= j$ 5$I>[[$+~|jI>ˀ=  57aa77 5jj$0sg€jg€= 5 5$$ 5aas|I>g€ss$ 5+| 5= a՟՟jˀ7777BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_x!B!B!BB!B!B!c1c1c1!B!B!B)JPk" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" ٣d$TȴдPUUUUUUUUU@UUUUUUUUUUUUP@`aj}a7Usas= 0$I>= [,՟a,ˀUsj++}|0ˀas0= 5ˀۺ՟g€= I>0+}7jajۺۺg€I>I>Ussj՟1-1-1-ۺˀI>$0[,5ˀg€= $$0= $=bUI1-ۺg€aˀg€j 5 5+++| 5= $~7~7ssaaOaas7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$I&mmm$I$I$KmmЊc*ktd)lktd)lktd)lktd)lktd)lk٣d$TȴдUUUU@UUUTUUUU@UUUTUUUUUU`$ˀjsI>[Uss՟s= 5 57|$sjjjۺ$$$ Yۺj$+}}$aˀˀ,,,aۺۺ5,[$~7= sˀaaa,s,aˀjˀۺ0+~7777|a՟Yˀj=bI5[Us[Us+}sssjUs,,[sa577775BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<,0I$I$I$I$I$I&mmm$I$I$KmmmЋtd)lktd)lktd)lktd)lktd)lkt٣d$TȴдUU@UUUUTUUUUUUUUUUUUUUUUU@UUUU`՟$s[Us00j+~77aj,s= j= j0I>g€j՟ˀj,5 5 5+|j՟$jag€[,ۺ=bhI1-II=bYۺaˀˀ51-U=b=b՟ۺj$[tPHHY  ˀ5j$ Yۺ$՟ۺۺjۺˀˀs[$ 5}|jUs$1-aˀ,saˀۺU-YU=b1-ۺ77775BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<D0I$I$I$I$I$I&mmnI$I$I$mЊd)lktd)lktd)lktd)|#)Ҷ!:|#)Ҷ!:٣d$TȴдUUUUUUUUUUUUPEUUUUUUUUUUUUUPU`a= s[[ahII՟g€Usjˀg€0I>jۺۺ$,ۺjۺ՟5ˀ՟5,[I>I>$$j}ss7 5j++|+| 5I>,55aaUs000,= $Us  ՟Yjjۺjjjˀ,,a55ˀs[[sjj՟I>[Oa0Us,77775BUFRb f  2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<X0I$I$I%$I$I$MmmrI$I$I$mmЊ|#)Ҷ!:|#)Ҷ!:5τe:VD2BT5τe:VD2BT5τe:VD2BT5τd٣d$TȴдUUUTUUUUUUUUUUUUUUUT@UU@UUU`sg€g€g€g€g€jY$Y$5,0++++| 5s5$՟՟՟$ $tP$$Y$UsI>I>asg€j$$Y$$՟[s[Us 5jj0Us$Usg€I>I>$j5$$ˀ= $$j+~7~77s+++| 5jˀ,՟a՟ˀ[+~~~7 50՟  $ۺ$ja,77775BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUU]kZ{{{9s9s9s{{{B!B!B! :VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD٣d$TȴдUTUUUUEUUUUUUUUUUUUUUPUUUUU`,g€[UsjUs 577 50g€ssg€UsUsg€s,asg€ssUsj+| 5+| 5 5I>Uss,,s[a5saaˀag€$0= j= Us0[j5,g€,UssUss,UsUsI>0 57s7 50Usg€UsI>sg€՟$$ۺ՟g€ˀag€$~~77$= = Usg€,5ˀY$Y5j՟[I>7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@< 0I$I$I)$I$I$MmmےI$I$I$mЊ2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5JBJƹJBJ٣d$TȴдUUUU@UUUU@UUUU@UUUUUUUUUUTU`I>j 5Us,[UsUsg€asUsg€Us0j+~~77sas 5= g€ˀˀsaˀˀ՟$ag€[= j}70[g€[g€sg€aˀsg€,aUs$ 5+~~77I>a՟j՟՟՟5՟Yۺ՟՟aa,= jj$g€՟Y՟jj՟5j[0 5 5s|I>= UsUsI>= 7777 BUFRb f  2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@< 0$I$I$II$I$I$mmmےI$I$I$mmЊƹJBJƹJBJƹJBJƹJBJƹJBJƹ٣d$TȴдUUUPUUUUUUUUUUUUUUUTUUU`g€g€,՟$ۺ$5,jj~777= asg€I>[[aaˀ,s,[ 5+~|aaa7I>,,a,= Us$0 5Us0s[$7asjI>ˀ5 ˀ$$=bYjˀa,= ~7s7[$j՟՟5,ˀag€= 00j7ssaaaj,j$ˀ,ۺ,g€,I>I>0= 7777 BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<40$I$I$II$I$I$mmmےI$I$I$mmm`JBJƹJBJƹJBJƹJBJƹJBJƹJ٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUUP`,I>$>bbb+k 55$YYˀυ55OO,,,I>g€ 5j$s5Y1-=bYۺۺYYυۺˀjυۺۺ$=b 1-=bIIOI$ $$$Yۺυj55υۺ5tP1-a,a,ˀˀj5555υ$$υۺۺۺjjˀ5,,$}~}|7777 BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<L0 $I$I$RI$I$I$mmmI$I$I-mЊB[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUPb|0ajˀˀˀ5ˀaaas[5ˀ[j$g€[[[s,j՟j՟՟jj5ˀ,g€I>I>sg€g€[g€,s,,as,,,5jˀ5j՟555՟ۺۺۺۺj5ssI>0j 5j[,[[UsUsg€[g€sg€sg€I>g€՟ۺ[+~7ss7$[7777 BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<`0 $I$I$RI$I$I$mmmI$I$I-mmЊ2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2*٣d$TȴдUA@UUUUUUUUUUUUUUUUUUUUU`I>0$$+|}sOOaOasssasa77}a|$ 5 5 5Us[Us$g€j՟g€$$sUsI>sj$$Y$UU=b1-[[I1-sI>g€UsI>I>,5[[,՟tP$$[$=b  $ۺ5՟ۺ՟5՟ 1-1-1-1-$1-$7777 BUFRfb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUTD^s{{{{{x!B!B!BB!B!B!c0k" c*[2+k" c*[2+kC!Lt%Kc\FSmpC!Lt%lktd)lktd)٣d$TȴдUUUUUUUUUUUUUUUUPUUUUUPEa1- $jjjjjۺ՟YY$=bh[[[恀I$ 5ˀg€g€[= $$= I>0+~~}sssas~7~77= $I>sˀasaUs= 0= 5+~}s}s7= aI>I>Us,a$Ԁ5as7I>ajYԀԀj5՟Ԁˀs= I>a= = g€= j++|+|0j7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0I$I$I$I$I$I&mmm$I$I$KmmЊlktd)lktd)lktd)lktd)lktd)lk٣d$TȴдUUUUUUUUUUUUUUUUUUUUUEUUUUUUUUUaYtP=b1-1-$jY=btPn6bn6Ia= 0= jj՟ԁ =b=b =b$$$YԀԀԁYYY$ˀjj55a,,ˁY$Ԁ5,,I>a= 5+|0sssa0j$j$j5assas0+|0g€ԁY=b 1-5ˀs5 Y$1-1-$Y=b=bY$YYtP$}}bZ7777$BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@$0I$I$I$I$I$I&mmm$I$I$KmmmЋtd)lktd)lktd)lktd)lktd)lkt٣d$TȴдUUUUUUUPTU@UUUUUUUUUUUUUaY=b$$$Ԁ5g€sj= sUssasaI>= g€g€sˀag€I>j~7}Oa|js= j+++~|j$j 5}sass+|0g€aj 50Usjˀa0 5| 5+}+|ˀԀ$5Ԁ,g€g€ˀ՟$sI>g€j| 5 5jaԀԀas0= g€,55՟Ԁsa$7777$BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@<0I$I$I%$I$I$ImmnI$I$I$mЊ 1Е-sN 1Е1|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUb+k>tP>tPI>Uss[I>Us= sˀj5j$ۺۺۺjjj55 1-$$ Y Y$ Y$Yۺ՟jj5j՟ hÁtP$1-1-hU$I1-=b$  Y$UUhtPUtP- =hUI =bbhI $1-UhI=b$=b1- $Yۺj՟ۺ$7777$BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@P0I$I$I%$I$I$ImmnI$I$I$mmЊ|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|"٣d$TȴдUUUUUUUUUUUUUUUUUUUUUPUUUUUUUU`$՟՟՟ۺۺ$1-=b$՟՟ۺ$՟ۺ՟ۺ՟jjs[[sasaˀ,,[I>$jj$[[sˀ5ۺ $1-jjsˀ,,g€0Us= 5= ˀ$Yg€I>Us[g€ˀˀ[0I>g€I>jb}tP>>+k 5s5j,,UsUsaY $ˀˀ5sI>$~}|$ˁ=b=b$sa5ˁ7777$BUFRb f2  +,-ZZ!bLEICESTER CENTRE 1% t#StЌ @@<@d0I$I$I%$I$I$ImmnI$I$I$mmm`)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:τe:VD2BT5τe:VD٣d$Tȴд@ ^1~OOj0P P,@ Gυ1-&\ LI>ˁ$IĴ '$9^= 0aP q&%Re[$$ 5@AIun 4p-pUsˁ=bd 3@GUn#`s bZĴdp @@mˀzPP h @@ ?x XOX(AJIc 4\'@F0Gb%|(~!= d@jI.KT @@sυ > p)2X@ˀ7777$BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<BUUUUUUUUUUUUUUUUUUUUUUUUUU_{{{B!B!B!!B!B!B1c1c1c!B!@2BT5τe:VD2BƹJBJƹJBJƹJBJƹJBJ٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUU@UUUUUUU`՟՟jԁYY՟ˀ՟ԁ Y$Y 5Ԁj՟5assԀj՟j$Y ˀaI>Us= jUs5՟jj՟$՟5Y$1-=b$$=bn61-ˀaaUs= I>I>I>sa,I>000 5$as,I>I>jaa,UsI> 5+}7j0= I>= I>g€ag€՟ԁUa,g€I>I>sˁ U $$77775BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0$I$I$II$I$I$mmmےI$I$I$mmЊƹJBJƹJBJƹJBJƹJBJƹJBJƹ٣d$TȴдUUTUUUUUUUUTUUUUUUUUUUUUUUU aYۺˀj$$ jυjZZ~6- h-0,,sOX0[I>55sg€I>OXOX 5h s h 5j0g€OX[=bUU[ ۺυ$$--hg€ag€[g€aυYYY$$Yυ5ˀg€g€g€aυU$$hIυsj$h=b$$Yۺ $υˀs,0I>= 0j$0I>OXI>I>7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<(0$I$I$II$I$I$mmmےI$I$I-mmv`JBJƹJBJƹJBJƹJBJ2+k" c*[2+k" ٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUU`UsI>0 5saOOs7+|++|++~~7+}+}ass+|= Ԁ$՟  Yj՟$U=b1- YԀ՟ԁb$bbtP$ }-}$Yԁ%Q%Qa՟$=bn6UIIb1-IUbb $=b$%QIV%UUn6ItP-YIUI1-$$7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0 $I$I$RI$I$I$mmrI$I$mmm`c*[2+k" c*[2+k" c*[2+k" c/e:VD6JBJƹJ٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUP `$ υυ$5ۺ=bU1-Y$Yۺ5υjۺ$jYYjjaυ H $h 5ˀˀj$YY$$=b$=b=b ˀj$υj5ˀjۺj$$$ YY$s,aۺ1-1-$Y$[ 5 5ZZ~6g€ˀυaυ,I>g€g€jj= I>I>j 5H~67777BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUZֵkZֵkZֵkZֵkZֵkZֽ{{{1c1c1cs9s!B!BBJƹJBJƹJBJƹJBJƹJBJFSmpC!Lt%Kc\٣d$TȴдUUU@UUUUTUUUEPQUUUUUUUUUUUas0ˁ ԀaUs,ag€s= as= 0~777sjaY՟,sg€UsI>aajjˀ 5jsjUsaa0 50$ˀs js7 50= j++~~7+~~|j 5+|= = 5՟b=b5I>00= 5YY5aasaj$ $=b$a= 5$I>5ˀsI>$77775BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$I$mmm$I$I$ImmmЊFSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSl٣d$TȴдUUUUTUTUTUUUUUUUUUUUUUUEUUUU`j$I>aԀ5ˀsUsa0g€,՟Ԁ՟a++| 5+|I>j0aaa= $+| 5j0I>as|0U1-$5ˀ$1-1-,,jˀԁ$$jԀ55ˀ,I>= I>,,sssaaUsaa՟ԀaI>I>= Usj+|$aaj5ˀaa,5$$ g€= 7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$I$mmm$I$I$Immmݶ`pC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc]td)٣d$TȴдUUUUUUUUUUUTUUUUEUUUUPUUUUUU`= a= 57~|0՟555՟ԁYYY $5g€= j0ja5g€Usg€I>,5j$UUIY,I>0+~~7|aaaI>aI>= Us 5 5I>,$, 5j$g€j0ssssaUsa$ԀԀ$gƒ+}s7,a$I>aj5՟1- ՟$aa 5j 5j= 5՟7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<40I$I$I$I$I$I&mmm$I$I$KmmЊlktd)lktd)lktd)lktd)lktd)lk٣d$TȴдUUUUUUUUUUUUUUUUUUUUT@QUUT`YY5Usg€,I>sˀԀaa$a,= = Us,ˀ՟ԀԀ,UsUssg€g€g€n6n6IU=b$$՟$ԁYIIY՟՟1- =b=bˁ,= a$$I>= I>,ag€aUs= = = $|7sss7|$+|$j+|$$$I>$0I>+||++|jj$j+|7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<H0I$I$I$I$I$I&mmm$I$I$KmmmЋtd)lktd)lktd)lktd)lktd)lkt٣d$TȴдUUUTUUTUUUPUUUUUUUUUUUUUUUU` 5g€= ++|$jI>Usˀg€jYUs~|$$$= =b$= I>= 5j++| 5I>,,Us= = jj 5jjUsUss0 5+~777| 5a,aI>= = 0aˀ,a,a,a,,ssˀ$U$1-=b1- j՟ԀԁY5Usj$՟Ԁ5jԁY$ 5$I1-7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<`0I$I$I$I$I$I&mmm$I$I$mЊd)lktd)lktd)lktd)lktd)|#)Ҷ!:٣d$TȴдUUUUUUTQUTUUUUTUUUUUPUUUUUUUaY$՟= g€g€0= Usg€Us,g€,ˀg€I>0= 0$ 5}7~|++| 5j+|j0$jI>0$ 57+~~7|g€Ԁ5saUsjUsa= = Usg€= j~7+|$aaasa,j՟Ԁ՟ˀˀ,saUs 5+|ajԁ$Y5ԀԁIn6I1- $$ԀԁYn6Á1-7777BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUU^s9s;{{}{{{!B!B!D!B!B |#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|"٣d$TȴдUUUUEUUUUUUUUUUUUUUAUUUUUUUUU`՟jˀ5aUs0 5j+|$Usjˀ,Us0sg€s,jI=b=b$5a$+~7| 5g€sg€= 0$$$I>I>I>g€ˀ,as0 5I>I>$$UsasI>|j$= jI>I> 5$,Usj~|UsI>Us= aaˀˀs5՟$ Ԁj5$0j|UsˁY$,,aa,$77775BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@< 0I$I$I%$I$I$ImmnI$I$I$mmm`)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ٣d$TȴдU@UUUUUUUUUQUUUU@UUUTEQQET`Ԁ5Us$a|$aa,Us$0jI>0I>aaI>0j 5UsI>$as$Y$Ԁ՟ˀ՟= I>= +|0++}= +~+|05ˀj՟ˀ՟ˀ5$ssj$0~++~7|ag€g€aUsUsˀg€= ssI>g€$|j+| 5j$+|$0 5| 50+|7j+|g€= j7~~~|7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<$0I$I$I)$I$I$MmmrI$I$I$mЊ!:|#)Ҷ!:τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT٣d$TȴдUUUU@UUUUEUUUUUUUUUUT@TUUb|j$ˀ՟Yj,g€՟,g€g€a= Usa$j77+}ss70sˀa5,asg€aaas$$j+|I>j$aYYjˀsa$$YYYUb=bjjj0= ˀ՟Ԁˀj 5՟ԀaI>$ 5j7770= 777~7+|= I>Us՟Us~|= $I>a$aas,7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<80I$I$I)$I$I$MmmrI$I$I$mmЊ5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τd٣d$TȴдUUA@UUU@UUUUUUUU@UUUUUUUUUU`s,$g€I>jj++|++~77~}77| 5= aˀˀ$j$00= = 0j+~+++| 5 5jj0Usjaj,Us$jԀԀԀ $,I>= I>= $j$ 50= jI>7+| 5= j՟sassg€sˀ,g€55ˀaaaa= I>aԀ5,g€Usg€ag€s՟ˀ,7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<L0$I$I$II$I$I$mmmےI$I$I$mmn`:ZBJƹJBJƹJBJƹJBJƹJBR>[\٣d$TȴдUUUUUUUUUQUUUTAUUUUUUUUUUUUU`5= I>0g€I> 5I>g€՟j,g€ˀas,g€UsUsˀˀsg€sˀaUsˀ$ja= +|0g€aI>,aˀa 5saUsI>aUs+++| 5|7 5~|jj0jj+++~~7 5| 50ˀ$jˀg€g€,a$ˀ,g€aaaa$I>aˀa,Usg€,՟ԀԁI$՟ˀ= sj 5$7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<d0$I$I$JI$I$I$mmmܒI$I$I%mЊS R>[\S R>[\S R>[\S R>[\S R>[\S R٣d$TȴдUUUUUUUUUUUUUUUUU@PUUU@UUUUU`,՟j$a,g€ˀ՟jY՟aa,I>UssԁY$Y,ss,aˀ,՟tP$$n6b1-Y5jԁ1- $1-ԀjˀjUUIYaI>++~|j 5 5++|0j 50Us՟YaUsj~777= = +~7}}7| 5j0jg€,,aˀԁ=b jˀsaa7777BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUUUUUUUUUU^{B!B!B"!B!B!C1c1c1d!B!B!@>[\S R>[\S R>[\S R>[\S R>[\S R>٣d$TȴдUUUPUTPUUUUUUUUUUUUUUUUUUUUUE`,I>sˀˀ,aԁ 5ˀg€I>7| 5= sUs0j 5}7| 5+~~++}7 5Usg€0g€0 5 5j,$ Y$a$b5aˀˀ  $$n6$ ՟5՟jˀj՟՟ˁ$$  $Usg€Usˀg€I>,= Yag€aUs,aa5ja0I>I>= aI>0$+|$77775BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0$I$I$JI$I$I$mmmI$I$I-mmv`[\S R>[\S R>[\S [2+k" c*[2+k" c*[2+k" ٣d$TȴдUP@PUUUUUU@UQUU@UUUUUU`I>I>0$$~~~~}77|jj+~~~7~| 5}77+| 5I>I>Us$a= jˀsԁ=b55ˀaԁ1-$aUs= ,0 5~~~77+| 5Us,aI>g€I>+| 5$jsa= 0= 0j++~+|= j՟asaI>= = $UsUsUssUs= Us0$0s7777aBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@,0 $I$I$RI$I$I$mmmI$I$I-mЊc*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[٣d$TȴдUUUUUUU@UQTUUUUUUU@UUUUUUU`ˀs,,a$ 5 5= = UsUsaj5՟aa= I>$= I>g€g€07~~7|j= g€= $+|$ 5j 5+++~7+~~7}77jsˀI>Us00jj 5$sj ԀԀ$YԀsaaˀaUsI>j 5~~+~| 5Us՟j՟jjˀ,Usg€aI>j$0j+++~|05՟ss7777aBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@@0 $I$I$RI$I$I$mmmI$I$I-mmЊ2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2*٣d$TȴдUUPUUU@UUUUUUUUUUUUTPUUUPU`,՟sI>ˁ$ $$s++}saY ՟Ԁˀsj5Ԁ= +~~+}7sjg€sa$0I>00= Usg€I>Usg€Us$j$I>$ 5I>g€,g€g€g€aUssaI>$$s $sI>s= $ 50aUsa= +~+|$+|$j++|$$$5a 5 5+| 5g€՟5 $a+~77+~70saUs7777aBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@T0 $I$I$I$I$I$mmm$I$I$Immm۶`k" c+c\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!L٣d$TȴдUUTQUUTUTPQP@UUUUUUUUU` 50jsj5Us+~~7+~~|+|j$+|= $$= 0= 5ˀUs~7+~~~+|Usj= 0jj++|$I>s,a~~~7+| 5+| 5~7saO$~77~+|0 5j$= = = ՟1-$ =bjˀasˀ,$Us 5j= $0 5a5Ԁˀˀg€I>$+~| 57777aBUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<BUUU]kZֵkZֵo{{{9s9s9w{{{{{t%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\٣d$TȴдUUUQ@@QUUUUUQUUUUUTUU`0$ 5 5jjj 5 5jjj+|j}7a77777+|= jj77|$j++++|+|j= +|0,a 50 5j$g€,$$I>= jj 5$= +| 5|j++|j+|jja,g€Us0= = = $I>$Usj 5 5$Us0 5$j+~~+|jI>= $= $= 0j77775BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$I$mmm$I$I$KmmmЊFSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc_td)lkt٣d$TȴдUDUUUUUTUUUUUUUUUUUUUUUUP`I>I>$ 5j+|}7sa 50$ 5j0 50j$Usg€0jI>a0j 50= ++}ss~77|j 5+~}7$g€sUsUsI>= = 00$I>I>j$I>Us$jj՟jˀˀasI>0$= a,ԁUI $a50UssaUsg€a0I>0$ 50aaI>j= 07777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$I&mmm$I$I$KmЊd)lktd)lktd)lktd)lktd)lktd)٣d$TȴдUTUUUUUUUUUUUUUQTUTUUUUUUUa7 5a$j$ 5+|= = $$0j 5$Us0s5+|$ 5$I>I>UsUs= 0= UsUs$= = I>j$0g€՟Ԁ5ˀ,,a,sa$ 5= ajs0$$a= 0+|= j$ 57}7+|77777~| 5$a$0Us0+|= g€,aUsag€aUsaaUsUsUsg€UsUs0j$j 5aj57777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<00I$I$I$I$I$I&mmm$I$I$KmmЊlktd)lktd)lktd)lktd)lktd)lk٣d$TȴдUUUTUUUUUTUUUUUPUUUUT@QUUPQ`,g€sUsa,ag€$= 0g€$++|j$= g€jԀjag€$aԀԁ ,ag€asaja 5+|$a,g€aI>I>I>= sUsˀI>0I>j 5 5$+~+|ˀg€Us= 0UsUsI>I>$ԀˀjԀˀ0 5~+|j0$++|j07Usa= j 50I>$ 5j+~77777| 5 50+|7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<D0I$I$I$I$I$I&mmm$I$I$Kmmm`td)lktd)lktd)lktd)lktd)5τe:VD٣d$TȴдUUUUUUUUUUUUUTUUUUTUUUUUUU@@`$j+|0= 0I>= = = s5I>g€a= aaj5ˀaj5ˀaˀaUss,ˀ,s,sԀg€ 5$+|= Ԁ,ag€,= = UsI>$$aUsUsg€= ,Us+| 5Usg€sag€aUsI>= I>I>a= 5 5= UsI>= = = $a0g€Usg€= ++~++~~~7+| 5jI>7}7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<\0I$I$I)$I$I$mmmܒI$I$I%mЊ2BT5τe:VD2BT5τe:VD2B>[\S R>[\S R>[\S R٣d$TȴдUU@UUUUUTUUUUUEUEUUass}asas77++~| 5+++++~~|$= I>j 5~~7+|ˁ=b $՟a,jYI>Usg€ 5= ~~|7~77++~+| 5 50I>jj~++| 5j 5j0$$$}|$5 ,j 5 5 5+| 5 5$ 5$ 5+|0$= UsUsj= $7777BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUU]{|9s9s9s{{{B!B!B"!B!B >[\S R>[\S R>[\S R>[\S R>[\S R>٣d$TȴдUUTUUUUTP@UUUUUUUUUP`0$ 5+~+|= 5ajj0j+|$= UsI>0= UsI>$$I>Us,ag€aaaUs+|+~~7++~7+|j7~~}77~| 5$|j7+}|$}77+| 5$= Usj$= g€g€g€ˀs= aUsI>I>I>g€I>,$= I>$ 5 5 5 5j0I>asUsI> 5++~7~77777775BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@< 0$I$I$JI$I$I$mmmܒI$I$I%mmn`[\S R>[\S R>[\S R>[\S R>[\S R>[\٣d$TȴдUPUUUUP@UUUUUUUUUPQEP@c+++~+|jI>Usa= I>Us$ 5+~|+++| 5 5 5= UsI> 5= 5= g€sa,,a|+|+| 5j$j+| 5~~+| 5$aa,,I>0jj7$5,0= 0$I> 5$00UsUssas՟ ՟$tP=b5$j՟g€$$ 5}7+~++|0+| 5 5+|0j 5j7 5+~+|7777jBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<$0$I$I$JI$I$I$mmmܒI$I$I%mЊS R>[\S R>[\S R>[\S R>[\S R>[\S R٣d$TȴдUUUUTAUUUTUUEQTEUUUUUUUU` 50I>= $I>asUsas,sg€,,$j 5 57+|$= g€Usj0I>sUsI>00777|jg€7sa+| 5 50 5$+}+~777}+| 5= I> 5+|+||j= 5+|j= = +|+|jI>= I>aj5aas,s= I>= aˀˀ՟aUs,0j0I>a$ 50$= 07777jBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<80$I$I$JI$I$I$mmmI$I$I-mmЊ>[\S R>[\S R>[\S S2+k" c*[2+k" c*[2*٣d$TȴдUUU@UQUEPEUUPUUUDUUUU`I>= 0j~| 5I>= $$I>= j 5as77+| 50UsI>j 5I>j+|I>s,g€$+|g€0s$+++~~+~77| 5+|j= $ 5 57+| 5 50g€= j~~7s}| 5g€5sg€Us= aasa,g€+| 5~~7|++|aa,g€aUssag€0I>g€7777jBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<L0 $I$I$RI$I$I$mmmI$I$I-mmv`k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" ٣d$TȴдUUUUUU@UUUUPUUUUUUUUUUUUPU`ˀˀa,,sag€sg€I>Usag€I>ag€g€ˀaas$+~7~~770$$I> 5 50 50Us= UsaasI>+~7}a+|$7+~|$$Us,a,saag€ss= I>0j 5= = a0jˀI>I>$0$,ˀsg€as= 00$$$I>I>g€a,ˀUs~| 5g€ag€7777jBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<d0 $I$I$RI$I$I$mmmI$I$I-mЊc*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[٣d$TȴдQPUUUUUUUUUUUUUUUUUUUTPPUUc+|j$jI>= |$0+| 5j$$+~~7+|j= ,՟ԀI>$ 5$I>I>sg€I>,$tPI1-Iˀas5jjԀjaa0I>$5aj5ˀˀg€UsI>I>0= 0= 0I>$$s$՟ˀa= = s՟I>+|0+~+~~~| 5+~~+~~7++|$0a,,0I>a0I>7777jBUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUUUU^{{{!B!B!BB!B!B! c1c1c02+k" cKc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSl٣d$TȴдUUQUUU@UUUPUUUUUUUUUUUUUUUU`Us= I>= |$= $$= Usg€$+|I>0$= = = = = = $aI>0~7~7~|Usaa= = I>= = jjI>՟ag€,I>+~~}++}+| 5$,a$UsUs= ,0I>I>UsI>0I>a,= = j= 55a5sˀsI>asa՟Ԁ,I>$I>g€aag€Usg€a$$I>sj$I>g€= a,Us,j577775BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$I$mmm$I$I$Immm۶`pC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!L٣d$TȴдUTUUUUUUUUU@QUUUUUUUUUUU`g€I> 577~7~7~7|I>ˀ5 5,jag€0$0j= aa= 0 5 5+|$aUs+~7~~~7+~+|jjI>I>Usg€= $= = $s$asUs0777|$ 5+| 5$g€I>$aUsg€,0Usa0UsI>I>I>I>g€,I>0,g€a,՟ Us5UsI>= $$ 5$= Us7777€BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<(0I$I$I$I$I$I$mmm$I$I$KmmЊt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%lktd)lk٣d$TȴдUUUUUUUUUQUUUUUUUPUUUUQUUU`UsI>= 0UsUsa= j$0= $$jUsg€5aa= I>UsI>UsUs= = = = $jj= Us= +|+}as+|jj 5 5 5 5 50$|j 5 5}s7+|jj,I>$ 5 5$$ 5Usa= aa,g€aUs+}7 50= g€aa= $= g€aUssgjI>sUs= I>+|Us՟ˀԀ՟ˀ,g€,Us7777€BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<<0I$I$I$I$I$mmmےI$I$I$mmm`td)lktd)JBJƹJBJƹJBJƹJ٣d$TȴдUUUUUUUUUUUUUUU@UUTUUUU`ag€g€Usa,saUs= ,g€ag€g€= s$ 5= I>s= = Usg€5aaUs0j= aag€g€0= I>a՟$1-5sj$$= 0Usj~~~| 5$I>I>a,s++|$$+}77+~777+|j+~+~7s5Ԁjj|+++|a,g€0jj+| 5j0I>jgY $Ԁja$7777€BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<T0$I$I$II$I$I$mmmےI$I$I$mЊBJƹJBJƹJBJƹJBJƹJBJƹJBJ٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUTUUUU`$ˀˀs0= I>Us,ˀˀԁ a5jUsj0 5 5g€ˀ5aUsa= UsUs,sa, =b1-g€aa55$YI>jˀ5Ԁ՟I>g=bja$aaUsI>Usˀ5՟$՟a5,asg€ˀ,5ԀYja,s՟Us 5+|= Uss 5 5j,,sg€ssUs0$++~| 5~| 577777€BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<h0$I$I$II$I$I$mmmےI$I$I$mmЊƹJBJƹJBJƹJBJƹJBJƹJBJ>٣d$TȴдUUTTUUUUUUUUUUEUUUUUUUUUUUUUb7++|j0g€I>I>I>000$j 5+|~7++~~}+~7|0,ˀsg€I>a,aag€g€a՟՟՟aˀg€ˁYaUtPja,Y Ub,$j0+|UsjUs5=bb$= 0= I>I>I>Usˀ՟1-   $=b1-tPn6=b $0j= jj 5= g€asaaaa,$j7777€BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_{!B!B!BB!B!B!c1c1c1!B!B!B)JP[\ c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" ٣d$TȴдUUUUUEU@UUUEUUUUQAUUUUUUUUUUE`ag€g€aI>jj= a0= UsUsUs0j0= $a+|j$,jj}+~7s7|j 50a$,ԀjsajI> 5+| 5= s,sUs$$Usg€ag€ag€s= a= 5 5| 57|= sI>I>g€I>0j$Us= g€jsUs0Us$Us,ˀ5jjaI>g€,5ag€Usssj+| 5~7+|Us77775BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0 $I$I$RI$I$I$mmmI$I$I-mЊc*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[٣d$TȴдUUUUQUUU@EDQT@UAAUUUUTUU`a,= = 0= s= UsI>= g€sg€g€I>I>+|+|+| 5,aUsaI>$$= Us0jj 5}sas7s+|| 5 5|j|+| 5 5 5++| 57s7}77~77+|0ag€Usj~|0 5++|,aj,,0I>0$= Usaˀ,= 0= Us 5+~~|0ag€UsUsI>= = 7777aBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@,0 $I$I$I$I$I$mmm$I$I$ImmmЊ2+k" c+c\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSl٣d$TȴдUUUUUUUUDUUTUUUU@U`a,,,g€aaa0aˀsg€,ˀI>0UsUsssg€Us$g€ˀ՟0+|+|0ag€Usaj+|jj~7$g€I>aj~|$07|g€,5Us= = Us= 0$$$= 0UsUs 5+}77s+~77+}+~|007~| 5}+}777~++~7| 500= 7777aBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@@0I$I$I$I$I$I$mmm$I$I$Immm۶`pC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!L٣d$TȴдUUUUTUUUTUUUTQUUUUUUUUUUUUU`I>UsUs7+| 5a,,UssUsg€aasas0Us$$+~}+| 50,sg€aag€g€aˀˀsUs$++}s~}s+|$asg€saˀj,Us= jj+|j+| 50aˀ,,s,a՟ԀaԀ$$Ԁa0 5 5sjj55ˀˀa՟՟$=b1-1-YԀaˀaI>I>g€Us7777aBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@X0I$I$I$I$I$I$mmm$I$I$KmmЊt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kctd)lk٣d$TȴдUUUUUTPQTUUUUUUUUUUUUUUUUUUUU`5՟j,g€I>aa՟Ԁ$U5j,,g€Us0|j++|j 5+|+|= j00$+++| 5}I>Ԁ$ˀsa= jjԀ ˀ,g€g€0g€jg€51-U՟Us5ԁ 1-n6n6II $j,jUs0aYsI>= sˀjˀI$ Ԁjs,ssUsag€a7777aBUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<BUUUUUUUUUUUU]kZֵ{{{s9s9s9{{{!B!B!Btd)lktd)lktd)lktd)lktd)lkt٣d$TȴдUUUUUUUUPUUUUTUUUUUUUUU`j՟55,,= jI>jjjag€a$jI>ˀg€= j5jˀs,g€ 5~~7+~7 5Usas= $= tPII$Ԁj,I>aa777~+|+~~777s 5+|a5,0aasaI>= a= = = 0= +||j= Y$$$g€g€aa,s,jaˀUs77775BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@< 0I$I$I$I$I$I&mmm$I$I$KmЊd)lktd)lktd)lktd)lktd)lktd)٣d$TȴдUUUUQUUUUUTUUUTUUUQ@b|j 5+| 5s5,= = = Usssg€a ՟g€5g€j|$I>sag€g€UsaUsj$g€sUs$jj 5 5++|jUsa,,as,aˀUssUsa 5j= $++| 5+}|$I>aj$= 0j$0= UsUs$j$|j7$7s7+}~++~~+| 5+~7+}7sas~|= ˀ7777jBUFRb f  2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@< 0I$I$I$I$I$I6mmm$I$I$[mmЊlktd)-sN 1Е-sN 1Е-sN 1Е-sN 1Е-s٣d$TȴдUUUUUUUUUUUUUTUUUUTUUUUUUUUUU`5ˀg€I>= ag€Ԁ$$jass= +|~+|= jI> 5jjjI>,a՟jjԀUsaa$0 5 5$Usjˀa,aaajˀasI>$ 57+~7+|$,՟5g€= $= 0a,ssg€j 5|I>jI>$55՟ԁY=b1-$   Y՟jˀsaa,ԁ jˀaaI>s7777jBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<40I$I$I$I$I$I6mmm$I$I$[mmmN 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1Е-sN٣d$TȴдUUUUUUUTPUUUUUUUUUUUUUUUUUUUUUUUaYjԀˀg€ˀa= $= I>aasg€,aˀa,s= 0$$j= s+| 5s,asaaaYs= ,$$ˀUsI>I>$a՟Y՟YԀjsaaaag€Usg€I>g€ag€saUsg€aˀ5,g€I>a= = = ag€= I>,5js000I>a5$I՟j5ԁ=bn61-55aag€7777jBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<L0I$I$I$I$I$I6mmm$I$I$[mЊ 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1٣d$TȴдUUUUUUUUUUUUUUUUUT@UUUUUQUUUUUP`aag€aa՟$՟a,,I>I>0aˀsg€g€aaag€ˀssˀssUsUs5,5 ՟ˀ5aja= 0j$I>ag€ˀˀ,sg€ag€g€UsI>Us$$= +|0}+|= a5jԀԀԀ՟՟՟ ՟5ˀaa0 5+|sj՟Us,g€ˀˀˀUss5$jԀ5,,0$ 5}+|Us՟57777jBUFRb f  2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<`0I$I$I)$I$I$mmmܒI$I$I%mmЊ-|#)Ҷ!:5τe:VD2JƹJBJƹ[\S R>[\S R>٣d$TȴдUUUUUUUUT@UUUUUUUUUUUUUUUUUUUUU`g€g€ˁ$Y1- jUsI>aaI>$g€ˁY$$$ˀ5ˀˀ5a= $ 5+|+~~~7 5j1-Ԁsa,g€,ԁ ՟5ˀjaI>$j 5$Us55ˀ00= j0,$=b1-IYY՟Y՟sg€ˀˀ5,I>= Us= I>g€s$1-$$Y$$saI>= g€Ԁ$$՟ˀI>Us5aa7777jBUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUU^s{{{{{{B!B!B"!B!B!C0[\S R>[\S R>[\S R>[\S R>[\S R>[\٣d$TȴдTUUUUT@UUUUUUUUUUUUUUUUUUUUUUT`aUsj++|+~|05jjg€UsaI>I>aaasa= jj7 57s7jI>a0 5j= Us,5aa,sg€aa0Us0I>Y $jasg€I  Ԁ՟Ԁ$՟$j$ 1-$Ԁ$j$5ˀˀˀˀssˀ $Ԁ$$g€g€Us$ 5777775BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0$I$I$JI$I$I$mmmI$I$I-mЊS R>[\S R>[\S R2+k" c*[2+k" c*[2+k" c*[٣d$TȴдUUUUUUUU@UUUUAUUUUTUUUUEUUa7$}+}|0= = I>Us0jj$j,$$=b$$Yˀj$Y 5sg€I>= 5}7jI>aaI>I>Usasa՟jˀa,0j 5++|= ˀ$ sg€00aˀԁY5,5aj+~}s~7 5s,Ԁ՟ˀ,ˀ$$0$+| 5 57|jjUs5$ˀ7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<$@"""""""""""#333333333334DDDDDDffffffwwwwwwwwwwp2+k" c*[2+k" c*[2+k" c*[2+k" c*[>[\S R>٣d$TȴдUUUUUUUUUUUUUUUUUUUQTUUUUUUUUUU`$YIUb Y1-$=bY$$՟՟55jˁ YY$՟ˀsI>0j 5 5a= 0I>ag€ag€Usg€= Usas,Yaj$I>,5j55՟Y$, 5+|$ 5~|0= Usˀ5Ԁ551-$n6bb1-IUtPIUII$j5$Y՟jjjj$՟j7777 BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0$I$I$JI$I$I$mmmܒI$I$I-mmv`[\S R>[\S R>[\S R>[\S R2+k" c*[2+k" ٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUPUUUU@`55sag€,,j=b$jԀԀ5՟jaag€5ˀˀˀˀa,aaj5j՟՟j՟՟Y՟jaԀjI=b$YYUÁ1-  Ԁjˀs,s,j՟j5Ԁ՟ԀԀ՟Ԁˀa0 5 5+|g€g€aasg€,sjag€Us0$+}7~7}7777$BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<X0 $I$I$RI$I$I$mmmI$I$I-mЊc*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[٣d$TȴдUUUUUUUUUUUUUUUUUPUUUUUUUUUUUUUU` 5Ԁ՟5a,jg€,Y1-$՟ˀԀ5j՟a,ˀ=b$Y$1-Y$5ԀˀԀ5jˀˀjjg€5aaˀˀ5Ԁ55,0$}$ 5$$0g€0I>,jjˀg€Usa= ag€g€ss5$=bԀ$ԀbY$YԀ$jasˀj՟5ss7777$BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUU]kZֵk{{{9s9s9s{{{!B!!c02+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*+k" ٣d$TȴдUUUUUUUTUUUUUQUUUUTUUUUUUU@`Us5   Ys++|j,jԁ1- ՟՟$  Y՟jss0}sa70sˀaˀˀj $՟ˀ,,I>$+| 5$aԀԀˀjj,,a= I>j~7j$I>a= j= ,ˀˀj55$Yjˀ՟Y=bUs0j+}7|77775BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$I$mmm$I$I$ImmЊc*[SmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\٣d$TȴдUUUUPU@TUUUUUUUUUUUUUUUUUUUUUUa$ss0$j= s$=b=b 1-YjsUs 5+| 5$I>,a+}77|$j$0$| 5 5I>UsI>aˀ51-n6$$5 ՟Ԁ5՟Ԁԁ $YYˀ= g€,a,g€s,a՟j՟jj5ˀ,,aˀˀ՟55Ԁ$՟jj$5jjasg€$0ss= $00I>7777jBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<$0I$I$I$I$I$I$mmm$I$I$ImmmЊFSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSl٣d$TȴдUUUUUUUUUUUUUUUUUUUU@UUUUTUUUUU`aaaUsg€UsI>0I>= 5j$0I>sss,sasg€= Us= I>$j$00= Usg€sss,aa՟$Ԁ՟j՟1-1-b$$YY YYYj՟՟jj$I>I>00++~7+|$g€asaaa,,,g€,asI>I>$j7jjI>I>ˀԀj5I>= aa5՟5j՟՟j7777jBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<80I$I$I$I$I$I&mmm$I$I$Kmmm`pC!Lt%Kc\FSmpC)lktd)lktd)lktd)sN 1٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUQUU`5ˀa,aˀ55a55as= 0$j+| 5+| 500I> 5~+|= Usˀjˀ5ˀsˀaa5 I YԀ$Ԁ Y՟5,aI>$$$s,ˀԀjԀj $ԀjY$jsˀg€ˀ5,,,ˀԀ՟ˀaI>+|$jag€,5$7777jBUFRb f  2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<P0I$I$I$I$I$I6mmm$I$I$[mmЊ-sN 1Е-sN 1Е-sN 1Е-sN 1Е-sN!:|"٣d$TȴдUUUTPUUUUAUUUUUUUUUUA@UUPTa=b Y՟$՟Y=b$I>j+|$j7| 5= ,sg€asUsUssUsj ˀ,Us= j$++| 5$jUs,UsI>0= 0aasg€s,asˀag€aI>g€,ˀag€aj՟՟jsg€g€I>$+|j$+}}aԀԀ,0= j$ 5 5 5+}7a+|$Us5jUs~+| 5 57777jBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<d0I$I$I%$I$I$ImmnI$I$I$mmm`)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ٣d$TȴдUUQUUUUUUUUUUUUTUUUUP@UUUU`= g€I>= I>= jj 5||I>= 0j 50$= 0$= UsԁY$a$}7|j$g€ 5= g€g€$= Us,g€sˀaas 5$7Oas77~+|jj= g€,g€,ˁYY՟5,$+|Usg€0g€aˀj՟$$՟Ԁ0 5 5+~|ass+| 50jUsaaaY՟Ԁ5s5js7777jBUFR6b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUUUUUUTD_{{{B!B!B!!B!B!B1c1c1c!B!@!:|#)ҶD2BT5τe:VD2BT5ЌJBJƹJBJƹJBJ٣d$Tȴд@#`\I>$?x = G$28B@ 3@,$. 4 )2I>zυtĴ Xp/M`LK@P1-Ĵ Xw@@@zYt|(~w@3@zHd  0LK@,n6z|(p#`3@OXan6p,@ !0a=bd X #`j$00z &%F0. Lp)2@@s1d Lp/M`F05 5I>$zk. Xp,@ LK@,n6z28 q 5'@[7777IBUFRb f 2  +,-ZZ!bLEICESTER CENTRE 1% t#StЌ @@<@0$I$I$II$I$I$mmmےI$I$I$mmЊƹJBJƹJBJƹJBJƹJBJƹJBJƹ٣d$Tȴд@&%]I1 P)2F0s1-c  O 5~@@,Y.z28dp&%LK@n61d28w@ۺt-aˁ1-.&\ P@@X@ˁ1-1 q!C# >,@ Re1-.Ĵ?x q&%9g€ PI-s.?x PF0g€ c Lp,@ LK@ab> -X@ˁ1-bZc h ,@ LK@a1d p-F0ˀ77770BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@(0$I$I$II$I$I$mmmےI$I$I$mmn`JBJƹJBJƹJBJƹJBJƹJBJ>[\٣d$TȴдUUUUUUUUUUUUPTUUUQUUUUUUUUUUUU`Ԁ՟՟j55,ˀ,ˀ,ˀˀj5j$Y՟՟ԀaaUs= I>0,$՟a,ˀ,sag€= $0$+~7 5+~~77+|j= I>Usaag€ajˀa= = $ 5j+|j= g€YԀˀ5aˀ,g€I>sa0I>0j$aˀԁ1-$jˀ51-$IIUI1-Yg€aI>77775BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@@0$I$I$JI$I$I$mmmܒI$I$I%mЊS R>[\S R>[\S R>[\S R>[\S R>[\S R٣d$TȴдUUUUUTUUUUUUUUUUPTUUPUUU@U`s՟՟ԁYԀ$՟5jԁ Yˀˀajj~70a55ja՟ YYY=b1-$YԀ$$$5jԁ=bU$ $5s00I>I>g€= 07+|= ss$+++| 5jaԀˀ,= aUs= $++}++}|+| 5 5$g€Us= 0,aˀI> 5~7| 5= ssUsa77775BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@T0$I$I$JI$I$I$mmmܒI$I$I%mmЊ>[\S R>[\S R>[\S R>[\S R>[\S R>٣d$TȴдUUTUUUUUUUTPUUUUUUUUU@UUU`Usaˀˀ0sUs0 577+~7| 5g€$ aa,0$,aUY5Ԁ,a$+}|0s,sasI>sasaUs0I>0 5+|UsI>}+|$UsUs0Usˀ,5aaaˀˀ,YYԀjjj5g€ˀ,,sg€a07+}+~+}jI> 5= s,UsI>0= j077775BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<BUU\:ֵkZֵkZֵk[{{9s9s9w{{{{{{[\S R>[\!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%lktd)lktd)٣d$TȴдTUUUTUUEUUUUUUUUU@UUUUUA`0= j7}+|= ,g€ˀ՟a,ˀas= $+~77a7Usg€UsI>j 5$+|0= ~7+| 5+|++~7| 5a5՟jg€,ˀUs՟Y՟g€ 5+| 5g€aˀaa՟YY1- ՟ԀԀa,~}jaIn6$ˀ՟I>Usg€,,,aUs5Us0j 5+~| 577775BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$ImmܒI$I$I-mmЊlkt 1Е-sN 1Е-sN2BX>[\ c*[2+kC!Ltlkt٣d$TȴдUUUUUUUEUUU@UUUTUUUUPUUUU`= ,a= Us$Usaa,UsI>j0$$~7sas|$$0= 0I>Us= Usag€aI>+|+}7+|00Usa0Usԁ=bb$I>+~~7I>՟IYˀI>,ˀ55aaj0 5j770,Ԁ1-՟ˀsI>5՟$ ˀ= ++~7+~70Us0= Us$= Us,ˀ,aag€7777>BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$I6mmnI$I$I$mЊe1Е-sN 1Е-sN 1Е-sN!:|#)Ҷ2BT5τe:VB S٣d$TȴдUUUUUUUUUUUUPQUUPQUUPUUUU@U`Usˀˀaa=bU՟jԀsaj5,asg€aI>ag€j0Us,$b1-$՟aasUsa00= 5}ss+|$ 5+|$ 5 5j0I>0= 5 5+~}7 5j$ 5$+|a= = Us= aI>g€Us= 5}++|= s,aaaUsI>= g€aUsI>0$j+}|Us՟g€Us7777>BUFRb f 2  +,-ZZ!bLEICESTER CENTRE 1% t#StЌ @@<00 $I$I%$I$I$ImmrI$I$I$mmm`2+k" c.|#)Ҷ!:|#)Ҷ2BT5τe:VD2BT5τe:VBJƹJ٣d$Tȴд@ ]Y0!9$bZ$ F0528 ˨w@B@3@g€|$ 'B@0I>apC#azkd '#`dAz%Ĵ XReAUbZ28~&%iI JIo h &%OXhzW0 L )2Usc 0*ReAI?x XC#z128?x~w@,@ d@υt?x0!/M`F0= Y$a @ d@5t @ B@j7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<H0$I$I$II$I$I$mmmI$I$I-mЊBJƹJBJƹJS R>[\ c*[2+k" c*[2+kC!Lt%Kc\٣d$TȴдUUUUUUUUPQUUUUUUUQT`= Usˀˀj ˀaUsa0= a,sUsg€0aI>}s= ,5sUssag€ˀˀa$ 5~77}7jI>0= |jjj0a՟g€07+|0= 0= sUtPn61-ˁ$՟a,aj$+|77+|= 0$7$++|0$$$j 5+~}+|j+|$$j7777>BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<\0I$I$I$I$I$I$mmm$I$I$KmmmЊFSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kktd)lktd)lkt٣d$TȴдU@UUUUUUUUUUPUUT@UUUUPUUUU`j$0j7+~+|= ~|,aUsUsI>= 0Usg€aˀ$$1-Y1-a,՟saˁ1- Ԁg€,g€Us,assˀg€aaI>~~77+| 5 5$sg€jI>Us= j+|j}0g€= Us0Us= asag€ˀ5,ˀs,I>7+|I>s$Ia= = 0jI>sU=bU=b=b=b7777>BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$I&mmm$I$I$KmЊd)lktd)lktd)lktd)lktd)lkte1٣d$TȴдTUUUUUUUUUUUEUUUUUUUUUUUUUUUUPUa1- ՟|>|0g€՟ssUsI>= = sj[՟1-Yjj$$ j՟ۺۺ՟ˀasg€[0$aaj5ۺۺsI>= $j$}|0[$0j 5= jjj0,ˀ55ˀ՟ 5g€ssˀU1- ۺ[g€Us,$Y0,aۺˁI1-YY5aj՟ۺI>0= [0g€ˀa,jUsUs 5 5}~}|jI>g€ۺ7777>BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@""""""""""""333333333333DDDDDDDDDDDDUUUUUUWwwp-sNBT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BTB2*٣d$TȴдUUU@UUUUUUUUUTUU@UU@UEUUUUQU`aa= $= 0= aUs00 5}s7= I>g€0$0$= = aaԁtPtP$՟ˀˀ55ˀˀUsUs0= $= sg€a,g€I>+~7|$$0as,ˀa$ 57+|$$$I>= ՟jg€UsI>}77~7 5j 5$+|$ 5$Ussag€0= $$= a   aUs= +|$= I>= = 7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<40 $I$I$I$I$I&mmm$I$I$mmmm`k" c*c\FSmpC!Lt%Lktd)sN 1Е1|#)Ҷ!:5τe:VD2BT٣d$TȴдTQUUPUUUUUUUUUUUUUQDUUUUUUU`a0}s7|$j 5+|j 5$00$0$j 5j+~+| 50Usg€= g€ajjj՟$ $YY1-Ys$ˀaUsaԁY՟5ˁ I>,UsUs= 5$j= |0= g€g€a 5j0$Us,,j+|+++| 5= | 5|jaˀg€g€ajԁ b1- ˀˀUsUs0= ˀԁ $=b=bԀ7777>BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<L0$I$I$JI$I$I$mmm$I$I$KmmmƹJBJ>[\S S2+k" c*c\FSmpC!Lt%Lktd)sN٣d$TȴдUUUDUUUUUUUUUUQUUUTUQUUU`aaUsg€5b=btP՟j5a 5+|0+~|՟$1-$5jas՟$$n6$,Us= jj 5 5jˀjaUsjj0UssˀԀ$ԁbaj0|ja55aa5jYYˀa+}aa+}7~77~+|= 00jj 5+}77~+|j$j+|= I>0= = saj5=b$7777>BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<d0I$I$II$I$I$mmmےI$I$I$mЊ 1Е1|e:VD2BTƹJBJƹJBJƹJBJƹJBJ٣d$TȴдUUUUUUUUUUUUUUUUUUEUUUUUUUUUUUUU`I>g€I>aa1-I=b51-I$tPtP=bYg€Usg€UsI>= asYY5I>0= 50$I>UsUsa0Us55sԁY1-՟aI>I>j0I>aԀj$=b$ˀˀ,a0j+|UsY555ag€s,as՟U$Yaj1-=b YjjԀԀˀԀ5ˀa=b-%QbY$=b=bYUs7777>BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUUUU^{{{{B!B!BB!B!B! c1c1c0ƹJBJƹJS R>[\ c*[2+kC!Lt%Kc\FSmpd)lkt٣d$Tȴд@]b ?x LLK@  eHI>^ˀ|Ĵ~ 9I>|a$I P)2XAYzkV~  'O 5aa B@I>I>1d L 2ZsPI @= | |( PB@OI>υ> 5\*szaaI @Oa1-Ĵ?xOI>z >:= s 285g|$Rdp p $0U>~B@3@= 7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I%$I$I$MmmےI$I$ImmЊ 1Е-sN!:|#)Ҷ2BT5τe:VBJƹJS RFSmpd)lk٣d$Tȴд@UUUUPTPUUUUUUUUUUE`~7+|Usˀg€ag€a= I>= I>I>Us= g€Us$$+~~7777+|j++~7~7~~777 5j 5$|++~~77s7~7j 5j+|I>7I>$$=b 5$$7+~77| 5aaaa 5= g€as՟ $=bYaUsas,g€0Us0j$+}~~7= 5Ԁaa= j$+| 5$7777B@BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<(0I$I$I%$I$I$MmmےI$I$I%mmv`t 1Е-|#)Ҷ2BT5τe:VBJƹJS R>[\ c*[2+kC!L٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU`j 5 5I>g€UsI>$I>ԁ Y5I>g€0j$$$$a,ajˀj=b=bItPYU $aaUsˀg€UsI>= ˀ,saaa,ԀsI>$$0I>Uss,UsUsaj$g€ԁ=bYԀˀˀ,| 5++| 5 5 5$0= sas0Usj$a՟1-$5aa՟asj$1-n6n6$$Y n67777B@BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0I$I$I$I$I$I6mmnI$I$I$mmЊt%Kc\FSmpd)lkt 1Е-sN!:|#)Ҷ2BT5τe:VBJƹ٣d$TȴдUUUUUUUUUUEUUUUUUUUUUUUUUUUUUUUabjasss,$Y ÁU=b YtP $Ԁj= g€jaas0I>$sg‚7Yj5Usg€$= 0ajˀ1-1-j1-Ij0j 5I>5$՟ԁYY5ˀ՟ˀ՟1-1-U ՟$Ԁj$$jssˀ՟ˀj$Yag€g€$ 5+|+| 5$UsI>= = = UsaaԀ7777B@BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<T0$I$I$JI$I$I$mmm$I$I$[mmmm`JS R>[\ c*[FSmpd)lkt 1Е-sN!:|#)Ҷ2BT٣d$TȴдUUUUUUUUUUUUUUUUUU@UUUUUUUUUUQE`5Y՟$sg€,jj՟ˀI>a0I>UsI>0= jg€s$$5՟ԁY5ˀˀUs0= Us,,,aasI>$Us0= I>a՟ˀaˀˀs,I>= g€Us1-1-$Y5+|$,sg€ag€s,sUsaԁY= g€$UsI>UsUsjˀg€Us= = UsI>= 0$I>= $+|I>= +| 5$7777B@BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUU]kZֵkZ{{{9s9s9s{{{ހ!B!B!B 5τe:VBJƹJ c*[2+kC!Lt%Kc\FSmpd)lkt 1Е-sN٣d$TȴдUUUUE@UTETUUUUPPEUUUUUUUU` 5j 5 5= Usˀ$| 5}7s| 5++}+~~7 5$$= g€ 57$$a77$= $0jj+~7+| 5 5j+|j 5jUss+~7+|UsjˀaaUsjj5= ,Ij5ˀUss770$j$++|7jUsg€ajUˀj Ԁ՟ˀ՟ԁU$aUsaYI>s,ag€g€,77775BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@ 0I$I$I)$I$I$mmmܒI$I$I-mЊ!:|#)Ҷ2BT5τe:VBJƹJS R>[\ c*[2+kC!Lt%Lk٣d$TȴдUUUUUUUUUUUUTU@UQUTUUUUUUUUU`g€I>,jY5aa$ja5$Ybˀˀaasjˀˀa$I>= 0$$$ 5 5ag€UsI>s0$$$ 5+}7+|~7~++| 5$$= 577|jj 5$$$$$+| 5 5j0= $= 5+|jjI>aj,ˀI>as,UsUs0 50j00Usas,s= UsUsg€7777ԁBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@ 0I$I$I$I$I$ImmrI$I$I$mmn`t 1Е-sN!:|#)Ҷ2BT5τe:VBJƹJS R>[\ ٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU`I>I>= $$j$00= jI>ԀjԀ$ԁYYY =b$jaUsI>g€՟$ ԁY՟Ԁ՟5$$,aˀˀ՟I>$0= asag€g€UsUsI>$Us= = 0Us,ˀI>a000sa$Us= = $$,g€ 50aI>a,$j 5 50j= Usag€UsUsg€UsUsUs= g€ag€$ 5j7+|$7777ԁBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@80 $I$I$I$I$I&mmm$I$I$mmЊc*[2+kC!Lt%Kc\FSmpd)lkt 1Е-sN!:|#)Ҷ2BT5τd٣d$TȴдUUUUUUUUUUUUUUUUUUEUUUUUUU`= g€I>jjj$$ 5I>$j 5ja՟a$ 5$0ˀ5ag€,Usg€sssjˀI>asˀ5Y  5a$$ 5$$0$ 50Us 5++~7++|j00= = 0jj0 5j+|~7~777j0I>g€5ˀ՟,Usg€= I>0 50g€՟ԁYa$}77= Us= I>I>I>0ag€Us7777ԁBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@L0I$I$II$I$I$mmm$I$I$[mmmm`:VBJƹJS c\FSmpd)lkt 1Е-sN!:|#)Ҷ2BT٣d$TȴдUUUUU@UUUUUUUEAUUUUTUUUUTA`I>0= j~7777 50g€g€UsaaaI>UsUs,I>0= $,j~7+|$Us,,,0= I>aaa0$= j 577+|0$= = = I>= 0j0I>= I>$$j+| 5jj7jI>,UsI>UsI>aI>g€,aa՟jˀI>+~}7 5aI>I>jI>$$j0 5 5jjUsg€g€= +}s7+~|+~| 57777ԁBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@d0I$I$II$I$I$mmmI$I$ImmmЊ5τe:VBJƹJS R>[\ c*[2+kC!Lt%Kc\FSmpd)lkt٣d$TȴдUUUEUUUUUUUUUUUUUUTUUUUUUUUUU`I>jUsas$ 5 5j7$7ss77+|Us7I>0g€saI>0$ItPU՟= = I>= s5j,UsssUs$0ԀˁYjaˀg€= j0= 0= = 0$= j$g€5$5Ys0777 50g€= 0 50$$$$0 5I>Ԁˀ 50a՟ajg€$UsaI>00,$I 7777ԁBUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<BUUUUUUUUUUUUUUUUUUUUUUUUUU_{{{!B!B!!B!B!B1c1c1d!B!@ 1Е-sN!:|#)Ҷ2BT5τe:VBJƹJS R>[\ c*[٣d$TȴдUUUUUUUUTUPPUUUUUUUUUUUU`a$I>sg€a,= $I>j0I>0Us= ag€՟n6Ub$5ˀ՟5I>I>= 5+| 5 5~}777~}+|j 5}7}++++|+|00I>j07~+||sa,0$a= I> 5 5 5UsI>5as= j$I>$UsUs= jg€j00$$$00aag€0$0aUsUs,jˀԀ$77775BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$ImmrI$I$I$mmv`t 1Е-sN!:|#)Ҷ2BT5τe:VBJƹJS R2+kC!L٣d$TȴдUUPUUUUUUUUUUUUPUTUUUTUUUUUa$$ ,g€g€UsI>$~|$aˀ՟՟Ԁ$,sa,a= = 0I>0$jjj0I>$0= ag€aI>Usg€g€՟Y1- Y$Ԁs= = aaI>++~7 5~|aaˀ,g€= jj77+~|$ˀg€0jj 5$I> 5ˀ$a 5~7~7+|jUsag€0 5jjUsI>= = 0 5 s5= $ 5jjI>7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<,0I$I$I$I$I$I6mmnI$I$I$mmЊt%Kc\FSmpd)lkt 1Е-sN!:|#)Ҷ2BT5τe:VBJƹ٣d$TȴдUUUUUUUUUUQUUUUUTUUUUTUUAU@UUU`UsUs0 5j$ 5 5sg€aI>,ˀ= 5= jg€a= I>$$= 0= $,I>I>j= ˀaUs= +|Ussg€I>UsI> 5$= 0g€sa, j5I>0jj 5| 5j 5$jI>j= 0= ,I>jsg€s0++~7$ 5$ 5= 5 5 5++|asYa0+~7|a|= = j 500$s0UsajI>7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0$I$I$JI$I$I$mmm$I$I$[mmmm`JS R>[\ c*[2+kC!Lt%Lkt 1Е-sN!:|#)Ҷ2BT٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUTU`s5Usj7+| 5j,g€j= $= $0= = Usg€aa,$0jUssUsa= j 5$j 5$j 5$as0 5$= = 0$$0jI> 50s,ˀˀn6n6U$՟5jԁ$$$Yag€I>,UsUs$n6$j՟jI>I>a= ,ˀaaajI>I>I>+~~7~7j 5j07777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<X0I$I$II$I$I$mmm$I$I$Kmmm5τe:VBJƹJS R>+kC!Lt%Kc\FSmpd)lkt 1Е-sN٣d$TȴдUUPUUUUUUUUUUUUUUUUUUUU`j$ 5 5jjjI>++~++++~7777~7777~7 5= Usj~|= aas0= I>0 5$$$$0j0I>Us00$asaˀˀ,I>a= = $0000$$= g€aI>Usg€Us,,g€sUs,UsI>= 0j0Us0$ 5+|0~777|$$0UsUsaUs= j$jj++|j 5 5 57777BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUU]{{{s9s9s{{{B!B!B!!B !:|#)Ҷ2BT5τe:VBJƹJBJƹJBJƹJBJ٣d$TȴдQUUUUUE@UUUPU@EDUUU` 5+|ja,aa$$I>0= $= $j0I>I>Us= 0++|= as+|j~7+~~|77+| 5j~7++~7}a777+}7I>g€0= sj= Us0sjUsag€= +|j= ,Us+~~| 5|jI>j+|7+|$00I>,,Us0$ss7jI>asg€Usa77775BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@< 0$I$I$JI$I$I$mmmܒI$I$I%mmЊ>[\S R>[\S R>[\S R>[\S R>[\S R>٣d$TȴдUUTUUUUPUUUUQUUUUUUUPUUUUUU`UssԀ՟Us= Us 5 57s+|j= UsUs$$0 5= 0saUsjj5ˀUsa7= ,,ag€Us,= g€aa= j0 5I>I>= 5 5+|jjI>g€= = ssI>sUsUs555$Yˀ= j$I>$Us= I>$,j+| 5 5 5++|$0Usg€Us= +}| 5j= = 0 50I>0$Usaaaj7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@< 0$I$I$JI$I$I$mmmܒI$I$I%mmn`[\S R>[\S R>[\S R>[\S R>[\S R>[\٣d$TȴдUUUUUUUUUUUUUUUTUUUUUUUUUUUUUUQU`j= j0I>$00Usg€,g€sUsaag€0I>,Ԁˀa= I>a= I>g€Us 5$= Us= a 5 5= Ԁ5jja= = = sI>00j0Usgƒ+|a0a= g€Usa,Ԁ5jˀasasI>a$$aI>= ssaajg€$$5ˀg€aaas= I>0UssI>UsˀI>a$g€0j$+|ja7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<80$I$I$JI$I$I$mmm$I$I$ImmЊS R>[\S R>[\S RFSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\٣d$TȴдUTUUUUUUUUUUUUTUUUUUUTQTUPUU`s՟,$Us+~77|7= = UsUsI>I>= I>,s,I>I>s$= a$a,aaUs$= $= 5$j= = g€a,UsI>0I>aI>= = = = g€I>j+~7jI>ag€aUs= UsUsI>I>g€aaI>0s,aaI>Ussg€= UsUs0j|7 5+|j$ 5jj 5+} 5 5$aa= I>= 5Us= 7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<L0I$I$I$I$I$I$mmm$I$I$KmmmЊFSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\td)lkt٣d$TȴдUUUAUUUUU@TUUUUUUTUUUQUUUUU`aI>ˀI>Usaaa,I>jj++|0UsI>sI>Us= jj= g€a00g€aa$Us= j77777+~| 5jj+|$sg€Us0$$j+|$asaag€Us 50 50= $jj$I>5aˀ0++|00I>I>= $j 5jj0= $ 5 5 5+|7 5+|$$I>$g€UsUs0jjj$$0= $I>I>a0 57777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<d0I$I$I$I$I$I&mmm$I$I$KmЊd)lktd)lktd)lktd)lktd)lktd)٣d$TȴдQUUTUUUUUUUUUUUUUUPEUQPUUUUUUU`jj7$ag€UsI>$j0$$$j|j$$00j 5= UsI>Us$0I>I>$$0= = I>0$Us00ˀˀjj,saUsI>s= UsUs= j0j 5j$j 50$0jUs,I> 5+~7 5$ 5 5j= |j$++|UsaˀԀ՟՟jˀsˀ՟ˀ,= j+|j+|= ja1-g€= $ 50$UY7777BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUUU^{{{{{!B!B!B!B!B!B1c1c0lkN 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1Е-s٣d$TȴдUEUTQUUUUUUUUUUUUUUUUUUUUUETa1-ˀUs[ 5|aI>,g€Us0= }|j 5|= ,՟Y j$$a= = ˀ[00j0jj 5,s,ˀ[ˀۺˀ[ag€, $,ˀsI>ja[$$I>sYj, 55= I>Usg€sg€jj= = Us0 5|jUs$I>}}b>>>tP,bbtPb}}tPtP+k77775BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$I6mmm$I$I$[mmm`N 1Е-sN 1Е-sN 1Е-sN 1Е-sN:|#)Ҷ٣d$TȴдPUUUUUUUUUUUUUUUUUAUUUUUEUUUUc+|Usˀg€ˀ 577+~~7 5Usg€g€,I>aUss,Us,$ 50$jI>= jsUs0$0,5ˀ,j5ˀˀg€a$5Y$ˀ5Ԁassasa՟՟g€ˀg€= = jj7| 5= ag€,,g€sUsaa,՟a$Ԁ՟ˀ$j 5 5 5$0$|0 50I>Usg€,sa՟aa0$7777>BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<(0I$I$I%$I$I$ImmےI$I$I$mЊ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:JBJƹJBJ٣d$TȴдUUUUUUPUUUUQUUUUUUUUUUUUUUUUUU`jj$I>Usa$= = 00,՟ԀUs,,Uss,UsUs0~7$j 50jaj= I>,0UsI>a$7I>Us 5Us= = 0I>= I>Us$I>a5՟jj0aa,ag€= = jj+| 5j0jj= Usg€Us00I>jjj$j 5j 5jjj00a0aYY,UssUsaUsUs$sYI$5ˀs7777>BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<<0$I$I$II$I$I$mmmےI$I$I$mmЊƹJBJƹJBJƹJBJƹJBJƹJBJƹ٣d$TȴдUUUUUUUUPUUUUUUUDUUUUUUUUUUUUU`I>I>= g€,g€UsUsg€a,5aUsg€,,ssa,ˀ0$ 5= sj+~~|g€0I>= g€aI>$0I>j 5 5$j 5$$UsI>g€g€, 5 5 5|+| 5$jj+|= a= UsI>g€jj$j= I>aag€ag€g€,ag€aˀa5ˀ՟j55 aa,g€,5,ˀs7777>BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<P0$I$I$I$I$I&mmm$I$I$Kmmmݶ`JBKtd)lktd)lktd)lktd)lktd)٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUDPTUUUU`ˀasassUsg€ˀ,ssg€5jsssj5j՟ˀ,,saˀ5js,= s՟jjg€s $IԀ՟Ԁˀ՟a5ˀ5Ԁsg€,a,ˀԁ $՟՟5g€sUss,= 5= = j$0I>UsUs= I>= jaUs0 5 5|+| 5| 5jj0$ 5$jj$I>07777>BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<h0I$I$I%$I$I$ImmnI$I$I$mmЊlktd)|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|"٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUQUQ@UUU`= $0jj0= I>= = $UsI>I>0= s= = I>a,Usˀjg€ˀˀ՟tP ՟5$j,ssˀ5$ԀUssasajIIUsI>g€a,s= I>,a= 00$$= g€g€g€a,g€assg€0I>Us= g€sg€0 5 5j| 5 5$$ 5 5 5+|0= 77~7|j= j$ 5$0$0I>$$7777>BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_{!B!B!D!B!B!B1c1c1cB!B!B! P)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ٣d$TȴдUUUUUQUTPEUUQUUUUUUUUUUUUUUU`$I>I>g€ssˀ՟ˀaag€,aI> 5~7+~~~7 5aԀ0$ 5+|j$jjY Ԃ| 5 5++| 5= = = = I>s+|s+}~| 5I>I>I> 5j+|$$= I>UsI>Us,,sag€I>Us= Us՟5sUssg€ag€aj=bÁbYY$YˀԀԀ$1-U$ˀs0$= = = aaa0Us,a 5$77775BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@@"""""""""""#333333333334DDDDDfffffwwwwwwp!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:>[\S R٣d$TȴдQUUUUUUUUUUUPQTUUUUUUUUUUAA@` 5j|$$Us= saa0I>I>jg€00UsUsg€0$= j 5$Us 5 5 5j$$j$I>0ss,g€UsI>I> 5 5++|$j+|$j 5+|I>$,g€,a 5 5= I>0= g€aˀˀ5aˀ$՟a՟sI>g€j= 5 5 5I>a,ˀg€UsUs7+|j7ssj= jO7777$BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@4@""""""""""3333333DDDDDDUUUUUUUUUUUUffffffffffffwp>[\1Е-sNR>[\ c*[5τe:VD2BT5τe:VD2BT5τe:VD٣d$TȴдUPPUUUUUUUTUUUUEa7~7ssas7+|$++|0= a,I>= 0++| 5 57|aas7~7 5+|Usjasaa77 5I>5ˀUsa= a$g€UsUs= +|Us$$a0j$7777jaag€ 5$ 50= I>I>s= 0 57~~~7Us՟ass,g€jj$$I>ˀ,sa 5|Uss7777$BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<BUUUUUUUUUYs9ZֵkZ{{{9s9s9s{{{B!B2BTJBJƹJBJƹJBJƹJBJƹJBJ٣d$TȴдUUUUUUUUUUUUPUUUUUUUUUUUUUUUUUUU`= Usˀj$UUYI>$YÁtPIb=b1-U $ԀԀ5as= Us= = j0gY՟ˀasԀ5g€s++|$$aUsI>jj 5= Ussssaaˀ5՟Y$jaˀˁtPI ՟ԁIYsԁ 1-Ԁaj1- =b bUb=bIjaԁYY$$I77775BUFRb f  2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0$I$I$II$I$I$mmmےI$I$I$mmЊƹJBJƹJBJƹJBJƹJBJƹJBJƹ٣d$TȴдUUUUUUUUUUUUUUUUUUUUTPAUUUUa1-Y$1-UI1-$$js,$j 5a55Usg€asg€aj$1-$$ԁY՟՟՟Y$ ՟ˀg€g€ss՟1-1-5jԁY5sUsg€ssUs= I>= = 0$j= $$0j$ 5}+~| 5~+~}~77|$Uss0+~| 5|7j0aa՟5՟g€ˀ,5$՟aj7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0$I$I$II$I$I$mmmےI$I$Immm۶`JBJƹJBJƹJBJƹJBJFSmpC!Lt%Kc\FSmpC!L٣d$TȴдUUUUUUUUUUUUUUUUUQUUUUUUUUUUUU`՟Ԁ՟sasI>0aaaˀˀg€ 5jI>= j= asaUsUs$= $aUsUsUsg€,sI>I>0= 0$I>g€,,,,,g€I>j|~++|j00jj$$0$aaa0I>= I>I>= j0+|j0I>s,UsUs= ,ag€s,I>0$Us$I>Usg€,ˀˀˀaagYIIj՟YjԀja7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<40I$I$I$I$I$I$mmm$I$I$ImmЊt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt&Sl٣d$TȴдUUUPUUUUUUUUTUUUUUUUUUUUUUU`j5jˀˀ,ˀaUsUs0ss70a5jj5ˀjYˀˀassUs= I>j0= g€5g€0= I>I>Usa= 0$~7~77s+|a,aI>aI>aˀԀ5՟Y՟ˀsjsaˀj=b j5Ԁˀj՟ԁ$=bU Y՟jˀjˀ՟1-=bY Y$  7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<H0I$I$I$I$I$I$mmm$I$I$Immm۶`pC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!L٣d$TȴдUUUUUUUUUUUUUUUUUUTEUUUTDUUUUUU`$Ԁj5$YYYԀg€g€g€I1-1-=bU$1-Y $ˀˀaUsaaaUssUs0a= aj 5 50$j$g€ˀ,՟Y1-1-=bU5ˀUs0$j0+|+|= aa$ˀ UUs$j|+|j+|0asa= a,,Us0= 0I>aaaUs5ajj$7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<`0I$I$I$I$I$I6mmm$I$I$[mmЊt%MsN 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1Е-s٣d$TȴдUUUUUUUUUTUUUT@UUPUUUUUUUUUaUn6Iˀbb$,5Usaa00I>s5a,՟I>= I>aaa0j 5+~}7|jj$Us= 5jj,js$ 5+|77s7ss++| 5Uss՟5 55I>770a  Ԁ,,aYn6b baUss IY$$  Y$7777BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUU^s9{{{{{{!B!B!B!B!B!B0N 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1Е-sN٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUTTUUUa Y$ԀԀˀa,s$ja՟jˁY=bY55sg€,UsUsI>Us= Us5$$$ˀ՟Y1-Y$1-1-=bY $=b$YԀ$Ԁ5sˀ՟jjYԀˀˀI>g€5ˀa= 0$jsԁ$Y$1-,ˀaa$Us= 0I>07+~|+|Usa0 5+|$a$IIU1-$YˀI>77775BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I)$I$I$MmmrI$I$I$mЊ 1Е-sN 1Е-te:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU`$jj0,$1-YjˀԀa$YÁÁb$ YjjˀԁI$$՟5՟$Ԁ՟g€,ˀUsUs= 57+|= g€$U=bI1-1- $1- =bˀUs$$I>I>$ 5 5$aԀԀ5aaaUs,s$jjajY$,,aԁ$Ԁ՟՟jjaa,aԀ՟5Us= g€$ Y՟7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<$0I$I$I)$I$I$MmmrI$I$I$mmЊ5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τd٣d$TȴдUUUUUUUUUUUUUUUUUUUUUTUUUUU@UUU`$5$=b=b1-I ՟Ԁ5Ԁjj5g€= 0= = aa= $js5՟aˀ$baag€0= ag€՟Ԁj5sg€sjԁ Y$Y ԀUsa$I>$j 5g€՟՟j՟՟ˀa$U=b$Ԁ5I>= +|j 5UsY$1-1-ԁ1-$tP$1- jaI>77= ,Ԁg€a՟Ԁ$՟$ˀ7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<80I$I$I)$I$I$MmmrI$I$I$mmm`:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BTJ٣d$TȴдUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUU`g€Usj$+~|aj$՟aaԀ$$$$1-1-$$tPb ԀjԀ5ˀ5ˀˀ՟Ԁj՟ˀˀ5a ՟ag€s,saԀԀ$Y1-YY$Y$$55j5,a՟Ԁ՟՟Ԁjˀ,aI>UsI>aag€s,ˀˀˀj5ˀ,Usssaaaa= 7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<P0$I$I$II$I$I$mmmےI$I$I$mЊBJƹJBJƹJBJƹJBJƹJBJƹJBJ٣d$TȴдUUUUUUUUUUUUUUUQUUUUUUUUUUUUUU`UsI>0saUsg€ˀˀˀ՟՟՟Ԁj՟ˀ,saˀag€g€sa,,sˀ՟՟jj՟Y5,Ussg€sg€= j+|asg€UsUsg€sjˀaI> 5+|j0= +|0asg€sa= sUs,ˀaˀ5sUs,aԀ5a5՟asa,jjas$YԀ,sa,sg€I>g€ˀa5ˀˀ$7777BUFRb f  2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<d0$I$I$II$I$I$mmmےI$I$I$mmЊƹJBJƹJBJƹJBJƹJBJƹJBJƹ٣d$TȴдUUUUUUUUUPUUUUPUUUUUUUUUUUUUUUa=b1- =bU$Y5$jˀ,,ajԀԀ՟5$՟YjaaUs$jj~77= I>I>= aaaaˀjsag€Us= $j 5}| 5aa55s5՟$Y$$՟ˀg€Us,asԁ1-1-U=bI=b $$$=b$$YYaUsss5՟5jaˀsa7777BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU^B!B!B!!B!B!C1c1c1d!B!B!B)JPJBJƹJBJƹJBJ>[\S R>[\S R>[\٣d$TȴдUTUUUUUUUUUUUUUUUUUTUUUUUU`j,a= 7s}7 5+++++|I>Us00$ 5 5= +~77+|$= Us$g€I>= aaaa,I>j+~77js՟$՟Ԁԁ$Ubb$ $55ˀˀag€s ssˁY Y՟saaa0j0 5|Uss U1-$$Y=bUIU$1-5ˀsg€a77775BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0$I$I$JI$I$I$mmmܒI$I$I%mЊS R>[\S R>[\S R>[\S R>[\S R>[\S R٣d$TȴдUUUUTUUUUUUUUUUUUPUUUUUUU`= Usg€g€g€s$0I>,,,,sUsaI>= j777|$I>I>Us= jUs000$0I>= sj~777 5j$ 5 5j$$$$j} 5= Us00jj 5$= I>UsaajaUs$Uss$++~7000= $ 5j= jasUsI>= = 5j 5 50 5j$= g€ssI>aa7777$BUFRb f 2  +,-ZZ!RLEICESTER CENTRE 1% t#StЌ @@<,0$I$I$JI$I$I$mmmܒI$I$I%mmЊ>[\S R>[\S R>[\S R>[\S R>[\S R>٣d$Tȴд@Y$)2. #`,?x`a?x`gU a#`a h&%. L&%˂1 g |(`[  ˂ h&%˂ X2Zj 2Zۺn 2Z՟% 2ZۺV~ 9ۺV~B@6՟n = ۺ 9jW0 5 5n6I||(, W0`[UW0O[n6А 'I>$ 50P @aАg‚)2˂. &% Y,@ ˀ7777>BUFRb f 2  +,-ZZ!bLEICESTER CENTRE 1% t#StЌ @@<@0$I$I$JI$I$I$mmmI$I$Immm۶`[\S R>[\S R2+k" c*[2+kC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!L٣d$Tȴд@\υn6> ' 5OI> Y-P9^I1= mۺt%KT~ '$Usdp'@C#zj1- @@mYHV~ 0-I>Y. P`*[% )2F0s. 2ZX@IV~ Y5gReˁ?%Ĵ p2ZReĴ h&%F0IKT Xw@2Z^1d P3@s1-bZ?x ' ' 57777 BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<X0I$I$I$I$I$I$mmm$I$I$ImmЊt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpd)lk٣d$TȴдUUUUUUUUUUUUUTEQUUUPDUUUUU`jj= 0I>g€aa,5jԀjԁYYa= 7+| 5I>I>a,ˀg€,jԀj5ˀag€Usaaa7+| 5a,ˀsg€,,,ˀUsaI>j$+| 57= Usj+|$= aI>= j= = j 5 5 5 5 5+| 5+|7sssjg€I>I>g€sa,77+|00$ja= 0g€Ԁ7777$BUFRfb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUTD]kZֵ{{{s9s9s9{{{{{{td)lktd)lktd)lktd)lkt 1Е-sN٣d$TȴдUUTUUUUUUTUUTUUTUUUQUEUUUUaY՟ 5ˀj$0j+~7|jj00$0= UsUs= = Us՟Y$ˀˀg€jjI>I>= $0$|jaaԀ$ssI>07~+|0g€$j0$ 5 5j 5++~77|$I>I>$jj$0UsI>$00j+|$aI>= 5 5| 5$aj5$՟=bԁY,Us= j7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0I$I$I$I$I$I6mmm$I$I$mЊ 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1Е-τe:VD2BT٣d$TȴдEUUUUT@UUUUUUUUUUUUUUUUUUUUUUUU` 5| 5$I>1-ۺ$՟ۺY՟՟՟UsI>0j+k 5+kbbtP+k 5g€[UsaˀۺYYY1-Y՟՟,sUs$ 5= ,,jˀˀ5ˀ$ۺۺY Y$$j5՟jY$Y$ ՟$$b=bY1- jj$Yۺj5 Yj$$ ۺjag€ 5 5 5UsUs$7777$BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0I$I$I)$I$I$MmmrI$I$I$mmЊ5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τd٣d$TȴдQUUUUUUUUTUUUUUUUUUUUUUUUUUUUUU `$jZ|OXjj$$ۺ5ˀg€[,jۺ ۺj$$j,OX= = $HZ| 5j,555j$I$ Yۺ$$j5j,j$,υ $  Yυ$$1- υj= OX$[aaۺˀssaa5υYY$υ$$5ˀˀaˀˀaaaa5g€7777$BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@00I$I$JI$I$I$mmnI$I$I$mmmm`:VD2BX>[\S R>[\S |#)Ҷ!:|#)Ҷ!:|#)Ҷ!:٣d$TȴдUPUUUUPUUUUTUUUUUUUUUUUUUUUU`saI>g€+~+}| 5Us5՟saˀ5asg€ˀa0j= = ++|0Us$Ԁag€I>ˀ5՟՟ˀˀI>$I> 5+}7|jaag€g€jag€aˀg€g€aI>= ,$$I1-a5$Y$՟Us 5$ 57 5I>sUsg€,saY$bU=bY ՟՟5ag€I>UsI>sԀ7777$BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@H0I$I$I%$I$I$ImmnI$I$I$mmЊ|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|"٣d$TȴдUUTUUUUUUUUUQUUUUUUUUUUPUUU`jaas,Us= 0$++~~7 5~~77I>jjI>UssI>a$I՟՟ԀԀˀs7~77j$= Usas,$Y$=b$j,ag€ 5|+}7jI>g€aa,sˀˁ ՟$Ԁ$ $$1-1-1-a= g€aԀa,sa55ˀ,Us0$}7= 5 5a$$55Ԁ$U1-I7777$BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@\@"""""""""""#333333333334DDDDDDDDDDDEUUUUwwwwww)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)ҶD2BX>[\٣d$TȴдUUUUUUUUUUUUPUUPUQ@UUTUUUUUa=btPÁYn6Y՟jˀˀ5ԁ$$՟՟jԀ՟jˀa,g€~77 500= g€= $j0= ,Usajg€,0Us+~|jI>jj 50 5 5+|I>$j 5a|sUs} 50g€ˀg€0 5= g€sI>$j7sssasjjg€I>Usag€I>= Usg€g€ag€ag€I>7777jBUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<BUUUUUUUUUUUUUUUUUUUUUUUUUUU_{{{B!B!B"!B!B!C1c1c1d!B!@S R>[\S R>[\S R>[\S R>[\S R>[\S R٣d$TȴдUUUUUUUUUUUTUEUTUUUUUUUUUUUUUU`a$bn6YԁY$ =bbtPY$Ԁa= 0 5j= s5Yj5a,,j՟50 5jj+~| 5I>I>0 5+|$0I>Us007}77 5g€՟ˀ= I>g€0= I>a$I>j 5j$ 5 5$, =bjjg€aaaԀ՟ˀaaUsaaa$$sYbYUI1-7777|BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0$I$I$JI$I$I$mmmܒI$I$I%mmЊ>[\S R>[\S R>[\S R>[\S R>[\S R>٣d$TȴдUUUUUUUUUUUUUUUUUUUUU@UEUUUUUUUa$=b$$Yb$1-I$Y$ $$ $ Ԁ՟ԀԀԀI>= Usa՟ I1-1-55$Y1-UI$=bY5ˀ,Us$ 5jUs,j ՟ag€sˀ՟$$ˀ,aI>0}7ajj 5I> 5+|UsjˀjԀԁY$Ԁjˀaa5ԁ Ԁ5j՟$5aa7777ˀBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<(0$I$I$RI$I$I$mmmI$I$I-mmv`[\S [2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" ٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUP`ˀ,aI>$ 5= 51-=b1- $1-$=b=b1-In6tPtPI1-  Ԁ՟Y=bԀjY$j5Ԁs0 5$0= ,ˀˀ,ˀ՟ˀ,$1-tPIԀ՟՟Ԁj5jII$$ajˀj 1-1-=b$1-1-$YԀ՟5Y 1-=b$Y5= j 5$I>a0Us0= Usj+~~777|7777ˀBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0 $I$I$RI$I$I$mmmI$I$I-mЊc*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[٣d$TȴдQUUUAUUUUUUUUUUUUUUUUUUUUUUUUUUc| 5 5j| 5 50՟$ۺj՟jj 5}~+k0[jsUs= j0I>I>,$՟jˀs՟a5ˀjj՟՟[[[g€,a$ۺjˀa,5՟ۺY1-I ۺ5ˀaˀj1-1-$Y$jjj՟5j՟jۺjjۺY Ib1-U1-$=bIb=bU=b$=bIUI$Y7777ˀBUFRb f2  +,-ZZ!bLEICESTER CENTRE 1% t#StЌ @@<T0 $I$I$RI$I$I$mmmI$I$KmmmЊ2+k" c*[2+k" c*[2+k" c*[2+k" c*[td)lkt٣d$Tȴд@)2] c <˨1Pf;wC|n28 ~\*LK@υ1Ĵ0[PHB ,+|)2aYА?x P\#`@@sn6tIdp 'O 5az&%z$ l28 `9aInc  q`w@OX=bc B@6g€υ1-bZ q w@6υbZ h@@, @#`I>A1-IĴ  C#a1-bZ!6mYI 'C#a 7777bBUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUU]kZֵkZֵkZֵ{{{!B!B!BB!B!B!c0d)lktd)lktd)lktd)lktd)lktd)٣d$TȴдUUUUUUUUUUUUUUUUUUUUUTUUUUUUUUPa I1-=b$1-=bIbb$$I=bI1-YU=bjasUsg€aaY՟5saaUsg€ssaI>0aI> 5j= = 0= 0I>Us,sUs= I>I>00$I>Us= ˀ5՟$ 5I>j= $jI>I>$ 50 5 5| 5g€$bU$1-ԁYY I՟՟՟,a5jjԀYY՟g€j~7+|0s7777|BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$I&mmm$I$I$KmmЊlktd)lktd)lktd)lktd)lktd)lk٣d$TȴдUUUUPUUUUUUUUUUUUUUUUUUUUT`՟a55ˀsI>= 0 577+|aI$jU=b$1-UUItPbIn6$I$՟5Y$I5s0= I>g€a՟$YI$ԁYjsI> 5j= g€,g€UsI>I>,$՟՟ag€= = 5}ssasjsasI>I>a$$$I>,Usj0= $7+~777j 5+|jjj7777,BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<$0I$I$I$I$I$I6mmm$I$I$[mmmtd)lktd)lkN 1Е-sN 1Е-sN 1Е-sN٣d$TȴдUU@UUUU@UUUTUUUTUUUUUUUUUUU`I>I>I>a= 50= $+}I>՟aUsI>UsI>I>a,5jaag€g€j~77|0,ˀaI>I>a 5jj0= aaUs0++~~}7a,g€aUsg€ssI>asI>00= j++~+~7 5I>5ˀI>I>g€I>= j$g€Usg€I>Us= 0I>= $j= I>a5$Us$$$jUsa5g€aUsg€7777,BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<<0I$I$I$I$I$I6mmm$I$I$[mЊ 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1٣d$TȴдUUUUUUUUUUUUUUUUUT@UUUUUUUUUUUU`js,sa500= jjj0Us0a,,ag€= Us0Usjg€ˀˀj՟0= = I>a1-ItPUb=bb1-՟ԀԁYn6n6IY5jˀ55jg€$$$+|+~~~7$g€a,= I>Us= aaI>Us5tP-Y$1-=bn6b$ Y$I U Y$$՟V%YY-Á7777,BUFRb f 2  +,-ZZ!rLEICESTER CENTRE 1% t#StЌ @@<P0I$I$I$I$I$I6mmm$I$I$mmЊ-sN 1Е-sN 1Е-sN 1Е-sN 1ЖJB[2*٣d$Tȴд@&%`ˀ$Y C|=btP=bYP,ˀg€Pg€C#jjj 5j0g€ۺ$C#jj[sˀ,, 5$06C#C#saC#C#g€sۺ$PYC|a0$$ 50$0C#g€ˀˀ1-$g€g€s ˀ6g€OXaυY%QhtP =tPh|1-ۺۺυYO}é7777YBUFRb f2  +,-ZZ!rLEICESTER CENTRE 1% t#StЌ @@<d0 $I$I$RI$I$I$mmmI$I$I-mmv`k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" ٣d$Tȴд@b b b=b1-Y$n6-aUsI>UsUsI>ab ՟ԁ I$Ԁ՟Ԁ$$Y=b = I>= I>I>g€s՟j Uˀs$0assUss,՟՟I$՟ Y5aˀg€,5=bIbtP=b՟$ԀԀԀԀ5ˀaIUs0UsUsI>= I>a,,as0I>I>ssUsj= U7777YBUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUUUUUUUU_{{x!B!B!BB!B!B1c1c1cB!B!@c*[2+kC!Lt%Kc\FSmpd)lkt 1Е-sN!:|#)Ҷ2BT5τd٣d$TȴдUUUUUUUUUUUUUUUUUUUUEUUUUUUUUatPb-$՟a5$$=bUn6tP$ˀaaaI>$ Y5ssaI>Usag€I>0$j}|= ssI>asUs= I>ssaԁYn6=b՟sg  ՟Y1-Ԁjag€UsI>g€ˀjjj՟ˀˀI>I> 5+|jg€j՟j,,g€,sUsaI> 5$0j= $0I> 5|I>s,I>UsI>0= Us,g€Ussj7777|BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$II$I$I$mmm$I$I$Kmmm`:VBJƹJS R>[\ cKc\FSmpd)lkt 1Е-sN!:٣d$TȴдUPQU@UQUUPUUUUUUUTUUUUUUUa =bY$~~7~|7~+~~|| 5$+|++~7~7~7= sg€$j~~7| 5 5 5$ 5 5+| 5j5Ijj0~|jj= g€g€Usg€ˀ $1-Ԁ= $= = 50j0j$0$+|$$a՟$Yj5jsjˀg€sa5,,sԀ=b7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<,0I$I$I)$I$I$mmmܒI$I$I-mmЊ|#)Ҷ2BT5τe:VBJƹJS R>[\ c*[2+kC!Lt%Kc\FSl٣d$TȴдUUUUUUUUUUUU@UUUUUUUUUUUUUUUUUUU`sˀg€՟Y՟ԁ ÁYtPU=b=bIIU1-g€$= j0= 50Usˀ,g€a= $000g€,aUs$j$+++| 5 5$0$$$j$j0I>s,sa,g€aI>a,ˀ5a՟Yˀ$a0aUstPn6՟,asg€,5Ԁ,g€sYb$=bn6}1a= 0$= 0I>= I>Us= Usa7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0I$I$I$I$I$I6mmnI$I$I$mmmm`pd)lkt 1Е-sN!:|#)Ҷ2BT5τe:VBJƹJS R٣d$TȴдUUUUUUUUUUUUAUUUUUUQUUUUUUU`5= = = a՟Y$ˀaa= 0$$= I>aUsUsg€sg€= I>00= a5s,Usj 5jjjjjj00= = 0j 5++| 5jjjj 5$$$jj000j00= j++|+| 5++|++|jj 5j+| 5$I>$jj$+|jj$= I>g€ajԀԀaI>0= a51-$jsI>aa7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<X0$I$I$RI$I$I6mmnI$I$I$mmm`>[\ c*[2+kC!Lt%sN!:|#)Ҷ2BT5τe:VBJƹJ٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUTU`a,ˀˀԁn6Y1-1-1-=b1-Yaa 5 5+|j 5j= 0= $ 5$I>U,Usajj5jI=bn6$b Ԁ՟YԀ՟5sg€j$5555ˀˀjˀUsg€aaj5,UsUsUsg€I>a,,,,5ja7|Us~|$7| 5+~~7ˀ$Y$}s7777BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUU]{{|9s9s9s{{{ހ!B!B!B!B!B S R>[\ c*[2+kC!Lt%Kc\FSmpd)lkt 1Е-sN!:|"٣d$TȴдUUUUUUUU@UUUUPUUUUU@UUU@PUUb7jssas,a5՟YԀˀg€,U,a+|$a= 0ag€Usg€5Y,= j}$g€ԀԀasasg€jjj,I>aY$$j0~|0sg€0000I>UsUsa՟Á1-Ԁg€= }0I>Us,UsUs,,,5ˀa+}ss| 5++|I>UsUsUs՟j7777|BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@ 0I$I$I)$I$I$mmmI$I$Immmݶ`)Ҷ2BT5τe:VBJƹJS [2+kC!Lt%Kc\FSmpd)lkt 1٣d$TȴдUTTU@UUUUUUUUUUUUPUUUUUUU`,ˀaI>Us$} 5j~}+++|jˀˀ,Us}+~7s7+|I>sg€sg€Us$ 5$0$I>$$0Usag€= 0= ,$Y ՟asI>= a,,s,,555,sUs|,= Us= 500jI>I>I>s= 0aaԁ$YYԁ1-YbI,7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@$0I$I$I%$I$I$MmmܒI$I$I-mmЊ-sN!:|#)Ҷ2BT5τe:VBR>[\ c*[2+kC!Lt%Kc\FSl٣d$TȴдUUEUUUUUUUUUUUUUUUUUUUUUUUUUUU`g€Us0j 5 5$+|jj= g€a,aaag€= UsUsI>aUsI>0$ 5j$ 5ajaˀjsI>$= $j0jUsaUsI>sjjs՟$՟= 00= I>a0= Usj$00j 50= = 5ˀag€a,Us0 5$ 5= j= Us$0$j+~7| 5I>asI>= = = $0Usaa0Usa5$7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@80I$I$I$I$I$I6mmnI$I$I$mmmm`pd)lkt 1Е-sN!:|#)Ҷ2BT5τe:VBJƹJS S٣d$TȴдUUUUUUQUUUUUUUUUUUUUPUUUUUU@UUa1-=b=b$=b1-bˀ0I>I>$0$a$$$asg€I>$| 5j,ˀsg€jԀj,ˀ,I>aˀsjI>$$Ussa= g€g€՟ˀI>Us$j$$$sUs,ag€asa$0j$07+|$Usa,0՟՟g€,5jssUs,aI>j|$= ssg€՟+~|0Us= = a$ 57777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@P0 $I$I$I$I$I&mmm$I$I$mmm`2+kC!Lt%Kc\FSmpd)lkt 1Е-sN!:|#)Ҷ2BT5τe:V٣d$TȴдUUUUUU@UUUUUUUUUUUEUUU@UU`$I> 5 5 5++~~7 5= ,sI>UsUsI>0saYԀs՟a= j+}ssI>ss= I>I>Us5,,,,jjˀ= |+| 5sjY,00g€0 5g€= g€ 5ja5Ԁ ˀj,Usj$ 5+|= = 0= j 5j$j$$ 5 5$}}~7s7+~7+| 5= $00,ss7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@h0$I$I$JI$I$I$mmm$I$I$KmmЊBJƹJS R>[\ c*[2+kC!Lt%Kc\FSmpd)lkt 1Е-s٣d$TȴдUEUUUUUUUUUUUUUUPUUEUUPUUUU`Ԁ՟,Us0+|jj 5j0I>Usg€ˁ ԁIY$I>Ussas,,g€a= s,,Ԁˀˀas,ˀjUsag€Us0 5Usg€0sYa 5++|$YIs= +|+|j= |j0I>Uss$+| 5= tPb 5++}~~77++|j$a՟$՟I>Usg€՟$aj++| 5+|7777BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<BUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_{!B!B!!B!B!c1c1c1!B!B!B)JPN!:|#)Ҷ2BT5τe:VB[2+kC!Lt%Kc\FSmpd)lkt 1٣d$TȴдUATDUUUUUUUUUUUUUUUPUUUUUUb+|jjj0g€ 5+|Usg€I>+~7|a07+~+~+| 5|$aˀˀg€I>g€= g€g€aI>= 0$s$=b$1-a,Ԁj7|$I> 5j= = = sI>0$sˀ= Usa$$ˀaUsajaI>= = 5$05a= ja+|a,I>g€I>$UsaI>0I>ag€a,ag€,a|$+|= ,557777|BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I%$I$I$MmmےI$I$I%mmЊ-sN!:|#)Ҷ2BT5τe:VBJƹJS R>[\ c*[2*٣d$TȴдUUUUUUUUUTPPUUUUTUUUUUUUUU`g€assa,g€,aaag€a,= Us$0$ag€0j0Us= I>= = = Usa I՟,a}ssa+}+|j 5+}ss77+|I>ˁ|ag€I> 5I>0Us0jI>aI>= j= g€$j}j0jsjaaa5ajsUsYԀa+|jjsg€,I>0jjI>a$g€= 0$ 5,57777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<,0 $I$I$I$I$I&mmm$I$I$mmmm`kC!Lt%Kc\FSmpd)lkt 1Е-sN!:|#)Ҷ2BT5τe:VBJ٣d$TȴдUUUUUUEUUUUUUUTA@U@PUUUQUU`ˀUsajˀs00j 5 5jjj0$0Us$g€5՟ˀaI>= 0I>$00aI>0$I>g€5Usg€j$$0$= $Us= js|$= |a+~7$$++++|$ 5$Us= Us+~7~|0$++|0,sˀ,= | 5jjasUs0|0Us,I>$+|0= ,YUˀg€s7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<D0$I$I$RI$I$I$mmm$I$I$[mmm`ƹJS [2+kC!Lt%Kc\FSmpd)lkt 1Е-sN!:|#)Ҷ٣d$TȴдUUUEUUUT@UUUUUUUUTUEUUT`g€ag€ag€aajI>I>jas|aaaas,saI>= j| 5 5j+~7s++|$ 5j$ 5 5+|++~}| 50j+}~|= Us$0$$jjj$$00j 5 50I>a55Yj,$UsaUs= +|$j7 5+|jj7sss+~+|j 5$= I>0= 5I>aajjs7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<\0I$I$II$I$I$mmmI$I$ImmЊ2BT5τe:VBJƹJS R>[\ c*[2+kC!Lt%Kc\FSmpd)lk٣d$TȴдUUUUPUUUUUUUPPUUUUUUUUa+|aˁYˀg€0Us 5 5$= $ 5$jjUsˀI> 5++| 5 5I>aI>= I>UsUsI>= 50$j$sUs= 5= jag€g€= 0 5++~+~77777ssa+|00$++~~7}~+~| 5}s+|000jj0UsԁYYԀasa5I>$0$j 5$0jj$aa$7777BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUU]{s9s9s9{{@B!B!B!!B!B!B0t 1Е-sN!:|#)Ҷ!:5τe:VD2BT5τe:VD2BT5τe:VD٣d$TȴдUUTPUUUUUUUUUUUUUUUU@UUUUP`$aYaUs$ 5+| 5~~}~~}7+|}~7Us0= $sˀ5՟,ˀ= ˀ,ˀssa,I>g€5$$Ԁjˀj ՟ԀjԀ,aa0$ 5I>g€aUsaaUsg€I>a,g€UsUs,, 5777I>՟՟a,s,aa$jj$j+~|7777|BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I)$I$I$MmmrI$I$I$mЊ2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT٣d$TȴдUUUUUUUUUUUU@UPUUUUUUUUUTUUUc+| 5Usa,a= UsaaaUs,sI> 5 5= I>g€$j0 50$I>saag€saaa,g€UsUsI>UsI>I>,g€g€j 5 5$}77+|$= I>,= ~7,jˀ0= = I>0= $ 5$ 5j$aˀa= ,a,I>Us0 5jUs00$7+|I>Usj= Us00j$I>sag€Us7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<$0I$I$I$I$I6mmm$I$I$[mmm5τe:VD2sN 1Е-sN 1Е-sN 1Е-sN 1Е-sN٣d$TȴдUUUUUU@UUUEUUUUUUTU@P`I>= $j= I>0Usg€՟=bԁY$,aUs 5j$+|$| 5++}}+| 5I>I>$ 5j0$$jI>= 5+|jI>ag€g€ˀ,aas,sg€= j0 5$ 5jjs= ja|Usj$~}7ssss~7sass+| 5 5+~77~}~777| 5+}7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<<@3334DDDDDDDDDDDEUUUUUUUUUUUVfffffffffffgwwwwwwwp 1Е-sN 1td)lktd)lktd)lktd)lk٣d$TȴдUPUUUUPUUUUPUUTUUUUUUUUb~7+|Usa0= ~7++|++~|jjj7j= Usaa5ˀ՟Y$ˀg€= ++|j0= I>$0a= 0I>asa5jUsg€Usa 5++}ss7+|j0 50$aUsaUsaajI>$+}+}~|= I>,a,= 0 5jI>aj5$5ˀs= 0ag€g€,= j 5s55as7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<X0I$I$I$I$I$I&mmm$I$I$[mmmtd)lktd)lkt 1Е-sN 1Е-sN 1Е-sN٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUTU`I>= jj$Us$a= 0UsUssaUsaaUsaaˀ,,0g€a= $ 5jj$Us= j$ 5 5 5$UsI>0,ˀs07sOa7jI>Us= $$j0= UssI>$g€,UsI>= ˀˀg€asasg€I>j0I>= 00g€$,Us5,I>= = j 5+~7+~~7~~77777| 5,Us577775BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUU]{{{s9s9s{{{{{{B!B 1Е-sN 1ж5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT٣d$TȴдUUUUU@UUUUUUUUUQUUUUUUUUUUUU`0g€j$,sI>$$Us= 0= ,ag€$I>+~77Us,assag€a,ˀsg€0 5 5UsI> 5I>0~7I>= UsasaUsa= Usˀg€= aI>UsUsj+|j 5$Usas,5aasg€I>g€0UsUs= 0j7|++|jI>a,g€Usg€,ag€sI>$sa= 5Us= I>0I>g€ss= 0j7777|BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I)$I$I$MmmrI$I$I$mmЊ5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τd٣d$TȴдETUUUPUUUUUQPUUUT@UUUU@UUU`|0 5+|Usaj,I>,aUsI>ssg€j 57+~~7~~77+|= 5Y Ԁag€= 0ˀa՟ja,$I> 57$0+~~}sss+|I>g€j0 5j 5= sI> 5,$+|+~77~|0j5aˀj5Usg€g€jI>UsI>00j~7~7,$$Yˀs,sjas= 7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I)$I$I$MmmrI$I$I$mm۶`:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VS c\FSmpC!L٣d$TȴдUTUUUUU@UTUUUUQUUPUTUUUUU`Usaˀj,07+|$,$= 5g€0j$Y=b$$$1=Y$ I>7++|$I>a5g€I>+~++|ԁ$ԁbU5Usˀ= Us 5j0+| 5$0g€0= 0Uss$ 5~7|0I>I>I>= +~7 5I>aUsj~|+}ssOO7$I>Us5asg€ssI>aYj$5,I>I>j= g€7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<40I$I$I$I$I$I$mmm$I$I$ImmЊt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\٣d$TȴдUUUUUUUUUUUU@T@T@UUU`a,a0= $$jj= 0$UsaUsI>= 0I>5,I>g€I>0$$0I>a0 57+|7$ˀˀa,sj$՟I>$= $0a0++~|0, 57~~~}7+|j++}s77~|j$~7a~+}sssssss+|as+~~77+|0ag  ˀ= g€UsUs007777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<H0I$I$I$I$I$I$mmm$I$I$ImmmЊFSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSl٣d$TȴдUUUUUUUUUUUUUUUUQUTPETQ@QQUU`ˀs0$0aUs+|aaˀ,I>jjjj 5$= $jjUs= g€5$$Ԁ՟ԁY՟aa000= 00I>aˀ՟=b$I>5ˀ0= = Uss0jj+|j 5j$jUs0+}7$$++|+|jj 5 5| 5+|}s|= 00 5+|$j 5+|0j 5 50= $7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<\0I$I$I$I$I$I&mmrI$I$I$mmmm`pC!Lt%Kc\FSmpd)lkt!:5τe:VD2BT5τe:VBJƹJBJ٣d$TȴдU@T@QPUUPUUUUUU`$$j$7sssssaass+|j7aaassss7s7+}}sssa$00| 5++} 5+|j 5 5+~7sas+|$UsUsj+| 5I>,,$jsOaa7 5jaa$j= = $ 5 5000$$$0j 5+|0a,g€sUsUs7777BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUU^s9s{{{{{{B!B!B!!B!B ƹJBJƹJBJƹJBJƹJBJƹJBJƹ٣d$TȴдUUUPUUUUUUT@PUUUUUUUUUUUUUUUUU`Us= I>s= j$= asˀa 5~|g€,jUsI>ˀI> 5jj$= Us,  j5a$= +|~~| 57++|0Usa,a0}+|j= ˀag€saaa= sUs,s$Y5՟aˀ՟ˀas00= ˀ5Us= I>ag€,aˀˀ5a,sY7777|BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@ 0$I$I$II$I$I$mmmےI$I$I$mmm`JBJƹJBJƹJBJƹJBJƹJBJƹJ٣d$TȴдUUUUAUUDUUUUUUUUUUUUUTUUUUUUUa=b$ 5ˀ՟$=b=b$aj77j$sYI>j 5 5$+|+|= g€aUsg€a= s5I1-Y$b$1-Ԁ$Us$aa,ˀUsI>,a$ 5a0j0sUs,Ԁ$5aaUsa0I> 5 5 5j++|0UsԀ5Ԁ$ 5$$jjaˀ5a$ 5|Us$I>,g€= jj07777 BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@$0$I$I$RI$I$I$mmmI$I$I-mЊBR>[\ c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[٣d$TȴдUQUUUUUUUUUUUUUQUUUUUUUUUUUPUU`I>aˀ5j$+|$= UsUsI>Us$$00g€ja777g€Us,,,UsUsUsag€՟  Yj,a,a5$ Ԁˀ՟$՟Ԁ$YԀˀ$+|7$sj5,g€0$aass$s,g€= = Usaˀ՟jj,g€Us= ˀ,0ag€ssa0g€$+|jI>= aa= = 7777 BUFRb f 2  +,-ZZ!rLEICESTER CENTRE 1% t#StЌ @@<@80 $I$I$RI$I$ImmnI$I$I$mmm`2+k" c*[2+k" c*|#)Ҷ!:|#)ҶD2BT5τe:VD2BT5τe:VD٣d$Tȴд@ `= OXsOXˁtP1-$I1-YIhY1-55Yg€ۺ}V%11}}HtP$%QY Y$ނ}$tPtP[$IÀY,,g€= υg€˂V%[tPÁUυYYU=baOX$OXs50j 5[υaOXOX0= g€5ˀsas 5[= $I>jI>YU[1-ۺ[[7777jBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@P0I$I$I)$I$I$MmmےI$I$I$mЊ2BT5τe:VD2BT5τe:VD2BT5τe:VD2BƹJBJƹJBJ٣d$TȴдUUUUUPQ@UUUUUUUUUTUUUUUUUUUUUUU`I>5ˀԀjˀI>UsI>Us0$j0$I>j$= I>j$++|I> 5+|j$~+|$g€I>a= 0gn6Ԁ՟ˀ,I>0 5= $0,s,g€I>Us= s,,sg€UsUsjj 5 5+}|0,ˀaI>s= I>I>sg€aˀ՟՟sI>jjˀԀ Yg€Usg€a՟5n6b=b$Y1- YUUU$ˀ7777 BUFRb f  2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@d0$I$I$II$I$I$mmmےI$I$I$mmЊƹJBJƹJBJƹJBJƹJBJƹJBJƹ٣d$TȴдUUUUUUUUUUUUEUUPEUUUUUUUUUUTUUUU`g€ԀԁUYbÁbb$UU=b$1-=b=bn6bI1-5՟$$1-1-$a= s,sa55՟5ˀa 5$+|j= = $I>I>I>= a$ 5+~|j+|$ag€Us= Us= 0j= = ,=b$Y$՟Ԁj՟j $՟,asˀjˁ1-$$YjsUs 5+| 5I>Ԁj5,,sasˀg€sg€7777 BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<BUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU^B!B!B!!B!B!B1c1c1c!B!B!B)JPJBJƹJBJƹJBJƹJBJƹJBJƹJ٣d$TȴдUUUUUUUUUUUUUUUUUUU@UUUUPU@`sa00= g€g€I>Usˀ$$= I> 5jj$j0I>aԀ՟I>= 00Usaˀj՟5ԀԀԀI>Us= Us$n6I1- 5a՟Y $$Ԁ՟5aaUsag€ˀjg€= = ~777$I>I>= j0a= UsI>= = = as,0= $+}|$Us|77+~7 5,|= g€g€|7777|BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0$I$I)$I$I$MmmrI$I$I$mmЊBJƹJ1ж5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τd٣d$TȴдUUUU@UUUUUUUUUUDUUUU@UUUUUUUUU`= g€aˀ,g€I>0$= I>Us0Us 5++~7,ˀg€UsUs= g€s,aaI>Ԁ՟YaaaI>= = = I>= $jj$770՟g€a0$$= UssI>j= aUsj}7~~|s5aUsUsaUsI>UsI>,ˀ՟$Y՟$Y1-$$$Y$5,I>I>a,g€a=b7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<,0I$I$I)$I$I$MmmrI$I$I$mmm`:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD٣d$TȴдUUUPUPUUUUUUUUUUUUUUUUUUUUUUUa$jˀ= j 5 500= ~}777+|jj0a0 5j 5~77+| 5g€,saUsUs= = = 0,ˀˀa5ag€g€g€g€saˀg€aUs= = $$I>s,aˀa,Us= I>00= a,g€UsI>Us= I>Us,sg€sa$0 5j$= ,5$՟I>= $= = 0= Us5ssaUs0$= = 07777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<D0I$I$I)$I$I$MmmrI$I$I$mЊ2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VS [٣d$TȴдUUUUUUUAUUPPUUUUUUUUUUUUU`0a՟ˀ$$ 5= $I>,ˀˀaˀs= 5+|js,g€jj 5++|jj= I>I>asg€,j+~}s+~|7+~77777+|0$0+~7|sj  ,g€,s5՟=bU=bY $5j5՟j1-tP $Y1-I$UtPb$,= $= = ,՟$՟I>Us7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<X0 $I$I$I$I$I&mmm$I$I$mmm`2+kd)lktd)lktd)lkΕ :|#)Ҷ!:|#)Ҷ٣d$TȴдUUQUUUUUUUUUUUUUUUUUTUUUUUUUUUU`g€g€I>jԀaUs= +| 50gY,jI>jasa$$Y=bI=bbYԀ՟$՟jYYԀ՟ˀj=b=bn6=bY$  Ԁ,ˀg€g€UsUs0$jaa$0g€ag€a$0+|$ 50j 5 5 5= s $I1-II1-1-$Ԁj$=b՟՟՟Y=bYn6 bbYI1-7777BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUU]{{{s9s9s{{{{{{B!B!:|#)Ҷ!BT5τe:VFBJƹJBJƹJBJƹJBJ٣d$TȴдUUUUUUUUUUUQUUUUUUUUTUUUU@aY$YIn6U1- $$1-btPtP1-1-$՟5g€= = $$Us=b $1-$Un6 j5,I> 5||jjԁYjˀ,Uss,ԀsI> 5jj~777~| 5I>g€,sˀjjԀ$j՟ԀԀ$՟,0$+~|0ˀ,,,UsI>g€j$ 1- $Ԁ 577ss+| 5,Us7777|BUFRb f  2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<PB!B!B!!B!B!B1c1c1d!B!F1c1c1cR ƹJBJƹJBJƹJBJ>[\ c\FSmpC!Lt%Kc\FSmpC!L٣d$TȴдUUUUUUUUUUUUUUU@UUUUUUUAUUUUUU`$jUsԀԀjas$$$$00= I>,a= $j 5jI>,ajb1-$=b$՟j՟Ԁ5jjˀԀ՟jԀ՟5aas$0+~7+|Usg€a,,5Ԁ՟ YYYj5I>$$jI>sj,aˀ$+}ss$+~|j= g€Us= ag€,jԀ$Ԁ,sasUs= = = j0= s7777BUFRb f 2  +,-ZZ!rLEICESTER CENTRE 1% t#StЌ @@<P0I$I$I$I$I$I$mmm$I$I$ImmЊt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\٣d$Tȴд@,@ `s6C#66[OX,ۺυg€a,g€C#C#g€as,ۺ [恘htPO+  $ $υ,,aOX6C#OXC#OXOXC#OXs,,g€[g€[C#66C#[g€,s,s,aa,aaυag€,υ[+tυυ[恥$OۺP,a6j[,aOXg€a7777BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<U\c1g9s9s9ֵkZֵkZֵkZ{{{9s9s9s{{{FSmpJƹJBJƹJBJƹJC R>[\S R>[\٣d$TȴдUUUUUUUUUUUUUUUUUU@UUUUUUUUUa$ $ˀUs= jb,$1-ۺ$[I>0=b=bYb1-$ۺۺ,a5j5YI   ۺ$bIhI$ =bYۺ5$j$hhbb 5jۺYۺ,ˀUs= $}~}~}~}|>bb+k+k}~+k}|0g€Y5j$ˀ0g€,= s,Us,Us[$I>I>Us= ,՟ssg€Us$$ 57777|BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0$I$I$JI$I$I$mmmI$I$I-mЊS R>[\S R>[\S R>[\S S2+k" c*[2+k" c*[٣d$TȴдUUUUUUUUUUUUUUUTUUUUUUUUUU@` 5$g€aˀI>sI>UsUsI>$Us,,,a0$+~~| 5$I>s,ˀˀˀˀaaaa,s,,ss,aajj5aasaa,ˀsg€I>= 57as+|Usg€,sI>I>g€aa0$0j7s~| 505ԀjaUsԁ$1-Y$$IYY5jˀˀa= j0+~77777sBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0 $I$I$RI$I$I$mmmI$I$I-mmЊ2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2*٣d$TȴдQUU@UUUUUUUUUUUUUUUUUUUUUUUUUc+~~7$70jI>j+|0$Uss՟j$7|a5$Ya= a= sˀj$$ˀaag€ԁY՟jԀ$՟ˀ,UsaUsa,ˀԀ555՟j$YY1-b1-jˀaˀˁYU$tP5  $  YYԀԀ5ˀag€I>0$$n6U1-  YԀ՟ $7777sBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<,0 $I$I$RI$I$I$mmm$I$I$[mmmm`k" c*[2+k" c*[2+k"1Е-sN 1Е-sN 1Е1|#)Ҷ!:٣d$TȴдUUUUUUTUUUTQUUUUUUUUUUUUUUUa$U=b$1-՟ԁYԀ$$ԀjUsg€Us7|a~7$Us0I>aI>= Us0j 5jI> 5ssOOsOs~7+||j| 5 5| 5a,a,ssUss5$1-b$Ԁ՟ԁ =b1-$=bbY=b$ Yԁ$1-I$ԀԁY Y$՟Ԁ՟՟5jj5$YUU7777sBUFRb f  2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<D0I$I$I%$I$I$ImmnI$I$I$mmЊ|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|"٣d$TȴдUUUUUUUUUUUUUUUUUUUTUUU@UUUa=b$=b=b=bUI=b1-=b=b1-$   Ԁ1-$YY  I1-U$$IYY j55ԀԁY    $I Y$ ՟a,,aa5՟jja0,ˀ,Us+~|7~7s7}7~+| 5$$$= I>I>sa0I>0 5$+~~~}7՟ԁ  $$$1-7777sBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<X0I$I$I%$I$I$MmmrI$I$I$mmm`)Ҷ!:|#)Ҷ!BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD٣d$TȴдUUUUUUUUEUUUUUQUUUUPUUUUUUUUa $I$1-Y՟jI>a$ˀԁ1-=bYԀ$$$ˀ,,,aa= +|Uss5j,aUsg€Usg€jˀ0$j$a,|0as+|$$I>g€ag€Usjg€ˀg€,UsUs0$$+|I> 5$I>UsUsaUs$00j+| 5ag‚77}ss 5ag€,g€s՟Ԁ5sԁbn6UbI1-Y5a= 7777sBUFRfb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUTD]{{{9s9s9s{{{{{{B!B2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VBJ>[\S R٣d$TȴдDAUUUUUUUUUUUUUUUUUUUU@TUU`j+|+|$+| 5+|00 5j= j$j 5 5jI>5Ԁj$=btPI$՟՟YY $$YY $=b$YԀԁUI1-Y Ԁ$$Y$$$$ $YY $$UUb1-$=b$,UsUs0j}~|s՟a$~777| 5j~7$0[UsUsg€Us7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0$I$I$JI$I$I$mmmܒI$I$I-mmЊ>[\S R>[\S R>[\S R>[\S S2+k" c*[2*٣d$TȴдUUUUUUUUUPUUUUUUUUUUUUUUUUUUUUUT`0[[[,UsUsg€sa,assg€I>Usg€5a,5ˀˀˀ,g€$j 5~7 5g€sˀˀˀ,g€Uss5YY$ۺۺj,[I>Uss,ۺj՟ۺۺYۺ5$ۺjassI>0 5Us0a$ˀ$ 5$,,j=bU1-Yۺ$j$I>,՟jj5,g€,g€g€Us$ 5+|7777UsBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0 $I$I$I$I$I&mmm$I$I$Kmmvm`kC!lktd)lktd)lktd)lktd)2+k" c*[٣d$TȴдUUUUUUUUUUUUUUU@TU@UUU@Uass7+~+|Ussa՟YY  jsaa,$jj 1-,sUsI>I>Usj՟$ˁ ˀsa0sUsUsI>$[ˀۺ5՟5,Us,= g€I>= 77+| 5 5 5as}||jI>Us0++}s0a 5UsˁY$ 1-$՟077$0j7777UsBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@40 $I$I$RI$I$I&mmm$I$I$KmmmЊ2+k" c*[2+k" c*[td)lktd)lktd)lkt٣d$TȴдUUPUUUUUUUUUUUUUUTUUUUUUUUUUU`jI>UsI>0jjsss7+|UsۺhU$ˁ$Ih1-5saY,0I>= = I>[$hh=b$Yۺ,a,5Usˀ,77sas|jUsI>Usg€0I>Us[ˀ5sI>= $j 5|,sY1-=bjۺ5g€g€g€g€Ussg€[Usg€g€g€s$Y=b ja[[[aYˀˀUsUss7777UsBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@L0I$I$I$I$I$I&mmm$I$I$KmЊd)lktd)lktd)lktd)lktd)lktd)٣d$Tȴд@UUT@UUUPUUUUUUUUUUUUUUUUP` 57aOas0UsUs[ss[,0= I> 5+| 57sas$a$՟jۺ$YY$jg€$+~}a|Usj $jˀ5ۺ YY YY=b5Us$$0I>ˀj$$Y$՟ =b$$՟՟1-$5s[ 5Usj5j՟ˀa՟ˀjsUs 5+++|= s7777UsBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@`@"""""""""""#33335UUUUffffffffffffwwwwwwwwwwplktd)lktd)lktd)[\S R>[\S R>٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUTUU@`[5g€UsUs0j$5ˀ,ssa,jag€I>g€՟ۺۺ[I>= $=b=b$ Iۺ,,ˀ՟՟՟ˀj$ $$ۺ՟ۺۺI>= sg€= 0s$[Uaj$1-$h$՟aˁ ۺ5 ItP1-$1-$՟$j5jja5,+~7j[g€sg€,s0 5}7777}BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<BUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_{B!B!B"!B!B!C1c1c1d!B!B!B)JP[\S R>[\S R>[\S R>[\S R>[\S R>[\٣d$TȴдUUTUUUUTUUUUUUUU@UUUUUas= I>+~~77| 5g€as$Uss[+}sss|5՟$YۺI>g€՟g€Usˀˀg€= I>~777+|jUsUsUs,,= I>[s5ag€Us0$~777j0[,= I>,I>= I>$,I>= 0 5}7s0g€,a$$Y $ۺ  ۺj ۺ= 5+}|[77775BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0$I$I$RI$I$I6mmm$I$I$mmЊS R>[\c*[2+kC!Е-sN 1Е-sN 1ж5τe:VD2BT5τd٣d$TȴдEUUU@D@UUUUUUUUUUUUUUUU`Us+|ˁUtPIۺYhU=b=b՟+}77as= 0++| 5|+| 5++}7sassasss7|j 5 5Us= $ 5= ˀ5,ˀa՟Y$Y$$ۺˀjU$[=bj$[ aaˀaI>[g€I>I>0j}77+|, =bI՟ۺ  7777YBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<,0I$I$I)$I$I$MmmrI$I$I$mmm`:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD٣d$TȴдUUUUUUUUUUUUUUUUUUUQUUUUUUUUUUU`a[j+|= $jUsaUsUs,j՟՟jۺY   Y  $ۺ՟j՟ۺ55j՟՟Yjjj$Y=bYۺa5j,ˀ5՟՟ۺۺj՟$$Y$1-=b Y՟jg€= $ 5+| 5 5j$j$I>j5ˀ՟ja[[,ˀ5j՟Y1-=bhU՟5՟$1-IhhhII$Y7777YBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<D0I$I$I)$I$I$MmmےI$I$I$mЊ2BT5τe:VD2BT5τe:VD2BT5τe:VD2BTJBJƹJBJ٣d$TȴдUUUUUUUUUUUTUUUUUEUUUUUUUUUUPAT`ۺ5՟$ 5՟ۺ5$՟ۺs,՟5j55III1-$ۺˀۺۺ1-U[Iˀ,I>0 5++|s UI>0$ 5$j= ˀ,aUsg€sg€Usj= 0|0sY$ˀj 5 5j 5Us0= I>Us= I>= g€ˀssg€՟ˀ5s[sa,Us0j0= = 5 5++|++|$g€Usj+|7777YBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<X0$I$I$II$I$I$mmmI$I$I-mmЊƹJBJƹJBJƹJBJ2+k" c*[2+k" c*[2*٣d$TȴдUUAUUUUUUUUUUUUUUUUUUUUUUUUUUUUc| 5 5jI>OXOXOX[= $ 5}|050I> Ij5ۺ$=bI[[Yυ$h=b=b=b=bh Y 1-$ $ۺ$jˀ,5 [sˀsOXsjO1-ۺg€υυtPOtP$1- ˀg€jIh$5ˀa$ 1-[1-[υg€g€OXI>0$OXI>g€υۺ5jjυj$1-[I7777YBUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUU]k{{{9s9s9p!B!B!BB!B!B!c0k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" ٣d$TȴдUUUUUUUUU@UUUUUUUUUUUUUUUUUUUUUaj5g€s$I>[55jۺ՟j՟՟$ˀˀ,ajg€jas,aaUs+~}7 5 5$I>YhhIIU=bUtPY-HۺY$ H htV%1H-HH--V%ht[tP=btP=b%Q1}ۺ5ajtPh1-1-՟1-ItPYtPY՟$՟ۺa5a577775BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0 $I$I$RI$I$I$mmmI$I$KmmЊc*[2+k" c*[2+k" c*[2+k" c*[2+k" clktd)lk٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUEUUUUUU`ۺIIY$$1-IY$hhII$1- ۺ tPI$ۺjY1-  $tPtPhh[1-5a՟YY՟ajˁ ۺ55[UsUsI> 5$[,sˀg€= sg€ssjۺY,I>= 5+|0h՟as5՟$5I>+}+~7s1-=baI>I>[[0j7777-BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<$0I$I$I$I$I$I&mmm$I$I$KmmmЋtd)lktd)lktd)lktd)lktd)lkt٣d$TȴдUUPUUUUUUUUUUUUUUUUUUUUUUUUU@T`$[g€I>j= 0I>~~7[jjg€= ˀs[$,[s,,asg€0 5 50= s,g€[I>[,,[aˀg€[s[0jj 5 5++|$Usˀˀˀ՟ۺۺۺYY$ۺ5ۺۺ՟5ۺjˀY [j= 5,ˀ5$j,g€UsaUs[[g€0j0I>0 50j$= ++|gƒ+|7777-BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<<0I$I$I$I$I$I&mmm$I$I$KmЊd)lktd)lktd)lktd)lktd)lktd)٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUb}|I>jaj5jj5aI>0$I> 5+|j 5j$[5aI>,aˀ5$Yjs,asˀ,sI>s, 5sˀas[s,hY-H-ÁtPhI$[=b$$՟ˀjaˀ,5a[0Usg€g€gƒ+~|j[,[= 5~+|j 5 5[UsI>jg€$sa0 57|s7777-BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<P0I$I$I$I$I$I&mmm$I$I$[mmЊlktd)lktd)lktd)lkN 1Е-sN 1Е-s٣d$TȴдPUUUUUUUUUUUUUUUUUUUUb77+~~77s7777sassasss7 5= 7+~7+~| 50g€a,sag€UsUsI>g€ˀ,as0Usg€= j$= ,՟sˀss5ۺ5,I>00j 5$$g€ۺ5ˀˀ5՟$$U=b1-Yg€aۺ5,I>s[I>s7777-BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<d0I$I$I$I$I$I6mmm$I$I$[mmm`N 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1Е-te:VD٣d$TȴдUUUUUUUUUUUUUUUUTUUUUUUUUUUUUT`$ ՟$a,sg€aj$=b=bY$՟ۺY1-ۺ՟՟ˀ,5aI>[sۺ$5,,,ˀˀI1-$՟sg€,I>= $g€sUs++|j 500Us5$1- $jۺY[恽Ha= $= ,s5$Y,jjj, 5g€0$j 5007ss7777-BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUUUUUUU_{{{B!B!B!!B!B!B1c1c1c!B!@2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VBJƹJBJ٣d$TȴдUUUUUUUUUUAUUUUAQUUU@QUUa| 5,aaag€g€I>I> 5 5 5= [= 0I>jI>ssUs[ag€ 50= jj$j 5++|0+|ۺ՟ˀg€g€Us= [g€[5g€5ˀsj++|j$+|j$[as= 0j[= ag€0}ssasa7~~~|$[[|j+}sg€՟Yas0$77775BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0$I$I$RI$I$I$mmmI$I$I-mmЊƹJBK2+k" c*[2+k" c*[2+k" c*[2+k" c*[2*٣d$TȴдQTUUUUUUUUUUUUUUUUUUUUUUEUUUU`$j+|= = = j+~~77}s7I>a= jg€j,,j՟ۺ,,ˀa[$= I>ۺjg€aj,saaۺ ۺˀI>I>a$0I>j= g€ۺ՟as[[g€g€s[Uss,[sa  $$[=bg€I>$ 5 5= = Us[ag€[= 0= $0 5|0jj0jjj 5 5$ 5jg€7777~BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<(0 $I$I$RI$I$I$mmmI$I$I-mmv`k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" ٣d$TȴдEUUTUUUUUUUUUUUUUUUUUUUUUUUUUUU`,+|0[sUsg€,g€5 5j+|j 5= 0[$ۺasI>I>[,a5ۺۺg€+|7+|j 5 5= j00 5 5j00 5jaYj,ˀ5,0[a= I>-[I=bYY1-=bg€= sI>[I>g€,,Us,sUs,Us= = ,$0ˀˀg€0= [I>= Yۺ՟as [$0[7777~BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0 $I$I$RI$I$I$mmmI$I$ImmЊc*[2+k" c*[2+k" c*[2+k" c*[2+k" cKc\FSmpC!Lt%Kc\٣d$TȴдUUUUUUUUUU@UUUUUUUUUUUUUUTUU`ۺI$ۺjUsI>YI$ a5,,aUs0= = ˀsj,g€0$= = $ 5I> 5~7}s77 5$0sj$= I>000jj= 0$[5՟a= g€I>[[Us,sUsg€s,= asaˀ  $ۺ,ˀ,[g€s,[a0 5++}+~7+| 5I>s,g€g€= Ussg€7777~BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<T0I$I$I$I$I$I$mmm$I$I$ImmmЊFSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSl٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUPUUUUUUU`g€sˀ= s0Us= jۺˀ,555g€[$$I>0I>I>0,ۺ  ۺˀssY1-[[恥$UۺjI>= Us= [Usg€ۺUj=b1-$Yۺ$=bUs0= 0I>[j 5jI>jg€$0= I>sˀjjۺ=bIa 5+~~~7~7 5j 5jjjj$I>s՟$$Yˀ5,, ˀI>UsI>7777~BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUU\ZֵkZֵkZֵo{{{9s9s9w{{{ހ!BpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!L٣d$TȴдPUUUUUUUUUUUUUUUUUUUUUUUUU`[ 5+~7=  ۺY$1-1- ۺˀs= +}+|0,a,,g€$= [g€aaI>$$ 5jsaˀ55ˀ55j$Y$jˀaa0 50 5= ˀ5ۺۺ5ˀˀ,[sas= I>$jj$j0jj|j0g€sg€sg€Us= sUs= 0$00[՟՟ˀsˀg€a77775BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0I$I$I$I$I$I$mmm$I$I$[mmЊt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%KcN 1Е-sN 1Е-s٣d$TȴдUUUUUUUQQUUUUUUUUUUUUUUUUUUUUUUU`sj 5$j= j$s[UsUsI>000$0,j$$= I>g€I>j+| 5 5| 5UsˁYU1-s,I>$0a=b՟՟1-j՟Y՟ Us$s[jsY jaUsU=bI,5s5$jjjjjsag€jY=bU$Yۺj$jj՟$I5[g€[g€,5ۺۺ7777 BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0I$I$I$I$I$I6mmm$I$I$[mmmN 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1Е-sN٣d$TȴдUUQUUUUUUEUUUUUUUUUTUUUUTPUUU@`ۺ,[$= jj|$j= g€aag€[g€g€g€[Usg€s[[= 0I>0 5$+| 5+| 5= g€UsI>I>[g€g€0Us$0[Us0 5jg€՟՟ۺۺ55g€[I>0$[sYY$jUs+|j[s՟՟j5ˀ5j՟j51-1-57$|g€assUs[Us[Us5as,[,0+}|7777 BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@40I$I$I%$I$I$ImmnI$I$I$mЊ:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:T٣d$TȴдUUUUUUUUUUUUUUUUUUUUQUEUUUUUUUUU`$j$1-tP$$5sj,$[$ۺˀ,,[ˀۺg€saa[[sjۺ ۺۺjˀj5a ۺs= $I>$Us$ 5$I>aۺI[=b$ˀ,a՟Ya 5j 5+| 5$00$+|I>՟=b[a$$$ U[ۺ,[[[jI>g€= I>I>ssa՟jۺj=bII>7777 BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@H0I$I$I)$I$I$MmmrI$I$I$mmЊ5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τd٣d$TȴдUUUUUUUUUUUUUUUUQUUUUUUUUUUPE`= ,g€I>= sUs$0UsUsI>I>05ۺ $Us= jj$$j= g€$jjI>= [s5sj5,aa,asI>$Usg€g€s,Us= = 0$$$ 5|= ,, 5|$= = $+| 5 5Usg€Ussg€I>I>ˀ5= 0I>= 5j$j$ 5jjjsg€5$Yۺj[77+~~7| 57777 BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@\0I$I$I)$I$I$MmmrI$I$I$mmm`:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD٣d$TȴдUUUUUUUUUUUU@UAU@U@UUUUUU`j= ,aI> 5$YI=b$  Yۺ,Us[g€a,[jUs,sI>= ,[,YYYa,,sI>g€g€,sj 5+~}+~7~|j$0I>0 5~7+|j= $0jUsssss7I>= s$ 5+~~+|+++| 5= }7+|jUs= jj= sg€Us[g€g€Usg€= UssUsI>= 07777 BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<BUUUUUUUUUUUUUU^s9s9s{{{{{{B!B!D!B!B 2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2D#)Ҷ!:|"٣d$TȴдUUUUUUUUUUUTU@UUUUPUPUUUU`0 5j= = I>,,ˀ,= [= $,00,I>Us[Usˀ$j$j+}}~77~7j$I>,a՟ۺjsˀs 5 5 5+|= jI>sa= as 50I>$= $$5$$55saaۺg€ 5+++|jUsUsUs0$+}| 5+|Us5aˀjaUsjۺ$1-1-77775BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUU P!B!B!D!B!B!B1c1c1cB!B!B! R)K{{1)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:|#)Ҷ!:5τe:VD٣d$TȴдUUUUATUTTUUUUUUUUUUUPUUUa ՟ۺs= 50 5I>Us[[I>0j$++|= +|j= aaI>}a+~~|+| 5 5$$~+|= g€$$j 5+|$[0+}s~|$= Us[s a՟$aa,5ˀs,UsI>j$j0$0$sۺ՟50sa[ 5$$g€Us$0j7|$= jUsg€,g€00I>s77775BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UU]kZֵkZֵkZ{{{9s9s9s{{{{{{2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT٣d$TȴдUUUUUUUUUPUUUUUUUUUUUUUUUUUU@`g€I>I>= [= UsI>j00[g€j5ˀۺj0j 5|j$UsI>j 5 5j0I>s,[sasss7j0Us= g€5a= = $I>[ۺˁYIs0g€՟s[s[[[Us 5j= = 5 500j= [jaaˀ,g€g€g€,,[,Us0jUs= Usssg€,U5$s[jaOss77775BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I)$I$I$MmmrI$I$I$mmЊ5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τd٣d$Tȴд !B!BB!@! !B!B!B!aH$Hn6$n6n6bZbZcctbZzz$HHcg€g€gƒbZtbZHtg€tbZH$zz$n6t[$Pυۺ,a tPé $aacbZbZbZˀ5ۺPsgƒtg‚bZˀag‚ccbZHz$$zn6HttHgƒtbZHn6n6n6,$$abZn6Hˀ,  Yۺۺυˀ5ˀ5Pas7777sBUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I)$I$I$MmmrI$I$I$mmm`:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT9JBJƹJ٣d$TȴдB!B! B!B!B!B!B!B!B!`P$[恀tPOC| ۺ$,cctHHctbZbZbZtbZn6$$$n6n6n6Hn6n6n6n6n6bZsbZHbZn6n6$$n6bZO=b1-1-[=b$P,a$[=bY1-ˀsgHHcztss,5$ۺۺˀY,$[1-Y$Y 1-1-=b$υ5t,aaˀaˀgƒctcn6z7777sBUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<00$I$I$II$I$I$mmmےI$I$I$mЊBJƹJBJƹJBJƹJBJƹJBJƹJBJ٣d$TȴдPUUUUUUUUUPUUUUUUUUUUUUUUUTUU`a 5$$ 5}Usjg€a5,ۺja55ˀ,sg€g€s[sI>Usg€5Y=b$$$j[sUs 5}0UsI>Us[a[ 5$= 0$$[= I>ˁ =b[sg€,Us0+||$$ 50$$ssUs,ssI>UsI>Usss[= j0$= I>,g€,ˀˀg€, 5$= s5s[Usg€7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<D0$I$I$II$I$I$mmmےI$I$I$mmЊƹJBJƹJBJƹJBJƹJBJƹJBJƹ٣d$TȴдUUTTUUTUUUUU@UQUUUUUT`I>= a5a,5 ۺ$~7ssss|$I>0j 5+|0j 5= Us0[I>g€aUs+| 5+|$s[Usg€ 50$7}s[,as0$0 5$ 500 5+~|UsI>$= = Us|jI>aaa[= $0$$ 5|+}s7[[s՟ۺۺjˀsI>0 5ssssaas7777BUFRb f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<X0$I$I$II$I$I$mmmܒI$I$I%mmn`JBJƹJBR>[\S R>[\S R>[\S R>[\٣d$TȴдUUUUUUUUUUUUUUUPUAUUUQUUUUUas77as|j0UsUs$I>[0 5[g€sۺ՟՟ˀ,Usg€$Usssj[= 0j0aUs 5$$I> 50[g€,,jI>= 0j$0= [= = = 0= Usj}ss 5= Us[= 5++|$j00$I>$՟asUs0$$+|000I>I>0Us 5 5| 5jI>5ۺ՟s,ˀˀˀ,7777BUFR&b f2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUU]{{|9s9s9s{{{{{{B!BS R>[\S R>[\S R>[\S R>[\S R>[\S*[٣d$TȴдUUQUUU@PQUUUUUUUUUUUUUUU`,sg€= $ 5j00j+| 5+|I>j$$ۺۺ՟jˀ,[I>= I>0+~7|7+~+|}sas7+~777+|$= = +|Us 5,,[[I>0000I>UsUsˀۺIhUYۺˀˀjۺ$I[UsI>Usg€s,,a=bYhۺ,g€ 5UsUs0I>sI>77775BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0 $I$I$RI$I$I$mmmI$I$I-mmЊ2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2*٣d$TȴдUUUUUUUUUUUUUUUUTQTUUTTTT`= = UsaۺYY՟U$Y՟՟Y$I$՟g€Us[sj0Us1-=btP[ ۺjjjjjj0Us00I>j$j$j= ՟ۺˀUssg€g€I>= $ 5 57as7$+|$ 5 5 5+}7+|= ss[I>Us 5$0j0I>+~77aOaaaaUs= $+~77~| 5 5+| 57777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0 $I$I$RI$I$I$mmmI$I$I-mmv`k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" ٣d$TȴдTU@UUUUUUUUUUUUUUTUUb7sjUsI> 5+~~~7++++| 5 5jI>$}sass7jI>$ 5$$ 5 5 5 5 5I>,UsI>[g€ˀ5ˀ5=b՟IItPY $1-5Usj= g€g€[0,s,I>$0+|$ 50a,,= Us~7s7s7s} 5 5Us[Us00+|~+}s7j7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@40 $I$I$RI$I$I$mmmI$I$I-mЊc*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[٣d$TȴдUEUUTUQUE@UUUUUUUUUUQEUUUUUUUT`g€= 5| 5$$Usssa5g€,sI>$7+~|0Usg€Us00j+| 5 5$j 5$+| 5Us 5ass$sg€s[[[Us[g€sa=b-tP Yjj$=b=bjg€I>Us00g€a՟aUs0 5 5sjUs,,,,ss,aˀg€g€Us$ 5 5[0= [UsUsg€[[= 0$Us$j+|7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@H0 $I$I$RI$I$I$mmm$I$I$ImmmЊ2+k" c*[2+k" c*[2+k" c+c\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSl٣d$Tȴд!B!B!B!BBB!B !BBB!B!cttsg€aaˀˀۺ$g€gƒcbZcbZbZHbZbZs$$υˀa,aˀs5ˀacctts,tccbZHn6$n6$$HtaPsg€,aˀˀˀaaastt$z$$a5agƒtbZcaˀg‚cbZbZ$zn6n6bZsaˀa,,saˀ55ˀsg€7777>BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@\0I$I$I$I$I$I$mmm$I$I$Immm۶`pC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!L٣d$Tȴд!B!B!B!B!B!!@!B!B!B!B!B!!`atcttPO$υ5Pυۺ$C|YO1-Yۺ551-Pۺ5ˀˀˀg€,,aˁYˀˀbZn6Hg€g€sn6Hn6zz$HbZbZbZn6tHn6zzHg€ۺۺˀaaaPۺPP5555$bZˀυυ5ˀ,sg€,ˀυˀPttg€g€,5$$7777>BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<BUUUUUUUUUUUUUUUUUUUUU^s9s9w{{{ހ!B!B!BB!B!B! c1c0t%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\٣d$TȴдUUUUPUUUUUUUUUTQQ@UUUEP@TU`5[= j 5j0$aa,g€sss= +}a|$I>ssUsj 5 5[sag€I>I>s[g€I>s,aˀˀ՟ag€I>Us$$0g€UsI>$Us= 7aI>= 0$+|= $$+| 57+},aI>$ 50,a0I>UsI>j$j+|$0$j~|7s7aaOas|I>j= | 5j77775BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$I&mmm$I$I$KmmmЊFSmpC!Lt%Kc\FSmpC!Lt)lktd)lktd)lktd)lkt٣d$TȴдUUUUUUUUEUPUTEUUUUUUUUU@@`= ,[1-[=bj5$$I>$I>g€5aI>I>0$ 5j$Usag€g€Us 5$0+|j$0 5= [g€07ss|0= g€g€= 5|= 7[= j[ssUs= Us$~| 5I>a$Y=b$$1- ,sUss= 5 5$+|0Us$aˀUs[[g€Us0 5}sOOj 57aOasasss}s7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<(0I$I$I$I$I$I&mmm$I$I$KmЊd)lktd)lktd)lktd)lktd)lktd)٣d$TȴдUEUUUUUUQUAUUUUUUUUUUUasaOOassasss|+~~~~}OOs$= 5 5 5j 5+| 5 5$= [g€000saOas+| 5 5 5 500$= $ 5 5j+| 5$ 5jj$~|j0՟a՟ ՟ag€g€0= 0 5 50= [ssUs 500g€$jjˀa,I>$Usa՟ 7777BUFRb f  2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<<0I$I$I$I$I$I&mmm$I$I$[mmЊlktd)lktd)lktd)lktd)sN 1Е-s٣d$TȴдUUU@UUUUTUTQUUUUUUUUUUUUUUUajsˀs0g€՟5,[j7+++| 500= I>Us= jj 5$ 50ˀ5a[j}aaaa}$$$I>UsUs0+|$+|$sa՟5g€[[Ussaۺ$[$ $ۺˀa[[ˀ5՟ $jۺ1-$ $$j5jۺ՟[sasaajۺj՟ˀj՟$7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<P0I$I$I$I$I$I6mmm$I$I$[mmmN 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1Е-sN٣d$TȴдU@UUUUUUUUUUUUUUUUUUUUQUEPQUU`ۺ՟s0 5+~77sa|= saˀUs= = I>Ussˀag€UsI>0j$0= saۺY$asg€aaˀˀass[I>[Us[I>,Usa00$= = aY$$ tPˀˀˀg€,g€,,g€, 50s0I>[g€Us 5+|j[I>j|$$~~| 5= $$ 5+| 5~| 5= I>[[[sۺˀ7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<h0I$I$I$I$I$I6mmm$I$I$[mЊ 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1Е-sN 1٣d$TȴдUUUUUUUUUUUAUUUU@UUUUUUUUUPT`jg€5՟Ih՟5՟jˁ1-ۺjۺۺ՟ۺ5$g€as[[[g€000[g€[ 5+~~+|++| 5I>s[sg€sg€$0I>ssI> 5 5+~77~~77+|I>,sa[= Usg€saj5ˀ5j,,[s[Usg€g€Ussg€UsUs[,,ˀ5jjI>,[++| 57+|7777BUFR&b f  2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUUUUUUUUUUUUUUUUUUUUU_{{!B!B!!B!B!B1c1c1cB!B!@-sN 1Е-sN 1Ж5τe:VD2BT5τe:VD2BT5τe:VD2BT5τd٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU`a7 5I>ˀUsj$Y Yۺ՟jYYۺ՟jۺۺ՟՟Yۺ= j0$$7~~7 5[,asaassg€g€,s,s,a5ˀ5Yۺ՟j՟ۺYY$ Y ۺ$ۺ՟5g€g€[[[g€,ˀۺ[00$I>$Y$$Yg€sg€Us0 5j= =bh 5ass$ $77775BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I)$I$I$MmmrI$I$I$mmm`:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD٣d$TȴдUUEUUUUUUUUUUAUUUUUUUUUUUUUUUUUUa$ Yg€= j|= I>UsUsUsg€ss՟$$$ۺjsaI>I>g€aag€g€Us= Us= I>UsUsI>I>[[I>I>++| 5$$UsY$$ۺY$$IIYY՟ $as00 50,=b=bII՟55$ $՟aj$ۺjj[0[5$ˀˀaY$Yۺۺ5ˀg€,s7777€BUFRb f 2  +,-ZZ!bLEICESTER CENTRE 1% t#StЌ @@<,0I$I$I)$I$I$MmmrI$I$I$mЊ2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT5τe:VD2BT٣d$Tȴд@\υ$&\\7u~ (AY E+|] w[悓.&\ '0 '0Uc Y$ReGb$> `O-aaUw@/M`@@= I>?x6X@jzkbZlw@I>|$n '0$Z(A1-V~ '~$Rezaυ$IW02ZmYI @1PLK@d@sYUB@ = d@5t&\ L= j՟zk% Xp#`3@ۺ?V~B@*f;ˀj7777BUFRb f  2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<@0I$I$II$I$I$mmmےI$I$I$mmЊ5τe:VD2BVƹJBJƹJBJƹJBJƹJBJƹ٣d$TȴдUUUUUUUU@UUUUUUUUUUUUUUUUUUUUU`5ˀ,j $$5sg€[OX= $$ 50j0g€s[g€[,,sOX00 5}~+k}|>,>,> 5= $$$1-$$ j5YY[[g€jsj$= OXaY$1-1-$Y[恀[I1- υO$υ$$1-I=bO=b=b$=b$ Yυ55ˀaaajۺjaaj555jۺ7777€BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<T0$I$I$II$I$I$mmmےI$I$I$mmm`JBJƹJBJƹJBJƹJBJƹJBJƹJ٣d$TȴдUUUUUTUUUUUUUUUUUUUUUUUUUUUUU`՟= j,,aI>7+|I>saUs0UsUsUss,ˀg€sUs7s7$=bYYYۺ$ UUhPh1-՟5ˀj=b=b Y$$Y ۺYYjjˀˀ5ۺ$$ۺjۺ$I$Y$՟$$5g€aag€g€ˀjjjj՟jۺ $5ˀ՟jˀˀj7777€BUFR&b f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<UUUUUUUUU]kZֵkZֵkZ{{{9s9s9s{{{!B!BBJƹJBJƹJBJ>[\S S2+k" c*[2+k" c*[٣d$TȴдUUUUUUEUUUUUUUUUUUUUUUUUUUUUUUU`Y1-1-$YYYYY $jˀˀsˀ+| 5 5+|$= [g€= = UsI>= I>[I>UsI>00jj0g€ۺ=bI=bۺ՟$ U$jˀa,,,jYۺۺۺۺ$YY $$$$$$Y1-I$՟՟՟jY$U   1-$1-$ۺ՟5j$tPtP1-$77775BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0 $I$I$RI$I$I$mmm$I$I$ImmmЊ2+k" c*[2+k" c*[2+kC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSl٣d$TȴдUUUUUUUUUUUUUUUUUUUUTUUUUUUUUUU `$Y$Y=bC|C|1-$$1-[[$YY Y$C|OC|$$1-Y$PPυYۺ $υυۺ $ۺˀa[ 50$ 5$j[OXag€,g€s5C|1-$  ۺۺ˂H}h-H|OXP5a[g€C#$$$YP5ˀ5aˀg€,ˀPY=bh$Y=b1-=b PυPP7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<0I$I$I$I$I$I$mmm$I$I$Immm۶`pC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!Lt%Kc\FSmpC!L٣d$TȴдUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU `ˀsaˀ5ۺۺPˀ5υ1-1-YY$υsH~6OX5υ,PYυ Yۺυυ$$Y$υPPPˀPۺυ 1-=bC|Y ۺۺυۺυPaˀP $$551-tPI$υυPOXC#g€ˀˀg€OX= = C#C#C#OXg€g€s= $j$[5Y 1-7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<40I$II$I$I$mmmI$I$I-mmv`t%Kc\FSƹJBJ2+k" c*[2+k" c*[2+k" c*[2+k" ٣d$TȴдUUUUUUUUUUUUUUUUUPUUUUUUUUUUTaO[1-$$υυY$Y$j5jˀυY Yۺjj5ˀ,,g€[= ,a5ۺ$YO[[tPtPhO$ۺ5,g€[[[saj[,5a[= = [sOX0~}| 5I>}~}|aOX$[I1- jˀ[g€aOXOX$OX= I>sυ$ 5g€a5ˀυ $ItP=bυg€I>$}tP>tPtP7777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<L0 $I$I$RI$I$I$mmmI$I$I-mЊc*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" c*[٣d$TȴдUUUUUUUUUUUUUUUUUUUUUQUUPUUc+|0g€ˀ[I>I>sۺ=b=b=btPI ÁtP=b=bI1-[恘$U1-=b$$U[1- ۺ՟,ˀ5 1-h1-=b   =bUI$1-Y1-Yۺ,$j[a5Us[,ˀI>[ˀg€Us$j 5$+|aasjj$0= 0UsI>g€= j 5~~~|aaass+|= 0aUs= Us57777BUFRb f 2  +,-ZZ!LEICESTER CENTRE 1% t#StЌ @@<`0 $I$I$RI$I$I$mmmI$I$I-mmЊ2+k" c*[2+k" c*[2+k" c*[2+k" c*[2+k" cKc\FSl٣d$TȴдUT@U@U@UUUUUUUUUUPUUUPUUUU`jˀjjj 5~~||j+}7$,5$[7+~~7| 5[s$0$}7+~~7= aj՟,,[ssa$$=b$=b1- $$jj՟YY$$YY$$Yj5ˀ,[gƒ+~}77+|jjjj$= $$0I>I>Us[I>$0$}+|= 1- ۺjjUsjۺ7777BUFRb f 21  +,-ZZ!<LEICESTER CENTRE 1% t#StЌ @@<t!UUUUUV"S R>[\S R>[\F!H ii8*P0@@K@F0BF0X>O 5$@KX>*^sd@X@jj 5j*F0 'F0K>$j 5 5F0F0sss,z* 57777dballe-5.18/extra/bufr/synotemp.bufr0000644000175000017500000000073211173330007014427 00000000000000BUFR2be A A!w6| «;@ N %Zk^>ꖥ sFLb<  ƌQ/7A>q>UM ?H*=|gx_ '+_0Œr̀d / 4PPTZhu <RA@ OY,@\g%`Fp ;0_X#;`/ Px8'?_d 3lˌ p_P| Z .oT-| x0`pÄ8L 8p388pÄ8L3 &d@UcF4hѣF4hѣF\hѣK4jQF5(ңFiQFJ4ѣF4hѣR4hѩF4hԣF4iFhѣFJ4hѣF4hѣK4ѣK4ѣK4ѣK4ѣK4ѣR4hѥƍ\hѥƍ\hѥƍ\hѥƍ\hѥƍ\hѥƍ\hѥƍhѣF.4hF4ѣK4ѣK4ѣK4ѣK4ѣK5(ѣF\hѥƍ\hѥƍ\hѥƍ\hѥƍ\hѥƍhѣF.4hF.4hF0߿~߿P`I׀tTH( ?x r7777dballe-5.18/extra/bufr/C05060.bufr0000644000175000017500000000345411430263512013334 00000000000000BUFR,P  4QRC_`a=<  w:b\q WPG*Dk{cQ*C{ziP  *C|e Q*hC|e>Z*{(N#pZ J*ȕRmYC d~*ZgH4 Pfq*[gG<0 gl*\#g{G , u *Hasc MSx(Q*(c b RPF*ȕgakDt Ћ]*j+_9d _*ȕj_k8l P^{*hm[` Pّ*u3YL P+*(Vb#rvQ*蕋P   Q*(MЃ  *[J< ) x*HkHzĔx Q; '/*(GQ= 4*hGBL [*CCQm P*K>줐Q *y9 dђ Q*qH+5Z`Q Q*U)"|Q ㅜQ*P(R m*EL< Ɔf*46l g*47kbl* *.h@2|d5 v*(ȖH tX *c` Q* His<?)Ȗ}bPG)BZ P)ȖDxR֑)H"bیR۠)(Rל)ψl c[)h|PV)J|g )"j4 Q)iUzp!S )Zȗfrt S  )>}򡼠&ЉQ)5ȗrĤ( ) ȗ2'q W(戗zrd*nZ(ȗz"\d+TF ('ҠKf  >(Ip |TTlI(;(~bRT Q( 蘵zld>ԜX( Hڪu@7(hҥruLD=TQ( șjd3VQ'@ڞc<0'  c'HHʞBc$)Tߌq(Qrd,- ˑ(b]L<-~< (@((ڞP7U& (ULBZQ< (t(yʢP4@(({BP,L4̠)({ZP4jcR5XjUV4hѣF4hѣF4`7777dballe-5.18/extra/bufr/obs2-101.16.bufr0000644000175000017500000000270011173330007014137 00000000000000BUFRbe  4e}KyCLcH08221 yyFA A!Rn[A  VqI_U|(I-)`@'nUF.;ΕX>6z*تo 6d/X@ `ccЌgH0;:DLR#`js L+do` T2U(bʇ ct\Dz_X #h0v!j@/ w 2-`_0OS}@N"Id=L*\F I;s_( PbP2P/$n່p`FH@WoMu  P A6ޠ%/88=W!Z A&|AA<_ 7 "B /$Y<  \NQ@'_ x/> PR߲ 2:@Á _< l xBt S8O0`8ppgp38 p3p8p38 À8p8p XѣF4hѣF4ѣF4hԣJ4iqF.4hѥƍ5(ңF\hѥƍ4ѣK4ѣR*4hѥƍ|hѣF.4hѥƍ4ѣF4iqF4iqF.4hF\hѩF4hF.4hF\hѩF4hF.4hF.4hѥƍ\hѩF4hF.4hF.4hѥƍiQF.4hѥƍ\hѩF4hF>4hѣF4iqF4jQF4ѣK4ѣF\hѥƍ\hѥƍ4ѣK5(ңF\hѥƍ\hѣK4ѣK5(ңF\hѥƍ\hѥƍ\hѥƍiQF.4hF.4hF.4hF|hѣF7777dballe-5.18/extra/bufr/ed4-compr-string.bufr0000644000175000017500000000101411426474546015663 00000000000000BUFR ^   P <@BԵɋ*Ȫj*)()IH(*I d ʉ* 舩h ʉ* iH*d ʉ*)D 興*DH#쁀U#(C`P&"x}O_'Hs؆5 lU@5 AM@+39Aǽ@0 B q>AJahE('VJPR0Zɹ\O?~>??@? @?|S*2H?????7777dballe-5.18/extra/bufr/ed4-parseerror1.bufr0000644000175000017500000000163711426474622015512 00000000000000BUFR  !Z#$/0%+,A-.\PL  -" / ‘`4CsK\{?2? On/,БUQSGȀ?ue!å?~}'HŨI) )ʅ)*J ctPb1S<:}??RG >+ $TU"4Ud4Ep1HQR }om{GߣGD :*Jb 8[5(ɾd8q.?#OT# 7777dballe-5.18/extra/bufr/tempforecast.bufr0000644000175000017500000000336211430500575015254 00000000000000BUFR  f                                                                                                                                                                                                                                                                                           ntemp P@ @΀Bi@`_S0P ;"$a((0 PgDc @ 8r'm0n0aH\QdZ1>HoM(@mA4# .%Pau0raWCq'TcHP1pI`K @p8` PX=cpӀ-?iP?R3}hE@HQ!pG>_@hPP a "@FZ ,Q Y4 i O=ibDxl>B P 2d &@No#Q\H@i@B tQ!E@H +쑬pIB7777dballe-5.18/extra/bufr/test-temp1.bufr0000644000175000017500000000252611173330007014557 00000000000000BUFRVbe  4e}KyIpo206181 Vyy, (D = >A A! Z[0.y(z6 N ?\h){«2?,/"@x4JP _ӝm¤ UMr@=}YMݦ ku70@xl i`Q#3IsWܪ@= ʯxq0q0FM0ɒ N,_##<343&6O~/@-ѽPZ6 D6FYI8PKR1wO ] v >s(4ApH* @B] R(%{m-o/'$/L<9WW}0jtn(b҂1_Z J A@iB8((Hw5J9\ި*%?;_K| T K_i|BSO ``d 1?{¨ _(xTͼ/&=_P/*hq| _4Qh!ܧ)~'q+J U0"` 0` 38  `8pg8p38 `p@@eF4hѣF4hѣF4jQF4ѣF4jQF4ѣF4hF\hѣK4jQF4ѣF4hԣJ4iqF4iqF.4hѥƍ\hѣK5(ңF\hѥƍ4ѣK4iqF.4hԣJ4iqF4hFiQFJ4ѣF4hԣJ4iqF4hF4jQF4ѣF4hF\hѥƍ5(ңF\hѥƍ\hѥƍiQF>4hѣF4hFJ4ѣF4hF.4hԣ 4iqF.4hF.4hԣJ4iqF4hF\hѥƍ5(ңF\hѣK4ѣF4iqF4h7777dballe-5.18/extra/bufr/temp-bad4.bufr0000644000175000017500000000130111526441565014335 00000000000000BUFR  4PջړP*N`L?8+yTo$<t4uL/i+``1?^dF%<8? ?_\$jt(H yvjn 7777 dballe-5.18/extra/bufr/synop-groundtemp.bufr0000644000175000017500000001110011432770155016104 00000000000000ISID11 EDZW 030900 BUFR&N  P2302/B=g|N 8Cjg=,w.8=GpO@@b P+%?@cK 1c8@n#A @D=Od5ֵ` ?i@??R?GL<ߣ566W7vrp4܈HN) 5{_kkV_|@&=HHj? >Dtp2G?(7Fehmarn _gH Ȏ&8|t? _X 7#\a???W?G KLAaaߣ4'W&rgV6'VWGFVp4+lHyi:|lkz%?| >? #HHk?0 Qt.G?(Schwerin _gH D$#Eu? /\a|??GaW0_?G?#nLFߣ⋄w&Vg7vBp44Iss|kqj۵%eQ*( h4O!?~ 8'F?NG i7-w}4~qP?@?OoX1, 44~8[Y[i '!!j?:_@j?? 5?d`aߣJG'2:84sLgNa;CC^ Yݿ(PG? @@W =F?JC ss{+8@lZ$-A`3d68Ga#eC a|??bW?G_*LP86ߣ▔vFV'W&rp4IjS/)\|kkt+?|(8n#OShUL'  `(5p5o%1ɜ} 6?CNoߟ2ڳm܍B!HGpS/@@T =F ?/!L#++c#{18@k+#%d7 ]`2d`a??혡W0?G_*GLPoߣd76Vp4ךtHDZiM~Olkإa?p7#O_J]`  @!*U1饜MՑ老} 5UdSl2 cCxL0GO@@Y @U(w?OB#+#+qj[c{ӛC)8@kL$AŤӽod5۵TR(@X򅀂@:jO?5, ?e;b0ߣ"T W':1:30;2/dr:Hl"NI9Chgn`w{$84 @ז:  HHk? >at8G?*$Meiningen _gH g`Bh!N>w' X `pt??Z (?G*'LZOAOߣg&gW'Bp4ձG@\~ml^d?|F 8ǯa?~ '-OؠΘ _GU  i3Ēd lĹjOբ8_A B0`?!?O]1, T~]\ QX\[N} "%?!%.7?80 }??#?RG/wLdGߣ⯴VW&&W&rp4H|g}kk}C5 A(ڇ?~ L'A7ΘGbnL.M-iؒoUCO21w ~ 'SՏc}p釀<~$$V@@@@@@@@@@@@gI0D?*|/ U-NX?A"<@f$#OEqH   U%3Xpm-ѕ} 4&Y`D9S2k(7_AOh?4-?JD?<OX 1@ ~7777 dballe-5.18/extra/bufr/gts-acars2.bufr0000644000175000017500000000025211635347612014531 00000000000000BUFRN  4 ;)$<!"@  g B K L % ' M*+,-)>FA!:8FJCYR4RA,N5&I?C5"`7777dballe-5.18/extra/bufr/obs1-11.16.bufr0000644000175000017500000000030611173330007014056 00000000000000BUFRb   4 }Ky@4aFXDHDE y*ydF  ŖA" A"!XDHDE C+[rlxkV o/[ ѣF4h,F6|h&ƥV4jԫVhр7777dballe-5.18/extra/bufr/obs2-91.2.bufr0000644000175000017500000000065411173330007014010 00000000000000BUFRb[  4[}KyMTe4415614 yyF4  E   A A!&3[Л* _H< F #&bPI !/ _U$  dBT}$- A8?%0 D`} "AwB/*B!B!B hѣF4hѥƗ*\hѥƍ\hѥƍ\hѥƍ\hѥƍ\hѥƍ\hѥƍ\hѥƍ\hѥƍ\hѥƍ\hѥƍ\hр7777dballe-5.18/extra/bufr/synop-old-buoy.bufr0000644000175000017500000000026611173330007015453 00000000000000BUFRb  4}KyH[%x44613 yylFA A !LW"-M(c4hѣF51F4hѣF4hѣF7777dballe-5.18/extra/bufr/bufr20000644000175000017500000000026711173330007012637 00000000000000BUFRb  4}Ky?e|x44743 yyFA A !LWc-vI G4hѣF5zM4hѣF4hѣF7777 dballe-5.18/extra/bufr/synop-strayvs.bufr0000644000175000017500000000037411432770562015450 00000000000000ISID40 LIMV 040900 BUFRP   V ; "$/$jt@*"XI:CW{S d_{.I2?##րl7777 dballe-5.18/extra/bufr/airep-old-4-142.bufr0000644000175000017500000000024211173330007015066 00000000000000BUFRb 4}Y pn bHUA17 '%FA A!8UA17 F!pQ:% hѣF4hF4h7777dballe-5.18/extra/bufr/synop-cloudbelow.bufr0000644000175000017500000000337111531212107016056 00000000000000BUFRY   V,H  F9s;b1XaD\/ !2%67<+0<*:(6=25!:07&25*470&02"7<(9004:*24!!:274777%274&70(287)25*470'64)907":0<%074&:)0!;20:&402$72&<$70*쁀RNtu$(+(I` M˜ ㍡{ZZ5%^*ƨZ-'"(;)OEdnc%dClC±IbMGrr8$XlW旈zZW R@9Re֊%np-\X(;]Gċτ ( 6l'H 3LDn岋l2a@@0G $i s _+!3*5# *IH(PE!4+ e'ր~8Î:Hp^ӮKI,xu -u,#ܥ %DUQEbW"+ԥ)@ZxL@i_hk!k*Ujl_oС ]Hb4q`E d!,KW x[X2GP%”1L&DrdțSq)GqQ@ R@/PT`K 0 Hҋ@<0 0 0(0SHM HM4!0@Ye@Y@` y@Q!88}} l x$/` :Qh`}P߸_/  @ x@  !@  | ._!?@"2b2rs' )?@!8(N&UuUTUP  qtt) ?@  2ZIA2B&䈤+xx  %RF&`dẢb(QAO  (2>t?pG???7777 dballe-5.18/extra/bufr/gen-synop.bufr0000644000175000017500000010150011173330007014463 00000000000000BUFRb   A1 A1!n !ow? mد^x}2J2&@?e/2e ?d7777BUFRb   A1 A1!n (ouRAu)U'?xҁQF62&@?e/2d ?d7777BUFRb   A1 A1!n o@BXyy#%W?"_2&@?e7777BUFRb   A1 A1!no7ǐudX'X?"_!@?e7777BUFRb   A1 A1!n%oJgc lO? }B"_2&@?e/d ?7777BUFRb   A1 A1!n oOEv*oWg?xBR_Le/d ?7777BUFRb   A1 A1!n ﬌0JFZ'W? }"JLe/2d ?d7777BUFRb   A1 A1!n oBNfDUUW?"yB_@?e/d7777BUFRb   A1 A1!n ﬌r< gyM?@rAxJ62&@?e/2d ?d7777BUFRb   A1 A1!n ﬌pP<VI?X?` y_@?e/d7777BUFRb   A1 A1!n &ox B kմW? "H62&@?e/2d ?d7777BUFRb   A1 A1!n ,ouDu?2ռY?"yD_2&@?e/d7777BUFRb   A1 A1!n -otFzNxUW/? "yr_2&@?e/d7777BUFRb   A1 A1!n /ovBHvfxX?"yC_2&@?e/d7777BUFRb   A1 A1!n 1﬌wBJ:{9X'?"yB_2&@?e/d7777BUFRb   A1 A1!n 4﬌v JjJ| Uן?"yB_2&@?e/d7777BUFRb   A1 A1!n 6oyNvr{)}-?"_2&@?e7777BUFRb   A1 A1!n 7owBOG0b|I-YO?"yB_!@?e/d7777BUFRb   A1 A1!n 9oha=+TY?@xB J@?e/2e ?d7777BUFRb   A1 A1!n ;﬌kn@* YXOX?@ yr@_!@?e/d ?7777BUFRb   A1 A1!n oiCj~2dWWX?"yC_Le/d7777BUFRb   A1 A1!n CofNBE`(FuU7? 0}B"_Le/d ?7777BUFRb   A1 A1!n Ioif{YX?@ y_2&@?e/d7777BUFRb   A1 A1!n oGUZ@oZաVG?"yD_@?e/d7777BUFRb   A1 A1!n ﬌EBUG&x?-UY'?"yB_2&@?e/d7777BUFRb   A1 A1!n ﬌?ڂS 6/<uVL? UDA!x_Le/d ?7777BUFRb   A1 A1!n ﬌=iPvK}X? r!J62&@?e/2d ?d7777BUFRb   A1 A1!n on{I?mX2J2&@?e/2d ?d7777BUFRb   A1 A1!n o I >k)-ZG? U"Hr C2!@?e/2e dL7777BUFRb   A1 A1!n o cSw?(Z/ UT"J!62&@?e/2d ?d7777BUFRb   A1 A1!n!o2BB&joZX@7_!F0 D#2&@?e/2e dL7777BUFRb   A1 A1!n!o'B[q#EYW?U}2J!62&@?e/2e ?d7777BUFRb   A1 A1!n!*﬌cQu(?U1HF @b!@?e/2d dL7777BUFRb   A1 A1!n﬌ VVy)sY_?ACF0 b2&@?e/2d dL7777BUFRb   A1 A1!noz8B{)ZMW_2&@?7777BUFRb   A1 A1!n﬌ =lR{)?<ׯ"yC_2&@?e/d7777BUFRb   A1 A1!n o[?y<M"yCP_2&@?e/d ?7777BUFRb   A1 A1!n,of*[xmX?x/ðI &@?/쿀/7777BUFRb   A1 A1!n﬌*BNzY('׍sL2&@?e/2d ?d7777BUFRb   A1 A1!n﬌RBux("yB_2&@?e/d7777BUFRb   A1 A1!n﬌B[z?<M?"yB``_2&@?e/d ?7777BUFRb   A1 A1!no:Bhr{)<M?"yBP_2&@?e/d ?7777BUFRb   A1 A1!noZCR| ?2M_2&@?7777BUFRb   A1 A1!noDVz<_2&@?7777BUFRb   A1 A1!no}DJzYAׇ?"yBP_2&@?e/d ?7777BUFRb   A1 A1!n﬌RGN|yFW"yD_2&@?e/d7777BUFRb   A1 A1!n-﬌'jNOzPwWw @_2&@?e/?7777BUFRb   A1 A1!n.﬌INv{FUW#_2&@?7777BUFRb   A1 A1!n8﬌Z;"nzIP؏?"yB0_2&@?e/d ?7777BUFRb   A1 A1!n-﬌:Fm}MX7U0GO "2&@?e/쿀7777BUFRb   A1 A1!n>o/R>#*y9?<X'_2&@?7777BUFRb   A1 A1!n?oQ<bz<o?"yB0_2&@?e/d ?7777BUFRb   A1 A1!n@﬌?^{ FW"yBP_2&@?e/d ?7777BUFRb   A1 A1!nAoޠZ@FN{FX_,_2&@?7777BUFRb   A1 A1!nA﬌/R?Vz2MX7"ys F2&@?e/2d ?d7777BUFRb   A1 A1!nE﬌׵AJvN{AXw_2&@?7777BUFRb   A1 A1!nGoBziFX/?"yC_2&@?e/d7777BUFRb   A1 A1!nIoڱRCzZv{ FMX/_2&@?7777BUFRb   A1 A1!nI﬌V2CՀ{P?"yrpL2&@?e/2d ?d7777BUFRb   A1 A1!nNoۓE`z{FMX"_2&@?7777BUFRb   A1 A1!nP﬌G~{?2,"yC_2&@?e/d7777BUFRb   A1 A1!nQoيBH:.w7Xw?"yB_2&@?e/d7777BUFRb   A1 A1!nToG0*y AX_2&@?7777BUFRb   A1 A1!nUo J1R|Y?A,"yC``_2&@?e/d ?7777BUFRb   A1 A1!nVo˚JZx?<X7?"yCP_!@?e/d ?7777BUFRb   A1 A1!nZoL^}Y<^@OxIa2&@?/?7777BUFRb   A1 A1!n\oN5J}#Xw}?"yB_2&@?e/d7777BUFRb   A1 A1!n2oTOfrr9?xxK2&@?e/?7777BUFRb   A1 A1!ndo;WV{ FX"_2&@?7777BUFRb   A1 A1!nk﬌>=6nzI?7UX7?"yB_2&@?e/d7777BUFRb   A1 A1!npoY@,N{i?PXO?"yB _2&@?e/d ?7777BUFRb   A1 A1!nu﬌ћCSJvvYFM_2&@?7777BUFRb   A1 A1!nwo^CjZvy-?"yB _2&@?e/d ?7777BUFRb   A1 A1!n{oЖDdnuFU?"yB_2&@?e/d ?7777BUFRb   A1 A1!n|﬌}EZy)FX/?"yC_2&@?e/d7777BUFRb   A1 A1!n~﬌2GJ{?K7_2&@?7777BUFRb   A1 A1!n﬌bI{<XoX"yB`_2&@?e/d ?7777BUFRb   A1 A1!no՛:Iv?KMXG?"yC_2&@?e/d7777BUFRb   A1 A1!n﬌ʪK5zK/_2&@?7777BUFRb   A1 A1!noKZyIiX_2&@?7777BUFRb   A1 A1!nobLnzi?F"yB_2&@?e/d7777BUFRb   A1 A1!n7﬌qvu9s׏ oH_2&@?/?7777BUFRb   A1 A1!n﬌oMJ:x__2@?7777BUFRb   A1 A1!n﬌M^wKX/ x}C"P_!@?e/d ?7777BUFRb   A1 A1!n﬌՛:Ojz Pg_2&@?7777BUFRb   A1 A1!n﬌*P y-Xx}B_2&@?e/d7777BUFRb   A1 A1!no%;&x)7?"yrɰ_2&@?e/d ?7777BUFRb   A1 A1!n﬌˴; yY?FX?X?"yB_2&@?e/d7777BUFRb   A1 A1!no;:wKX_?"yrʠ_2&@?e/d ?7777BUFRb   A1 A1!n﬌<Рw)?K?"yB_2&@?e/d7777BUFRb   A1 A1!n﬌sB=tI(_2&@?7777BUFRb   A1 A1!n﬌̧>pxFw?"yB_2&@?e/d7777BUFRb   A1 A1!n﬌ƞ@^qyPg_2&@?7777BUFRb   A1 A1!noBB&w?7o?"yB _2&@?e/d ?7777BUFRb   A1 A1!n﬌ A ZZuZoX?׍r_2&@?e/d ?7777BUFRb   A1 A1!no:B "wFX?"yB_2&@?e/d7777BUFRb   A1 A1!noE5v2X?"_2&@?e7777BUFRb   A1 A1!noǑzGqpAM'_2&@?7777BUFRb   A1 A1!n﬌˴H@y FMW?"_2&@?e7777BUFRb   A1 A1!n﬌H~v)FW?"_2&@?e7777BUFRb   A1 A1!n﬌Jr6{ 2X_2&@?7777BUFRb   A1 A1!noҒK\ .nAMW~?"_2&@?e7777BUFRb   A1 A1!no$N"y<W_2&@?7777BUFRb   A1 A1!n﬌M1Vv 2MWg?"yB_2&@?e/d ?7777BUFRb   A1 A1!n﬌:MxY7Mח?x}B_!@?e/d7777BUFRb   A1 A1!noPMzFW~?"yB_2&@?e/d7777BUFRb   A1 A1!no:NB yAW?xB_2&@?e/d7777BUFRb   A1 A1!n﬌Ny-W?"yB_2&@?e/d7777BUFRb   A1 A1!n﬌˴NBw׿_2@?7777BUFRb   A1 A1!n﬌ Pev XX?"yC _2&@?e/d ?7777BUFRb   A1 A1!noQ0r|?("yB_2&@?e/d7777BUFRb   A1 A1!noڂ9vxiPW?"yB_2&@?e/d7777BUFRb   A1 A1!noX8}x d7?׍BFR!@?e/2d ?d7777BUFRb   A1 A1!no:pidׯ?"_2&@?e7777BUFRb   A1 A1!no>B< N_)?xYO?"yɰ_2&@?e/d ?7777BUFRb   A1 A1!no=yu9?UX_2&@?7777BUFRb   A1 A1!n﬌m?4^>_/L? yr_Le/d7777BUFRb   A1 A1!no@F oKUW?"_2&@?e7777BUFRb   A1 A1!n﬌KAWz jUX^_!@?7777BUFRb   A1 A1!noڂB' k U'_2&@?7777BUFRb   A1 A1!n﬌An<X?"yr̀_2&@?e/d ?7777BUFRb   A1 A1!noKCpo?xU"_2&@?e7777BUFRb   A1 A1!n﬌D bY#^"_2&@?e7777BUFRb   A1 A1!noGRE@P9Zׯ_2&@?7777BUFRb   A1 A1!n﬌EF*W?x}B BLe/2d ?d7777BUFRb   A1 A1!noóF,v k9MXO_2&@?7777BUFRb   A1 A1!no BGJ ^ZW_2&@?7777BUFRb   A1 A1!noG pUXO^"_2&@?e7777BUFRb   A1 A1!noIu7UW_2&@?7777BUFRb   A1 A1!n﬌GJJzr- ?"_!@?e7777BUFRb   A1 A1!n﬌1:K5r?(X/?"_!@?e7777BUFRb   A1 A1!no KuAXO_2&@?/?7777BUFRb   A1 A1!nBoR5o?mVR"_&@?/?7777BUFRb   A1 A1!noŒMz~u2MW?"_!@?e7777BUFRb   A1 A1!noڂMK`q#?"_2&@?e7777BUFRb   A1 A1!noѲOG0 k??"_2&@?e7777BUFRb   A1 A1!no BNv ?(׿"_2&@?7777BUFRb   A1 A1!noQVx92W?"yB_2&@?e/d7777BUFRb   A1 A1!n﬌\zR kYU&?"_2&@?e7777BUFRb   A1 A1!n﬌7 jks?񀈥}r_2&@?e/d7777BUFRb   A1 A1!no(*9VqyKX'?񀐥}r`_2&@?e/d ?7777BUFRb   A1 A1!n﬌R;/tYUMן? yFT2&@?e/2d ?d7777BUFRb   A1 A1!nou;& m7X?񀘥rFT2&@?e/2d ?d7777BUFRb   A1 A1!n﬌rU_2&@?7777BUFRb   A1 A1!n﬌J *jfi_^Uw,7_2&@?e/7777BUFRb   A1 A1!n﬌R;JoiMׯ_2&@?7777BUFRb   A1 A1!noZ=SYPV?"yr_2&@?e/d7777BUFRb   A1 A1!n o=? *mdUW&?׍r1_!@?e/d ?7777BUFRb   A1 A1!n ﬌A0j bYUw_2&@?7777BUFRb   A1 A1!nDoSTFs9?sW?/_2&@?e/?7777BUFRb   A1 A1!noRB& hYUXgR?"_!@?e7777BUFRb   A1 A1!noCp:/?"yB_Le/d7777BUFRb   A1 A1!noE J[<׿ ?"_2&@?e7777BUFRb   A1 A1!noBF,v9i_H7777BUFRb   A1 A1!noFȶ .dXg,"_2&@?e7777BUFRb   A1 A1!n﬌G& bgU/_2&@?7777BUFRb   A1 A1!n﬌GJv?OdVW?"yB_He/d7777BUFRb   A1 A1!noGq Ndׯ_2&@?7777BUFRb   A1 A1!noI`X ?W_2&@?7777BUFRb   A1 A1!n﬌5jI Zi?(؏_!@?7777BUFRb   A1 A1!n﬌ JX* ei7XgX?"_2&@?e7777BUFRb   A1 A1!n﬌jJX* J_U_2&@?7777BUFRb   A1 A1!nohKJ;iVg_L7777BUFRb   A1 A1!n﬌OL ^_YU__2&@?7777BUFRb   A1 A1!n ﬌L ]?UW?񀈥}B_2&@?e/d ?7777BUFRb   A1 A1!n!ohL06&xַ?"}C_Le/d ?7777dballe-5.18/extra/bufr/obs1-13.36.bufr0000644000175000017500000000030611173330007014062 00000000000000BUFRb   4 }KyE sG63112 yXy F  ŖA" A"!X63112 [25>. oz ѣF4h֭F6|hҥF4hѣF>|hр7777dballe-5.18/extra/bufr/bufr2.crex0000644000175000017500000000026511173330007013575 00000000000000CREX++ T000103 A001 D08003++ 44743 010 000 0 2004 11 30 12 00 4302 -01245 10084 10084 0016 07 /// //// /// /// /// //// /// // // /// // // //// // // // 2882++ 7777 dballe-5.18/extra/bufr/synop3new.bufr0000644000175000017500000003354611432513605014534 00000000000000BUFRb 4}<H4`gS,16080 <,F  A1 A1!n (/u2Ao`ELk@7B1H@H hѣF4hJ>4iR5XjUV4hѣF4hѣF4`7777BUFRb 4}<H`Rf16084 <,F  A1 A1!n */nCjm)ಥZL'׍r!H  hѣF4hJ>4jcR5XjUV4hѣF4hѣF4`7777BUFRb 4}<Ig~$16110 <,<  A1 A1!n 7/wBOG0w)ݞZxoB J  hѣF4h<>4hcR5XjUV4hѣF4hѣF4`7777BUFRb 4}<H fb16134 <,F  A" A"!T C/f/E`(5HM 2j+E' @1F4hѣK>TP}XѣF\7777BUFRb 4}<Gf216153 <,F  A1 A1!n Lc!>? gI}E7 UB!__ hѣF4hJ>4jcR5XjUV4hѣF4hѣF4`7777BUFRb 4}<He`16158 <,F  A1 A1!n O/_D`ZxI }E['@xB20H0? hѣF4hJ>4jcR5XjUV4hѣF4hѣF4`7777BUFRb 4}<H.eG16206 <,2  A1 A1!n g/T{Gp^x FEZX yB X_ hѣF4hJ>4jcO42e.4hѣF4hѣF4`7777BUFRb 4}<Je <16230 <,F  A1 A1!n s/PPnwi@_U y0X_ hѣF4hJ>4jcR5XjUV4hѣF4hѣF4`7777BUFRb 4}<J@daD16252 <,F  A" A"!T ~/FBRPAO,A @1F4hѣK>TP}XѪƍJ7777BUFRb 4}<Kd T16270 <,<  A1 A1!n /@BX`u`_Yo y! _ hѣF4h<>4hcR5XjUV4hѣF4hѣF4`7777BUFRb 4}<IcP16280 <,F  A1 A1!n />%L0 &lYn5\xB20_ hѣF4hJ>4jcR5XjUV4hѣF4hѣF4`7777BUFRb 4}<J~Pc216310 <.F  A1 A1!n /3(S &lӂY HyB_ hѣF4hJ>4jcR5XjUV4hѣF4hѣF4`7777BUFRb 4}<Kc16320 <.F  A1 A1!n /:B\pjyIQFE[_ hѣF4hJ>4jcO5XѣRR4hѣF4hѣF4`7777BUFRb 4}<Kc16325 <.F  A1 A1!n 8)XԀry _r\@BA_ hѣF4hJ>4jcR5XjUV4hѣF4hѣF4`7777BUFRb 4}<Kc x16360 <.F  A1 A1!n /0]Pr_Q-UZ_ hѣF4hJ>4jcO5XѣRR4hѣF4hѣF4`7777BUFRb 4}<Ja16420 <.F  A1 A1!n /TpuiU[_ hѣF4hJ>4jcO5XѣRR4hѣF4hѣF4`7777BUFRb 4}<Ina`16429 <.<  A1 A1!n ֯Kvzy`a_\X` yr08_ hѣF4h<>4hcR5XjUV4hѣF4hѣF4`7777BUFRb 4}<Jo`016480 <.F  A1 A1!n / cS}Pv)`\_ hѣF4hJ>\cO5XѣRR4hѣF4hѣF4`7777BUFRb 4}<Gc16522 <.F  A1 A1!n!/9B>? rk_[O@U}B_ hѣF4hJ>\cR5XjUV4hѣF4hѣF4`7777BUFRb 4}<H_Xc 16550 <.F  A1 A1!n!/2BBn堒UYg_ hѣF4hJ>4jcO5XѣRR4hѣF4hѣF4`7777BUFRb 4}<I(g16021 <6A  A" A"!T тID %(MO+&'i @1F4hѣK>TP ѣF\7777BUFRb 4}<HFg16022 <8A  A" A"!T /}F0'M*+B&' @1F4hѣK>TP ѣF\7777BUFRb 4}<IS|hQ16033 <8F  A" A"!T BJj$MoѬ6@`TPXѪƫRZ7777BUFRb 4}<Gg16052 <8A  A" A"!T /{MB<Р<'# @1F4hѣK>TP ѣF\7777BUFRb 4}<Hdx16168 <8F  A" A"!T T/OGgK/A-o Hι@ @1F4hѣK>TPXѪƫRZ7777BUFRb 4}<I/Ze\16172 <8F  A1 A1!n V/]EIz &g Z`UB"J0{ hѣF4hJ>\cR5XjUV4hѣF4hѣF4`7777BUFRb 4}<IJe 16179 <8F  A" A"!T Y]L*P:O- 6@`*d @1F4hѣK>TPXѪƫRZ7777BUFRb 4}<IS|d16224 <8F  A1 A1!n p/LNJ jfY!}[w^R@UBRDH` hѣF4hJ>4jcR5XjUV4hѣF4hѣF4`7777BUFRb 4}<Jbd@16232 <8F  A1 A1!n t/KTSuIE[_ hѣF4hJ>\cO5XѣRR4hѣF4hѣF4`7777BUFRb 4}<Iidp16245 <8F  A1 A1!n zGBKOwU\of@UB"@BH`  hѣF4hJ>4jcR5XjUV4hѣF4hѣF4`7777BUFRb 4}<Jdz16258 <8F  A" A"!T /GUr>,/A @1F4hѣK>ThѣP}XѪƍJ7777BUFRb 4}<Jb16344 <8<  A" A"!T /*BW]!" MÀ*,A H*@ @1F4hѣ4hcO5XѣRR4hѣF4hѣF4`7777BUFRb 4}<HKch16531 <8<  A1 A1!n! =B^vysڧ_ hѣF4h<>4hcO5XѣRR4hѣF4hѣF4`7777BUFRb 4}<Hb16546 <8<  A1 A1!n!/*@x [GX@UB@_ hѣF4h<>4hcR5XjUV4hѣF4hѣF4`7777BUFRb 4}<HKb~16564 <8F  A1 A1!n!/'B^p[RxB2C_ hѣF4hJ>4jcR5XjUV4hѣF4hѣF4`7777BUFRb 4}<G2g*(16059 <@F  A1 A1!n r< b9ݟهlx1èL( hѣF4hJ>4jcR5XjUV4hѣF4hѣF4`7777BUFRb 4}<GgxH16066 <@F  A1 A1!n !/w?P g_UYLlxRP0 hѣF4hJ>4jcR5XjUV4hѣF4hѣF4`7777BUFRb 4}<HϦgIh16090 <@F  A1 A1!n -/tF}0Rrޠ#5[+@xrA H' hѣF4hJ>4jcR5XjUV4hѣF4hѣF4`7777BUFRb 4}<I^:g`16105 <@F  A1 A1!n 4v JZw[loaP!_ hѣF4hJ>4jcR5XjUV4hѣF4hѣF4`7777BUFRb 4}<IzfA16149 <@F  A1 A1!n JdK`vwYU\/lxC0H@ hѣF4hJ>4jcR5XjUV4hѣF4hѣF4`7777BUFRb 4}<JcԤ16289 <@F  A1 A1!n =JBPbt 0FUڟX@}Br_ hѣF4hJ>4jcR5XjUV4hѣF4hѣF4`7777BUFRb 4}<J bW16362 <@F  A1 A1!n /%|VP~xI^#Z/_ hѣF4hJ>4jcO5XѣRR4hѣF4hѣF4`7777BUFRb 4}<Ila(16405 <@<  A1 A1!n ʯMK`y_a \O_ hѣF4h<>4hcO5XѣRR4hѣF4hѣF4`7777BUFRb 4}<Jga@|16460 <@F  A1 A1!n /S>x`\O_ hѣF4hJ>4jcO5XѣRR4hѣF4hѣF4`7777BUFRb 4}<GҸc16520 <@<  A1 A1!n!/:>y)nU_ hѣF4h<>4hcO5XѣRR4hѣF4hѣF4`7777BUFRb 4}<Hb$16560 <@F  A1 A1!n!/)B@Vz)_қEZ UBBHf hѣF4hJ>4jcR5XjUV4hѣF4hѣF4`7777BUFRb 4}<H]dg 16076 <FF  A1 A1!n &/x B fI`xgLlxB0N0? hѣF4hJ>4jcR5XjUV4hѣF4hѣF4`7777BUFRb 4}<IvdH16239 <FF  A1 A1!n wHK qnE\^U2BJ0u hѣF4hJ>4jcR5XjUV4hѣF4hѣF4`7777BUFRb 4}<Krc16312 <FF  A1 A1!n /4jcO5XѣRR4hѣF4hѣF4`7777BUFRb 4}<IOg~$16099 <FF  A1 A1!n 1wBJ|v_c#E[/g yrP8__ hѣF4hJ>4jcR5XjUV4hѣF4hѣF4`7777BUFRb 4}<Gg 16061 <F  A" A"!T pP<ZD pÀzǬG&@`TPXѪƫRZ7777BUFRb 4}<Lrb!16643 < F  A1 A1!n!A"dRy_D[_ hѣF4hJ>\cO5XѣRR4hѣF4hѣF4`7777BUFRb 4}<M7b\16648 < F  A1 A1!n!D/.eiju)ߣZ__ hѣF4hJ>\cO5XѣRR4hѣF4hѣF4`7777BUFRb 4}<Nbet16684 < <  A1 A1!n!V/&WBpwi_r\?_ hѣF4h<>4hcO5XѣRR4hѣF4hѣF4`7777BUFRb 4}<MmJc016622 <F  A1 A1!n!7/9CkjPRy߁ZW_ hѣF4hJ>\cO5XѣRR4hѣF4hѣF4`7777BUFRb 4}<LCpbh16641 <F  A1 A1!n!@.FbRyyߑ[_ hѣF4hJ>\cO5XѣRR4hѣF4hѣF4`7777BUFRb 4}<L@a`16682 <F  A1 A1!n!U/fBzyi߁Z_ hѣF4hJ>\cO5XѣRR4hѣF4hѣF4`7777BUFRb 4}<Max16716 <F  A1 A1!n!f/Gm~x8[w_ hѣF4hJ>\cO5XѣRR4hѣF4hѣF4`7777BUFRb 4}<Mݘ_16746 <F  A1 A1!n!u/nm_\/_ hѣF4hJ>4jcO5XѣRR4hѣF4hѣF4`7777BUFRb 4}<IΈgX16108 <<  A1 A1!n 6/yNt@rw([_@x2 N_ hѣF4h<>4hcR5XjUV4hѣF4hѣF4`7777BUFRb 4}<I[Lff16148 < @F  A1 A1!n J/fmJ`jv__\y0(_ hѣF4hJ>4jcR5XjUV4hѣF4hѣF4`7777BUFRb 4}<HrhT16008 <"F  A" A"!T /OEsxMRȫ26@`* @1F4hѣK>TPXѪƫRZ7777BUFRb 4}<IGg16098 <-<  A1 A1!n 1/x@J> u9D#['&@ yr@8_ hѣF4h<>4hcR5XjUV4hѣF4hѣF4`7777BUFRb 4}<Jc 16294 4jcR5XjUV4hѣF4hѣF4`7777dballe-5.18/extra/bufr/gts-acars-us1.bufr0000644000175000017500000000021011635347612015147 00000000000000BUFR8   ;AB !!C  :KRXCOOBAFJCYR4RA!Қ FiR\66??7777dballe-5.18/extra/bufr/temp-bad2.bufr0000644000175000017500000000144611524554113014335 00000000000000BUFR&be 4e}XMj33393 &X5F.A A!A ABĎ` ?q&R "2Q/dD&wFH !*hPm@_#6@3Efmgn@xObdg,N!Yv^e ta _@8 uBc/W@#} a?,' ~`_UZy a.DF F F &^ #xC@DhP Jco8p0gp8B\@b4hѣF4hѣF.4hѣF5(ңF\hѥƍiQF.4hѥƍ4ѣR*4hѥƍ4ѣF4iqFJ4ѣF4iqFThѥƍ\hѩF4iFJ4hѣK\hѩF4iqF4hѥƍ>4hѩF4jQFhѣF4iq߿߿~M,&H0 wla20q$F' ny7777dballe-5.18/extra/bufr/temp-bad5.bufr0000644000175000017500000000177611526526734014360 00000000000000BUFRe A A! ( Wify?Jv N sZ2J7@OiV_> [jP-??= _7PO;̏ z?Cp'|}ѪKIs/vְ/h ٪ Z??]+-s@=s}u>i0O^/?o.?N!Ze䤴 |I _П)&'}IhRO A?7 ?7'=aT`_pH3piB ML@P/|9@(w2A?6! D _H\5_6/E@51IP3b]ȀA_HИ~) .W0@fh/LBpY@3 ܥ!X '_ n//'B@`{ 'k\`_ g h/A-?o܆& t{ Z[rX@ .7%/7777dballe-5.18/extra/bufr/obs1-19.3.bufr0000644000175000017500000000030611173330007014002 00000000000000BUFRb  4}YT(PVRZO2 dF  ŖA" A"!XVRZO2 C,J'< ,l A!^ ѣF4hѣF6|h&ƥV4jԫVhр7777dballe-5.18/extra/bufr/obs1-9.2.bufr0000644000175000017500000000030611173330007013720 00000000000000BUFRb   4 }KyGmxDFPC yyF  ŖA" A"!XDFPC [MܭWg ѣF4h֭F4hҥF4hѣF>|hр7777dballe-5.18/extra/bufr/test-airep1.bufr0000644000175000017500000000024211173330007014703 00000000000000BUFRb  4}KyMxn EU4824 yyj AA!8EU4824 o0Pkw@0 hѣF͘<7777dballe-5.18/extra/bufr/synop-oddgust.bufr0000644000175000017500000001105411433006501015365 00000000000000BUFR,N  P2302/B=g|M8KCmi`wq$8C )HH? ~|DNG$$?(List auf Sylt gX X$}!HqG? 6?' c\???G GAuuߣ566W7vrp5܈HN) g,z#kk_|?HH?0>`8|D`G?(7Fehmarn _gX Ȏ&8|t ?X `a??0?G#<g?ߣ4'W&rgV6'VWGFVp5+lHyi'2zlk2:?| HH?0 `E|D)G4?(Schwerin _gX D$#Et? [ ``??0?G#{Kߣ⋄w&Vg7vBp54Isקfylk$0`HH?0 `Y|D,GS@?(Emden _gX v@p? XfP D/'*e$`n~(fQ@@@@@@@@@@@@@@H ? 8ot a)F`H#P`?@e">"Xߣ e'2:84sLgNM:Cc[[-?_1G@@ @O<# ??JC ss{+8lZ$-A`sd6>A#~# aU'SePI~h0hRҚ@@@@@@@@@@@I"@J`%7\ol {?_F߀`$ ?@?eP>"X?ߣzwĦ422123/RPh|t M;Ca{YOrX$0 f)HH?0`3|EG %C?)Duesseldorf _gX yds"6q? ׹\0D7P??J4??O߿h ~m\[^i!h S)1!}گ/=?@e" ߣ2=454=/J uy; Ch ^m,u6`"@ F)HH? A|EP%G?)Dresden-Klotzsche _gX u0bw7? 6H` DD'Sd)`{~WSZ@@ő!HE9'叔 m?q A ?~'ioِ ψGD-- kt? M)ңNז֣sW4 'f+eP@L~edT^@@@@@@4:P(6LOt -<@'_#OU'   /g!} `5xLa-"Lݟ2ڶ,C:rFGO@@ ]K%S?s!_W; j+C+#Ks:8iϼ$Ads=d7 '!5C 3 'SWe V+~U@@@@@@@@@@@ 4jcR5XjUV4hѣF4hѣF4`7777dballe-5.18/extra/bufr/synop-sunshine.bufr0000644000175000017500000001103611432770030015554 00000000000000ISID11 EDZW 030300 BUFRN  P2302/B=g|NG9kCgka`wq.0sGO@@ AӦ#k?@cK 1c8n#A @DӟQd5` ?c7?? _cB:b#ߣ62/DBuxNN':{CXkW/x2{081GSO@@ a7[??A3+Ck q8nDu$q1d5`i'@??d,:b?ߣI0:3:69::2/[bCͰN{:C[;W=`*.X"T b)HH? ~Ctp!G?(Schwerin g D$#EBvG? v' ? ch~=@'ScjK~Qp@@@@@@@@@@0|8p>;/T XT8?< eO~'Fn?G c:O{._ ~ @'zGd}釀W~Q@@@@@@@@@@@@@@0H ? 9O  mkϡADG@ 'K#Oԧ   5#1@99} `6c=Es޸2/A????OX1~T[ݙ\e!m|!!o,?;_#Oԧ  `4%!@5ɜ} `65FEZKo2ZlC@Q ?5n)HH?0>`0tP&G?)Lindenberg _g ꤠ&.x׶? 6PP<???G LF?ߣGVW76VF&bp1ךVG?.!i'%yml?|F8°ǯa?~'KW, nG6l.nlc4萈)άSC ~@'Se@t@Q~SZ@@0I*`R)6/\ kV!nF@p$m#Oԧ  ;%1ɕ͑-͍} `5&z_bf_2ڠyBA??J??O_]1 ~~Y\\P\Z[\X9$6I$o!o?<D?|e-:bߣ&43/D0!4J;CZX=x{087GO@@ @uU[(o?S3 s[3zk Kq8j#@Ts1d6SON'q#  ?P`a@ߣV7IL%I 731 M OF IMAGE SPECTRUM AT LOW WAVE NUMBERS M 0 0 14 022098 WAVELENGTH SPREAD (WAVELENGTH > 731 M) AT LOW WAVE NUMBERS M 0 0 14 022099 MEAN DIRECTION AT LOW WAVE NUMBERS (WAVELENGTH > 731 M) DEGREE TRUE 0 0 9 022100 DIRECTION SPREAD AT LOW WAVE NUMBERS (WAVELENGTH > 731 M) DEGREE 0 0 9 022101 TOTAL ENERGY (WAVELENGTH > 731 M) AT LOW WAVE NUMBERS NUMERIC 0 0 31 022120 TIDE STATION AUTOMATED WATER LEVEL CHECK CODE TABLE 022120 0 0 5 022121 TIDE STATION MANUAL WATER LEVEL CHECK CODE TABLE 022121 0 0 5 022122 TIDE STATION AUTOMATED METEOROLOGICAL DATA CHECK CODE TABLE 022122 0 0 5 022123 TIDE STATION MANUAL METEOROLOGICAL DATA CHECK CODE TABLE 022123 0 0 5 022141 SEA SURFACE TEMPERATURE (15 DAY RUNNING MEAN) K 2 0 15 022150 NUMBER OF 18 HZ VALID POINTS FOR KU BAND NUMERIC 0 0 10 022151 KU BAND OCEAN RANGE M 3 0 31 022152 STD OF 18 HZ KU BAND OCEAN RANGE M 3 0 16 022153 NUMBER OF 18 HZ VALID POINTS FOR S BAND NUMERIC 0 0 10 022154 S BAND OCEAN RANGE M 3 0 31 022155 STD OF 18 HZ S BAND OCEAN RANGE M 3 0 16 022156 KU BAND SIGNIFICANT WAVE HEIGHT M 3 0 16 022157 STD 18 HZ KU BAND SIGNIFICANT WAVE HEIGHT M 3 0 16 022158 S BAND SIGNIFICANT WAVE HEIGHT M 3 0 16 022159 STD 18 HZ S BAND SIGNIFICANT WAVE HEIGHT M 3 0 16 022160 NORMALIZED INVERSE WAVE AGE NUMERIC 6 0 21 022161 WAVE SPECTRA M**4 4 0 27 022192 SPECTRAL PERIOD S 2 0 13 022193 MEAN WAVENUMBER 1/M 5 0 15 022194 PEAK WAVENUMBER 1/M 5 0 15 022195 MEAN WAVE PROPAGATION DIRECTION DEGREE 1 0 13 022196 PEAK WAVE PROPAGATION DIRECTION DEGREE 1 0 13 022197 DIRECTION SPREAD DEGREE 1 0 13 022198 VARIANCE SPECTRAL DENSITY M**2*S/RAD 4 0 18 022199 CORRELATION COEFF OF SIMULATED FG AND OBSERVED SAR SPECTRUM NUMERIC 4 -10000 15 022200 CORRELATION COEFF OF SIMULATED BF AND OBSERVED SAR SPECTRUM NUMERIC 4 -10000 15 022201 CORRELATION COEFF OF OCEAN WAVE FG AND EXTRACTED WAVE SPECTRUM NUMERIC 4 -10000 15 022202 ERROR BETWEEN FIRST GUESS AND OBSERVED SAR NUMERIC 5 0 21 022203 ERROR BETWEEN SIMULATED AND OBSERVED SAR NUMERIC 5 0 21 022204 MEAN PERIOD OF WAVES SECOND 2 0 13 022205 SPECTRAL DENSITY M**2*S/RAD 4 0 25 022206 PEAK PERIOD OF WAVES SECOND 2 0 13 022207 MEAN WAVE PERIOD S 1 0 10 022208 PEAK PERIOD OF 1D SPECTRA S 1 0 10 022209 COEFICIENT OF DRAG WITH WAVES NUMERIC 6 0 13 022210 MEAN SQUARE SLOPE OF WAVES NUMERIC 4 -10000 14 022211 COEFICIENT OF DRAG WITH WAVES NUMERIC 6 0 17 022243 STANDARD DEVIATION SIGNIFICANT WAVE HEIGHT M 2 0 10 023001 ACCIDENT EARLY NOTIFICATION-ARTICLE APPLICABLE CODE TABLE 023001 0 0 3 023002 ACTIVITY OR FACILITY INVOLVED INCIDENT CODE TABLE 023002 0 0 5 023003 TYPE OF RELEASE CODE TABLE 023003 0 0 3 023004 COUNTERMEASURES TAKEN NEAR BORDER CODE TABLE 023004 0 0 3 023005 CAUSE OF INCIDENT CODE TABLE 023005 0 0 2 023006 INCIDENT SITUATION CODE TABLE 023006 0 0 3 023007 CHARACTERISTICS OF RELEASE CODE TABLE 023007 0 0 3 023008 STATE OF CURRENT RELEASE CODE TABLE 023008 0 0 2 023009 STATE OF EXPECTED RELEASE CODE TABLE 023009 0 0 2 023016 POSSIBILITY OF SIGNIFICANT CHEMICAL TOXIC HEALTH EFFECT CODE TABLE 023016 0 0 2 023017 FLOW DISCHARGE OF MAJOR RECIPIENT M**3/S 6 0 20 023018 RELEASE BEHAVIOUR OVER TIME CODE TABLE 023018 0 0 3 023019 ACTUAL RELEASE HEIGHT M 0 -15000 17 023021 EFFECTIVE RELEASE HEIGHT M 0 -15000 17 023022 DISTANCE OF RELEASE POINT OR SITE OF INCIDENT M 0 0 24 023023 MAIN TRANSPORT SPEED IN THE ATMOSPHERE M/S 1 0 12 023024 MAIN TRANSPORT SPEED WATER M/S 2 0 13 023025 MAIN TRANSPORT SPEED IN GROUND WATER M/S 2 0 13 023027 MAIN TRANSPORT DIRECTION IN THE ATMOSPHERE DEGREE TRUE 0 0 9 023028 MAIN TRANSPORT DIRECTION IN WATER DEGREE TRUE 0 0 9 023029 MAIN TRANSPORT DIRECTION IN GROUND WATER DEGREE TRUE 0 0 9 023031 POSSIBILITY THAT PLUME WILL ENCOUNTER PRECIPITATION IN STATE IN CODE TABLE 023031 0 0 2 023032 PLUME WILL ENCOUNTER CHANGE IN WIND DIRECTION AND/OR SPEED FLAG CODE TABLE 023032 0 0 2 024001 ESTIMATE OF AMOUNT OF RADIOACTIVITY RELEASED UP TO SPECIFIED TIM Bq -11 0 28 024002 ESTIMATED MAXIMUM POTENTIAL RELEASE Bq -11 0 28 024003 COMPOSITION OF RELEASE CODE TABLE 024003 0 0 5 024004 ELEMENT NAME CCITTIA5 0 0 16 024005 ISOTOPE MASS NUMERIC 0 0 9 024011 DOSE mSv 2 0 32 024012 TRAJECTORY DOSE (DEFINED LOCATION AND EXPECTED TIME OF ARRIVAL) mSv 2 0 32 024013 GAMMA DOSE IN AIR ALONG THE MAIN TRANSPORT PATH(DEFINED LOCATION mSv 2 0 32 024021 AIR CONCENTRATION(OF NAMED ISOTOPE TYPE INCLUDING GROSS BETA Bq/M**3 2 0 32 024022 CONCENTRATION IN PRECIPITATION ( OF NAMED ISOTOPE TYPE) Bq/L 2 0 32 024023 PULSE RATE OF BETA RADIATION 1/S 1 0 14 024024 PULSE RATE OF GAMMA RADIATION 1/S 1 0 14 025001 RANGE-GATE LENGTH M -1 0 6 025002 NUMBER OF GATES AVERAGED NUMERIC 0 0 4 025003 NUMBER OF INTEGRATED PULSES NUMERIC 0 0 8 025004 ECHO PROCESSING CODE TABLE 025004 0 0 2 025005 ECHO INTEGRATION CODE TABLE 025005 0 0 2 025006 Z TO R CONVERSION CODE TABLE 025006 0 0 3 025007 Z TO R CONVERSION FACTOR NUMERIC 0 0 12 025008 Z TO R CONVERSION EXPONENT NUMERIC 2 0 9 025009 CALIBRATION METHOD FLAG TABLE 025009 0 0 4 025010 CLUTTER TREATMENT CODE TABLE 025010 0 0 4 025011 GROUND OCCULTATION CORRECTION (SCREENING) CODE TABLE 025011 0 0 2 025012 RANGE ATTENUATION CORRECTION CODE TABLE 025012 0 0 2 025013 BRIGHT-BAND CORRECTION FLAG TABLE 025013 0 0 2 025014 AZIMUTH CLUTTER CUT-OFF NUMERIC 0 0 12 025015 RADOME ATTENUATION CORRECTION FLAG TABLE 025015 0 0 2 025016 CLEAR-AIR ATTENUATION CORRECTION dB/M 5 0 6 025017 PRECIPITATION ATTENUATION CORRECTION FLAG TABLE 025017 0 0 2 025018 A TO Z LAW FOR ATTENUATION FACTOR NUMERIC 7 0 6 025019 A TO Z LAW FOR ATTENUATION EXPONENT NUMERIC 2 0 7 025020 MEAN SPEED ESTIMATION CODE TABLE 025020 0 0 2 025021 WIND COMPUTATION ENHANCEMENT FLAG TABLE 025021 0 0 8 025025 BATTERY VOLTAGE V 1 0 9 025026 BATTERY VOLTAGE (LARGE RANGE) V 1 0 12 025028 OPERATOR OR MANUFACTURER DEFINED PARAMETER NUMERIC 1 -16384 15 025030 RUNNING MEAN SEA-SURFACE TEMPERATURE USAGE CODE TABLE 025030 0 0 2 025032 WIND PROFILER MODE INFORMATION CODE TABLE 025032 0 0 2 025033 WIND PROFILER SUBMODE INFORMATION CODE TABLE 025033 0 0 2 025034 WIND PROFILER QUALITY CONTROL TEST RESULTS FLAG TABLE 025034 0 0 4 025036 ATMOSPHERICS LOCATION METHOD CODE TABLE 025036 0 0 4 025040 CO2 WIND PRODUCT DERIVATION CODE TABLE 025040 0 0 4 025041 MOVING PLATFORM DIRECTION REPORTING METHOD CODE TABLE 025041 0 0 2 025042 MOVING PLATFORM SPEED REPORTING METHOD CODE TABLE 025042 0 0 2 025043 WAVE SAMPLING INTERVAL (TIME) S 4 0 15 025044 WAVE SAMPLING INTERVAL (SPACE) M 2 0 14 025045 HIRS CHANNEL COMBINATION FLAG TABLE 025045 0 0 21 025046 MSU CHANNEL COMBINATION FLAG TABLE 025046 0 0 5 025047 SSU CHANNEL COMBINATION FLAG TABLE 025047 0 0 4 025048 AMSU-A CHANNEL COMBINATION FLAG TABLE 025048 0 0 16 025049 AMSU-B CHANNEL COMBINATION FLAG TABLE 025049 0 0 6 025050 PRINCIPAL COMPONENT SCORE NUMERIC 4 -131072 18 025051 AVHRR CHANNEL COMBINATION FLAG TABLE 025051 0 0 7 025053 OBSERVATION QUALITY FLAG TABLE 025053 0 0 12 025054 SSMIS SUBFRAME ID NUMBER NUMERIC 0 0 5 025055 MULTIPLEX HOUSEKEEPING K 2 0 16 025060 SOFTWARE IDENTIFICATION NUMERIC 0 0 14 025061 SOFTWARE IDENTIFICATION CCITTIA5 0 0 96 025070 MAJOR FRAME COUNT NUMERIC 0 0 4 025071 FRAME COUNT NUMERIC 0 0 5 025075 SATELLITE ANTENNA CORRECTIONS VERSION NUMBER NUMERIC 0 0 5 025076 LOG_10 OF (TEMPERATURE-RADIANCE CENTRAL WAVENUMBER) FOR ATOVS LOG (1/M) 8 0 30 025077 BANDWIDTH CORRECTION COEFFICIENT 1 for ATOVS NUMERIC 5 -100000 18 025078 BANDWIDTH CORRECTION COEFFICIENT 2 FOR ATOVS NUMERIC 5 0 17 025079 ALBEDO-RADIANCE SOLAR FILTERED IRRADIANCE FOR ATOVS W/M**2 4 0 24 025080 ALBEDO-RADIANCE EQUIVALENT FILTER WIDTH FOR ATOVS M 10 0 14 025085 FRACTION OF CLEAR PIXELS IN HIRS FOV NUMERIC 0 0 7 025086 DEPTH CORRECTION INDICATOR CODE TABLE 025086 0 0 2 025091 STRUCTURE CONSTANT OF THE REFRACTION INDEX (Cn2) dB 3 -18192 13 025092 ACOUSTIC PROPAGATION VELOCITY M/S 2 28000 14 025093 RASS COMPUTATIONAL CORRECTION FLAG TABLE 025093 0 0 8 025095 ALTIMETER STATE FLAG FLAG TABLE 025095 0 0 2 025096 RADIOMETER STATE FLAG FLAG TABLE 025096 0 0 5 025097 THREE DIMENSIONAL ERROR ESTIMATE OF THE NAVIGATOR ORBIT CODE TABLE 025097 0 0 4 025100 XBT/XCTD FALL RATE EQUATION COEFFICIENT A NUMERIC 5 0 20 025101 XBT/XCTD FALL RATE EQUATION COEFFICIENT B NUMERIC 5 -500000 21 025102 NUMBER OF MISSING LINES EXCLUDING DATA GAPS NUMERIC 0 0 8 025103 NUMBER OF DIRECTIONAL BINS NUMERIC 0 0 8 025104 NUMBER OF WAVELENGHT BINS NUMERIC 0 0 8 025105 FIRST DIRECTIONAL BIN DEGREES 3 0 19 025106 DIRECTIONAL BIN STEP DEGREES 3 0 19 025107 FIRST WAVELENGHT BIN M 3 0 29 025108 LAST WAVELENGHT BIN M 3 0 29 025110 IMAGE PROCESSING SUMMARY FLAG TABLE 025110 0 0 10 025111 NUMBER OF INPUT DATA GAPS NUMERIC 0 0 8 025120 RA2_L2_PROCESSING FLAG CODE TABLE 025120 0 0 2 025121 RA2_L2_PROCESSING QUALITY % 0 0 7 025122 HARDWARE CONFIGURATION FOR RF CODE TABLE 025122 0 0 2 025123 HARDWARE CONFIGURATION FOR HPA CODE TABLE 025123 0 0 2 025124 MWR L2 PROCESSING FLAG CODE TABLE 025124 0 0 2 025125 MWR L2 PROCESSING QUALITY % 0 0 7 025126 MODEL DRY TROPOSPHERIC CORRECTION M 3 -32768 16 025127 SEA SURFACE HEIGHT CORRECTION DUE TO PRESSURE LOADING M 3 -32768 16 025128 MODEL WET TROPOSPHERIC CORRECTION M 3 -32768 16 025129 MWR DERIVED WET TROPOSPHERIC CORRECTION M 3 -32768 16 025130 RA2 IONOSPHERIC CORRECTION ON KU BAND M 3 -32768 16 025131 IONOSPHERIC CORRECTION FROM DORIS ON KU BAND M 3 -32768 16 025132 IONOSPHERIC CORRECTION FROM MODEL ON KU BAND M 3 -32768 16 025133 SEA STATE BIAS CORRECTION ON KU BAND M 3 -32768 16 025134 RA2 IONOSPHERIC CORRECTION ON S BAND M 3 -32768 16 025135 IONOSPHERIC CORRECTION FROM DORIS ON S BAND M 3 -32768 16 025136 IONOSPHERIC CORRECTION FROM MODEL ON S BAND M 3 -32768 16 025137 SEA STATE BIAS CORRECTION ON S BAND M 3 -32768 16 025138 AVERAGE SIGNAL TO NOISE RATIO NUMERIC 0 -2048 12 025193 ATTENUATION CORRECTION ON SIGMA0 dB 3 0 14 025194 MAJOR FRAME COUNT NUMERIC 0 0 4 025197 ANTENNA CORRECTIONS VERSION NUMBER NUMERIC 0 0 5 025198 LOG (TEMP-RAD CENTRAL WAVE NUMBER) 1/M 8 0 30 025199 BANDWIDTH CORRECTION COEFFICIENT 1 NUMERIC 4 -10000 15 025200 BANDWIDTH CORRECTION COEFFICIENT 2 NUMERIC 5 0 17 025201 ALBEDO-RAD SOLAR FILTERED IRRADIANCE NUMERIC 4 0 24 025202 ALBEDO-RAD EQUIVALENT FILTER WIDTH NUMERIC 10 0 14 025203 SCAN LINE STATUS FLAGS FOR ATOVS FLAG TABLE 25081 0 0 31 025204 SCAN LINE QUALITY FLAGS FOR ATOVS FLAG TABLE 25082 0 0 31 025205 CHANNEL QUALITY FLAGS FOR ATOVS FLAG TABLE 25083 0 0 31 025206 FOV QUALITY FLAGS FOR ATOVS FLAG TABLE 25084 0 0 31 026001 PRINCIPAL TIME OF DAILY READING IN UTC OF MAXIMUM TEMPERATURE HOUR 1 0 12 026002 PRINCIPAL TIME OF DAILY READING IN UTC OF MINIMUM TEMPERATURE HOUR 1 0 12 026003 TIME DIFFERENCE MINUTE 0 -1440 12 026010 HOURS INCLUDED FLAG TABLE 026010 0 0 26 026020 DURATION OF PRECIPITATION MINUTE 0 0 11 026193 YEAR YEAR 0 0 12 026194 MONTH MONTH 0 0 4 026195 DAY DAY 0 0 6 026196 HOUR HOUR 0 0 5 026197 MINUTE MINUTE 0 0 6 026198 SECOND SECOND 0 0 6 026200 LOCATION WITHIN ASSIMILATION WINDOW IN TIME NUMERIC 6 0 20 026201 HOURS INCLUDED FLAG TABLE 26201 0 0 26 027001 LATITUDE(HIGH ACCURACY) DEGREE 5 -9000000 25 027002 LATITUDE(COARSE ACCURACY) DEGREE 2 -9000 15 027003 ALTERNATE LATITUDE DEGREE 2 -9000 15 027004 ALTERNATE LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25 027020 SATELLITE LOCATION COUNTER NUMERIC 0 0 16 027021 SATELLITE SUBLOCATION DIMENSION NUMERIC 0 0 16 027031 IN DIRECTION OF 0 DEGREES LONGITUDE, DISTANCE FROM THE EARTH'S C M 2 -1073741824 31 027035 LENGTH OF PHENOMENON M -3 0 13 027080 VIEWING AZIMUTH ANGLE DEGREE TRUE 2 0 16 027193 SOLAR AZIMUTH DEGREE TRUE 2 0 16 028001 LONGITUDE(HIGH ACCURACY) DEGREE 5 -18000000 26 028002 LONGITUDE(COARSE ACCURACY) DEGREE 2 -18000 16 028003 ALTERNATE LONGITUDE DEGREE 2 -18000 16 028004 ALTERNATE LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26 028031 IN DIRECTION 90 DEGREES EAST,DISTANCE FROM THE EARTH'S CENTRE M 2 -1073741824 31 028035 WIDTH OF PHENOMENON M -3 0 13 029001 PROJECTION TYPE CODE TABLE 029001 0 0 3 029002 COORDINATE GRID TYPE CODE TABLE 029002 0 0 3 030001 PIXEL VALUE(4 BITS) NUMERIC 0 0 4 030002 PIXEL VALUE(8 BITS) NUMERIC 0 0 8 030004 PIXEL VALUE(16 BITS) NUMERIC 0 0 16 030021 NUMBER OF PIXELS PER ROW NUMERIC 0 0 12 030022 NUMBER OF PIXELS PER COLUMN NUMERIC 0 0 12 030031 PICTURE TYPE CODE TABLE 030031 0 0 4 030032 COMBINATION WITH OTHER DATA FLAG TABLE 030032 0 0 16 030193 POSITION NUMBER ALONG SCAN NUMERIC 0 0 8 031000 SHORT DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 1 031001 DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 8 031002 EXTENDED DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 16 031011 DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 8 031012 EXTENDED DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 16 031021 ASSOCIATED FIELD SIGNIFICANCE CODE TABLE 031021 0 0 6 031031 DATA PRESENT INDICATOR FLAG TABLE 031031 0 0 1 031192 DATA PRESENT INDICATOR NUMERIC 0 0 1 033002 QUALITY INFORMATION CODE TABLE 033002 0 0 2 033003 QUALITY INFORMATION CODE TABLE 033003 0 0 3 033005 QUALITY INFORMATION (AWS DATA) FLAG TABLE 033005 0 0 30 033006 INTERNAL MEASUREMENT STATUS INFORMATION (AWS) CODE TABLE 033006 0 0 3 033007 % CONFIDENCE % 0 0 7 033020 QUALITY CONTROL INDICATION OF FOLLOWING VALUE CODE TABLE 033020 0 0 3 033021 QUALITY OF FOLLOWING VALUE CODE TABLE 033021 0 0 2 033022 QUALITY OF BUOY SATELLITE TRANSMISSION CODE TABLE 033022 0 0 2 033023 QUALITY OF BUOY LOCATION CODE TABLE 033023 0 0 2 033024 STATION ELEVATION QUALITY MARK (FOR MOBILE STATION) CODE TABLE 033024 0 0 4 033025 ACARS INTERPOLATED VALUES CODE TABLE 033025 0 0 3 033026 MIXING RATIO QUALITY CODE TABLE 033026 0 0 6 033027 LOCATION QUALITY CLASS (RANGE OF RADIUS OF 66% CONFIDENCE) CODE TABLE 033027 0 0 3 033030 SCAN LINE STATUS FLAGS FOR ATOVS FLAG TABLE 033030 0 0 24 033031 SCAN LINE QUALITY FLAGS FOR ATOVS FLAG TABLE 033031 0 0 24 033032 CHANNEL QUALITY FLAGS FOR ATOVS FLAG TABLE 033032 0 0 24 033033 FIELD OF VIEW QUALITY FLAGS FOR ATOVS FLAG TABLE 033033 0 0 24 033035 MANUAL/AUTOMATIC QUALITY CONTROL CODE TABLE 033035 0 0 4 033036 NOMINAL CONFIDENCE THRESHOLD % 0 0 7 033037 WIND CORRELATION ERROR FLAG TABLE 033037 0 0 20 033038 QUALITY FLAG FOR GROUND BASED GNSS DATA FLAG TABLE 033038 0 0 10 033040 CONFIDENCE INTERVAL % 0 0 7 033041 ATTRIBUTE OF FOLLOWING VALUE CODE TABLE 033041 0 0 2 033043 AST CONFIDENCE FLAG TABLE 033043 0 0 8 033044 ASAR QUALITY INFORMATION FLAG TABLE 033044 0 0 15 033047 MEASUREMENT CONFIDENCE DATA FLAG TABLE 033047 0 0 31 033048 CONFIDENCE MEASURE OF SAR INVERSION CODE TABLE 033048 0 0 2 033049 CONFIDENCE MEASURE OF WIND RETIEVAL CODE TABLE 033049 0 0 2 033050 GLOBAL GTSPP QUALITY FLAG CODE TABLE 033050 0 0 4 033051 ASAR QUALITY INFORMATION FLAG TABLE 033051 0 0 15 033052 S BAND OCEAN RETRACKING QUALITY FLAG TABLE 033052 0 0 21 033053 KU BAND OCEAN RETRACKING QUALITY FLAG TABLE 033053 0 0 21 033054 DATA EXTRACTION INDICATOR FLAG TABLE 033054 0 0 8 033192 TEM1 CONFIDENCE % 0 0 7 033193 DATA QUALITY 3 BIT CODE CODE TABLE 33193 0 0 3 033194 DATA QUALITY 2 BIT CODE CODE TABLE 33194 0 0 2 033195 ECMWF SAR QC INDICATOR CODE TABLE 33195 0 0 5 033196 ECMWF WAM QC INDICATOR CODE TABLE 33196 0 0 2 033197 ECMWF SAR INVERSION QC INDICATOR CODE TABLE 33197 0 0 3 033198 MINIMUM COST NUMERIC 4 0 14 033199 1D VAR TOTAL PRECIPITABLE WATER RETRIEVED ERROR(S) KG/M**2 2 0 11 033200 ANALYSIS REPORT EVENTS FLAG TABLE 33200 0 0 31 033201 ANALYSIS REPORT STATUS EVENT FLAG TABLE 33201 0 0 13 033202 ANALYSIS DATUM EVENT FLAGS (1) FLAG TABLE 33202 0 0 31 033203 ANALYSIS DATUM EVENT FLAGS (2) FLAG TABLE 33203 0 0 11 033204 ANALYSIS DATUM STATUS FLAGS FLAG TABLE 33204 0 0 21 033205 VARIATIONAL ANALYSIS BLACK LIST FLAG CODE TABLE 33205 0 0 4 033206 VARIATIONAL ANALYSIS QUALITY CONTROL FLAG CODE TABLE 33206 0 0 4 033207 VARIATIONAL ANALYSIS DEPARTURE FLAG CODE TABLE 33207 0 0 4 033208 VARIATIONAL ANALYSIS FIRST QUESS CHECK FLAG CODE TABLE 033208 0 0 4 033209 VARIATIONAL ANALYSIS FINAL FLAG CODE TABLE 33209 0 0 4 033210 INCREMENTAL VARIATIONAL ANALYSIS UPDATE NUMBER NUMERIC 0 0 7 033211 MINIMISATION SIMULATION NUMBER NUMERIC 0 0 10 033212 1D VAR ITERATION NUMBER NUMERIC 0 0 10 033213 1D VAR RADIANCE COST NUMERIC 1 -1000 11 033214 1D VAR ERROR(S) FLAG TABLE 33214 0 0 11 033215 DIRECTIONAL SKILL NUMERIC 1 -4096 13 033216 1D VAR SURFACE TYPE QUALITY CONTROL CODE TABLE 33216 0 0 3 033217 1D VAR FAILURE INDICATOR CODE TABLE 33217 0 0 2 033218 1D VAR ESTIMATE OF SCATTERING NUMERIC 2 0 12 033219 SSMI INDIPENDENT SCATTERING INDEX NUMERIC 2 -50000 16 033220 VARIATIONAL ANALYSIS REPORT EVENTS (1) FLAG TABLE 33220 0 0 31 033221 VARIATIONAL ANALYSIS SYNOP EVENTS (2) FLAG TABLE 33221 0 0 31 033222 VARIATIONAL ANALYSIS AIREP EVENTS (2) FLAG TABLE 33222 0 0 31 033223 VARIATIONAL ANALYSIS SATOB EVENTS (2) FLAG TABLE 33223 0 0 31 033224 VARIATIONAL ANALYSIS DRIBU EVENTS (2) FLAG TABLE 33224 0 0 31 033225 VARIATIONAL ANALYSIS TEMP EVENTS (2) FLAG TABLE 33225 0 0 31 033226 VARIATIONAL ANALYSIS PILOT EVENTS (2) FLAG TABLE 33226 0 0 31 033227 VARIATIONAL ANALYSIS SATEM/TOVS EVENTS (2) FLAG TABLE 33227 0 0 31 033228 VARIATIONAL ANALYSIS PAOB EVENTS (2) FLAG TABLE 33228 0 0 31 033229 VARIATIONAL ANALYSIS SCATTEROMETER EVENTS (2) FLAG TABLE 33229 0 0 31 033230 VARIATIONAL ANALYSIS RAW RADIANCES EVENTS (2) FLAG TABLE 33230 0 0 31 033231 PRESAT SUMMARY FLAGS FLAG TABLE 33231 0 0 6 033232 REPORT BLACK LIST EVENTS FLAG TABLE 33232 0 0 31 033233 VARIATIONAL ANALYSIS REPORT STATUS FLAG TABLE 33233 0 0 31 033234 VARIATIONAL ANALYSIS DATUM STATUS FLAG TABLE 33234 0 0 31 033236 VARIATIONAL ANALYSIS DATUM EVENTS (1) FLAG TABLE 33236 0 0 31 033237 VARIATIONAL ANALYSIS SYNOP DATUM EVENTS (2) FLAG TABLE 033237 0 0 31 033238 VARIATIONAL ANALYSIS AIREP DATUM EVENTS (2) FLAG TABLE 033238 0 0 31 033239 VARIATIONAL ANALYSIS SATOB DATUM EVENTS (2) FLAG TABLE 033239 0 0 31 033240 VARIATIONAL ANALYSIS DRIBU DATUM EVENTS (2) FLAG TABLE 033240 0 0 31 033241 GROSS ERROR PROBABILITY NUMERIC 3 0 10 033242 GROSS ERROR INDICATOR CODE TABLE 33242 0 0 2 033243 VARIATIONAL ANALYSIS TEMP DATUM EVENTS (2) FLAG TABLE 33243 0 0 31 033244 VARIATIONAL ANALYSIS PILOT DATUM EVENTS (2) FLAG TABLE 033244 0 0 31 033245 VARIATIONAL ANALYSIS SATEM/TOVS DATUM EVENTS (2) FLAG TABLE 33245 0 0 31 033246 VARIATIONAL ANALYSIS PAOB DATUM EVENTS (2) FLAG TABLE 33246 0 0 31 033247 VARIATIONAL ANALYSIS SCATTEROMETER DATUM EVENTS (2) FLAG TABLE 33247 0 0 31 033248 VARIATIONAL ANALYSIS RAW RADIANCES DATUM EVENTS (2) FLAG TABLE 33248 0 0 31 033249 DATUM BLACK LIST EVENTS FLAG TABLE 33249 0 0 31 033250 PROBABILITY OF GROSS ERROR NUMERIC 6 0 20 033251 RANGE OF POSSIBLE VALUES NUMERIC 2 0 14 033252 MANUAL-AUTOMATIC QUALITY CONTROL CODE TABLE 33252 0 0 4 033253 NOMINAL CONFIDENCE THRESHOLD % 0 0 7 033254 WIND CORRELATION METHOD FLAG TABLE 33254 0 0 20 035000 FM AND REGIONAL CODE NUMBER CODE TABLE 035000 0 0 10 035001 TIME-FRAME FOR MONITORING CODE TABLE 035001 0 0 3 035011 NUMBER OF REPORTS ACTUALLY RECEIVED NUMERIC 0 0 14 035021 BULLETIN BEING MONITORED (TTAAII) CCITTIA5 0 0 48 035022 BULLETIN BEING MONITORED (YYGGGG) CCITTIA5 0 0 48 035023 BULLETIN BEING MONITORED (CCCC) CCITTIA5 0 0 32 035024 BULLETIN BEING MONITORED (BBB) CCITTIA5 0 0 24 035030 DISCREPANCIES IN THE AVAILABILITY OF EXPECTED DATA CODE TABLE 035030 0 0 4 035031 QUALIFIER ON MONITORING RESULTS CODE TABLE 035031 0 0 7 035032 CAUSE OF MISSING DATA CODE TABLE 035032 0 0 4 035033 OBSERVATION AND COLLECTION DEFICIENCIES CODE TABLE 035033 0 0 7 035034 STATISTICAL TRENDS FOR AVAILABILITY OF DATA (DURING THE SURVEY P CODE TABLE 035034 0 0 3 049193 SAR INVERSION QC FLAGS FLAG TABLE 49193 0 0 15 049194 ALTIMETER WAVE HEIGHT QC FLAFS FLAG TABLE 49194 0 0 15 062190 STATISTICS APPLICATION CODE TABLE 62190 0 0 8 062191 TYPE OF STATISTICS CODE TABLE 62191 0 0 8 063190 APPLICATION DERIVING SUBSTITUTE OR ALTERNATIVE VALUE CODE TABLE 63190 0 0 8 dballe-5.18/extra/aof/0000755000175000017500000000000011450654610011565 500000000000000dballe-5.18/extra/aof/err1.aof0000644000175000017500000000056411173330007013043 000000000000008 g2M<8D4g2M<SwSwDlN6OGg@2a A  $J llN6OGg@2a A  )$< ldballe-5.18/extra/aof/confship.aof0000644000175000017500000000044011173330007013774 000000000000008 i2<8Di2<0=w0=wD#J8F,C2d3ز ? ^(6 dballe-5.18/extra/aof/aof_28-2-144.aof0000644000175000017500000000040411173330007013706 000000000000008 g2I<8D4g2I<MtwMtwDp7 Hg2"  m pdballe-5.18/extra/aof/aof_28-2-244.aof0000644000175000017500000000040411173330007013707 000000000000008 g2I<8D4g2I<MtwMtwDp 8Fg2C&1A)L? - /pdballe-5.18/extra/aof/obs5-36.30.aof0000644000175000017500000000364411173330007013513 000000000000008 1Q<8D41QB1ͪ0,1? '82 U '2  %bF $"< c 'v #7 "A!A  !42 '    #   &   0   p T#  @#   e ]   _ Q h  X^   }a J } ; , p1 > ec r6   / ' o E f   -5  J     j [  "   %   %"  P"    *7  t'  4.  "   / v  "'  ' 7 n  uA3 6 B6 mI S1 B; aRG c@1Bl@!bT3@SOB,O%^  JBJBTh+ YB0dballe-5.18/extra/aof/obs6-32.1573.aof0000644000175000017500000000106411173330007013657 000000000000008 1Q<8D41QA A![fM & 8s@BBlNRA P?qX ȃ +ZvPB!B1 F4hѣF\hѥƍ\hѥƍ\hѥƍ\hѥƍ\hѥƍ\hѥƍ4hѣ7777dballe-5.18/extra/aof/obs1-14.63.aof0000644000175000017500000000043011173330007013477 000000000000008 1Q<8D41QXMG1ͪ0,?   H APdballe-5.18/extra/aof/obs1-24.2104.bufr0000644000175000017500000000030611173330007014031 00000000000000BUFRb   4 }KyGeư61001 y@y\F  ŖA" A"!X61001 [JNY ѣF4h֭F6|hҥF4hѣF>|hр7777dballe-5.18/extra/aof/obs2-144.2198.aof0000644000175000017500000000040011173330007013734 000000000000008 1Q<8D41Q2X-! 18(#Q HQ=_7@L (.~ @?ίT0z #~B P h vck@ftJ C}AFf0X Ais ɵ_ 6CfvAB, f1A [>m;B 8  c\ci@LW˸@"qtXq+n)@D D įA@_87hV@>dNtvp@pq#N>uF 6 /@N^NKOZ ѣF4h֭F6|h&ƟV4hѣF>|hр7777dballe-5.18/extra/aof/obs1-14.63.bufr0000644000175000017500000000033411173330007013673 00000000000000BUFRb  4}KyKwVy01015 yyF  A1 A1!no0>[{P%jg_ hѣF4hѣF4iRF4hѣK>4hѣF4hѣF4`7777dballe-5.18/extra/aof/obs2-244.0.aof0000644000175000017500000000040011173330007013471 000000000000008 2<8D42gL-}@[M?]@؉K $@#/ .} D._P/KJE9͂`_nX|?^`JB\@c?A ï$@V3a>=  @p8Cp8Äp hѣFbhѣF4ѣF4hFiQF.4hѥƍ4ѣR*4hѥƍ5(ңF\hѣK4iqF.4hѩF4hFJ4ѣO4hF>4hѣR*4hFJ4ѣK4ѣR*4hF.4hF.4hԣJ4ѣK4ѣK5(ңF.4hF.4hFJ4ѣK4ѣK5(ңF.4hFJ4ѣK4ѣR*4hF.4hF07777dballe-5.18/extra/test-crex-table.txt0000644000175000017500000044750411173330007014513 00000000000000 000001 TABLE A: ENTRY CCITTIA5 0 0 24 CHARACTER 0 3 000002 TABLE A: DATA CATEGORY DESCRIPTION, LINE 1 CCITTIA5 0 0 256 CHARACTER 0 32 000003 TABLE A: DATA CATEGORY DESCRIPTION, LINE 2 CCITTIA5 0 0 256 CHARACTER 0 32 000005 BUFR/CREX EDITION NUMBER CCITTIA5 0 0 24 CHARACTER 0 3 000010 F DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 8 CHARACTER 0 1 000011 X DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 16 CHARACTER 0 2 000012 Y DESCRIPTOR TO BE ADDED OR DEFINED CCITTIA5 0 0 24 CHARACTER 0 3 000013 ELEMENT NAME, LINE 1 CCITTIA5 0 0 256 CHARACTER 0 32 000014 ELEMENT NAME, LINE 2 CCITTIA5 0 0 256 CHARACTER 0 32 000015 UNITS NAME CCITTIA5 0 0 192 CHARACTER 0 24 000016 UNITS SCALE SIGN CCITTIA5 0 0 8 CHARACTER 0 1 000017 UNITS SCALE CCITTIA5 0 0 24 CHARACTER 0 3 000018 UNITS REFERENCE SIGN CCITTIA5 0 0 8 CHARACTER 0 1 000019 UNITS REFERENCE VALUE CCITTIA5 0 0 80 CHARACTER 0 10 000020 ELEMENT DATA WIDTH CCITTIA5 0 0 24 CHARACTER 0 3 000030 DESCRIPTOR DEFINING SEQUENCE CCITTIA5 0 0 48 CHARACTER 0 6 001001 WMO BLOCK NUMBER NUMERIC 0 0 7 NUMERIC 0 2 001002 WMO STATION NUMBER NUMERIC 0 0 10 NUMERIC 0 3 001003 WMO REGION NUMBER/GEOGRAPHICAL AREA CODE TABLE 1003 0 0 3 CODE TABLE 1003 0 1 001004 WMO REGION SUB-AREA (SEE NOTE 9) NUMERIC 0 0 3 NUMERIC 0 1 001005 BUOY/PLATFORM IDENTIFIER NUMERIC 0 0 17 NUMERIC 0 5 001006 AIRCRAFT FLIGHT NUMBER CCITTIA5 0 0 64 CHARACTER 0 8 001007 SATELLITE IDENTIFIER CODE TABLE 1007 0 0 10 CODE TABLE 1007 0 4 001008 AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION CCITTIA5 0 0 64 CHARACTER 0 8 001009 TYPE OF COMMERCIAL AIRCRAFT CCITTIA5 0 0 64 CHARACTER 0 8 001010 STATIONARY BUOY PLATFORM IDENTIFIER; E.G. C-MAN BUOYS CCITTIA5 0 0 64 CHARACTER 0 8 001011 SHIP OR MOBILE LAND STATION IDENTIFIER CCITTIA5 0 0 72 CHARACTER 0 9 001012 DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 001013 SPEED OF MOTION OF MOVING OBSERVING PLATFORM* M/S 0 0 10 M/S 0 3 001014 PLATFORM DRIFT SPEED (HIGH PRECISION) M/S 2 0 10 M/S 2 4 001015 STATION OR SITE NAME CCITTIA5 0 0 160 CHARACTER 0 20 001018 SHORT STATION OR SITE NAME CCITTIA5 0 0 40 CHARACTER 0 5 001019 LONG STATION OR SITE NAME CCITTIA5 0 0 256 CHARACTER 0 32 001020 WMO REGION SUB-AREA NUMERIC 0 0 4 NUMERIC 0 2 001021 SYNOPTIC FEATURE IDENTIFIER NUMERIC 0 0 14 NUMERIC 0 4 001022 NAME OF FEATURE (SEE NOTE 11) CCITTIA5 0 0 224 CHARACTER 0 28 001023 OBSERVATION SEQUENCE NUMBER NUMERIC 0 0 9 NUMERIC 0 3 001025 STORM IDENTIFIER CCITTIA5 0 0 24 CHARACTER 0 3 001026 WMO STORM NAME CCITTIA5 0 0 64 CHARACTER 0 8 001027 WMO LONG STORM NAME CCITTIA5 0 0 80 CHARACTER 0 10 001031 IDENTIFICATION OF ORIGINATING/GENERATING CENTRE (SEE NOTE 10) CODE TABLE 1031 0 0 16 CODE TABLE 1031 0 5 001032 GENERATING APPLICATION CODE TABLE 1032 0 0 8 CODE TABLE 1032 0 3 001033 IDENTIFICATION OF ORIGINATING/GENERATING CENTRE CODE TABLE 1022 0 0 8 CODE TABLE 1033 0 3 001034 IDENTIFICATION OF ORIGINATING/GENERATING SUB-CENTRE CODE TABLE 1034 0 0 8 CODE TABLE 1034 0 3 001035 ORIGINATING CENTRE CODE TABLE 1035 0 0 16 CODE TABLE 1035 0 5 001036 AGENCY IN CHARGE OF OPERATING THE OBSERVING PLATFORM CODE TABLE 1036 0 0 20 CODE TABLE 1036 0 7 001041 ABSOLUTE PLATFORM VELOCITY - FIRST COMPONENT (SEE NOTE 6) M/S 5 -1073741824 31 M/S 5 10 001042 ABSOLUTE PLATFORM VELOCITY - SECOND COMPONENT (SEE NOTE 6) M/S 5 -1073741824 31 M/S 5 10 001043 ABSOLUTE PLATFORM VELOCITY - THIRD COMPONENT (SEE NOTE 6) M/S 5 -1073741824 31 M/S 5 10 001050 PLATFORM TRANSMITTER ID NUMBER NUMERIC 0 0 17 NUMERIC 0 6 001051 PLATFORM TRANSMITTER ID NUMBER CCITTIA5 0 0 96 CHARACTER 0 12 001060 AIRCRAFT REPORTING POINT (BEACON IDENTIFIER) CCITTIA5 0 0 64 CHARACTER 0 8 001062 SHORT ICAO LOCATION INDICATOR CCITTIA5 0 0 32 CHARACTER 0 4 001063 ICAO LOCATION INDICATOR CCITTIA5 0 0 64 CHARACTER 0 8 001064 RUNWAY DESIGNATOR CCITTIA5 0 0 32 CHARACTER 0 4 001075 TIDE STATION IDENTIFICATION CCITTIA5 0 0 40 CHARACTER 0 5 001080 SHIP LINE NUMBER ACCORDING TO SOOP CCITTIA5 0 0 32 CHARACTER 0 4 001081 RADIOSONDE SERIAL NUMBER CCITTIA5 0 0 160 CHARACTER 0 20 001082 RADIOSONDE ASCENSION NUMBER (SEE NOTE 12) NUMERIC 0 0 14 NUMERIC 0 4 001083 RADIOSONDE RELEASE NUMBER (SEE NOTE 12) NUMERIC 0 0 3 NUMERIC 0 1 001085 OBSERVING PLATFORM MANUFACTURER'S MODEL CCITTIA5 0 0 160 CHARACTER 0 20 001086 OBSERVING PLATFORM MANUFACTURER'S SERIAL NUMBER CCITTIA5 0 0 256 CHARACTER 0 32 001090 TECHNIQUE FOR MAKING UP INITIAL PERTURBATIONS CODE TABLE 1090 0 0 8 CODE TABLE 1090 0 3 001091 ENSEMBLE MEMBER NUMBER NUMERIC 0 0 10 NUMERIC 0 4 001092 TYPE OF ENSEMBLE FORECAST CODE TABLE 1092 0 0 8 CODE TABLE 1092 0 3 001093 BALLOON LOT NUMBER CCITTIA5 0 0 96 CHARACTER 0 12 001094 WBAN NUMBER NUMERIC 0 0 17 NUMERIC 0 5 001095 OBSERVER IDENTIFICATION CCITTIA5 0 0 32 CHARACTER 0 4 001196 CONSTANT LEVEL BALLOON IDENTIFIER CCITTIA5 0 0 72 CHARACTER 0 9 001197 RTP - PLATFORM TYPE CODE TABLE 1197 0 0 10 CODE TABLE 0 4 001198 ITP - DECK ID CODE TABLE 1198 0 0 10 CODE TABLE 0 4 001199 DUP - DUPLICATE STATUS CODE TABLE 1199 0 0 4 CODE TABLE 0 2 001201 GENERATING APPLICATION CODE TABLE 1201 0 0 8 CODE TABLE 0 3 001205 SATELLITE IDENTIFIER CODE TABLE 1205 0 0 10 CODE TABLE 0 4 001208 VELOCITY OF PLATFORM, X M/S 5 -1073741824 31 M/S 5 10 001209 VELOCITY OF PLATFORM, Y M/S 5 -1073741824 31 M/S 5 10 001210 VELOCITY OF PLATFORM, Z M/S 5 -1073741824 31 M/S 5 10 002001 TYPE OF STATION CODE TABLE 2001 0 0 2 CODE TABLE 2001 0 1 002002 TYPE OF INSTRUMENTATION FOR WIND MEASUREMENT FLAG TABLE 2002 0 0 4 FLAG TABLE 2002 0 2 002003 TYPE OF MEASURING EQUIPMENT USED CODE TABLE 2003 0 0 4 CODE TABLE 2003 0 2 002004 TYPE OF INSTRUMENTATION FOR EVAPORATION MEASUREMENT OR TYPE OF C CODE TABLE 2004 0 0 4 CODE TABLE 2004 0 2 002005 PRECISION OF TEMPERATURE OBSERVATION K 2 0 7 K 2 3 002011 RADIOSONDE TYPE CODE TABLE 2011 0 0 8 CODE TABLE 2011 0 3 002012 RADIOSONDE COMPUTATIONAL METHOD CODE TABLE 2012 0 0 4 CODE TABLE 2012 0 2 002013 SOLAR AND INFRARED RADIATION CORRECTION CODE TABLE 2013 0 0 4 CODE TABLE 2013 0 2 002014 TRACKING TECHNIQUE/STATUS OF SYSTEM USED CODE TABLE 2014 0 0 7 CODE TABLE 2014 0 3 002015 RADIOSONDE COMPLETENESS CODE TABLE 2015 0 0 4 CODE TABLE 2015 0 2 002016 RADIOSONDE CONFIGURATION FLAG TABLE 2016 0 0 5 FLAG TABLE 2016 0 2 002019 SATELLITE INSTRUMENTS CODE TABLE 2019 0 0 11 CODE TABLE 2019 0 4 002020 SATELLITE CLASSIFICATION CODE TABLE 2020 0 0 9 CODE TABLE 2020 0 3 002021 SATELLITE INSTRUMENT DATA USED IN PROCESSING FLAG TABLE 2021 0 0 9 FLAG TABLE 2021 0 3 002022 SATELLITE DATA-PROCESSING TECHNIQUE USED FLAG TABLE 2022 0 0 8 FLAG TABLE 2022 0 3 002023 SATELLITE DERIVED WIND COMPUTATION METHOD CODE TABLE 2023 0 0 4 CODE TABLE 2023 0 2 002024 INTEGRATED MEAN HUMIDITY COMPUTATIONAL METHOD CODE TABLE 2024 0 0 4 CODE TABLE 2024 0 2 002025 SATELLITE CHANNEL(S) USED IN COMPUTATION FLAG TABLE 2025 0 0 25 FLAG TABLE 2025 0 9 002026 CROSS TRACK RESOLUTION M 2 0 12 M 2 4 002027 ALONG TRACK RESOLUTION M 2 0 12 M 2 4 002028 SEGMENT SIZE AT NADIR IN X DIRECTION M 0 0 18 M 0 6 002029 SEGMENT SIZE AT NADIR IN Y DIRECTION M 0 0 18 M 0 6 002030 METHOD OF CURRENT MEASUREMENT CODE TABLE 2030 0 0 3 CODE TABLE 2030 0 1 002031 DURATION AND TIME OF CURRENT MEASUREMENT CODE TABLE 2031 0 0 5 CODE TABLE 2031 0 2 002032 INDICATOR FOR DIGITIZATION CODE TABLE 2032 0 0 2 CODE TABLE 2032 0 1 002033 METHOD OF SALINITY/DEPTH MEASUREMENT CODE TABLE 2033 0 0 3 CODE TABLE 2033 0 1 002034 DROGUE TYPE CODE TABLE 2034 0 0 5 CODE TABLE 2034 0 2 002035 CABLE LENGTH M 0 0 9 M 0 3 002036 BUOY TYPE CODE TABLE 2036 0 0 2 CODE TABLE 2036 0 1 002037 METHOD OF TIDAL OBSERVATION CODE TABLE 2037 0 0 3 CODE TABLE 2037 0 1 002038 METHOD OF WATER TEMPERATURE AND/OR SALINITY MEASUREMENT CODE TABLE 2038 0 0 4 CODE TABLE 2038 0 2 002039 METHOD OF WET-BULB TEMPERATURE MEASUREMENT CODE TABLE 2039 0 0 3 CODE TABLE 2039 0 1 002040 METHOD OF REMOVING VELOCITY AND MOTION OF PLATFORM FROM CURRENT CODE TABLE 2040 0 0 4 CODE TABLE 2040 0 2 002041 METHOD FOR ESTIMATING REPORTS RELATED TO SYNOPTIC FEATURES CODE TABLE 2041 0 0 6 CODE TABLE 2041 0 2 002044 INDICATOR FOR METHOD OF CALCULATING SPECTRAL WAVE DATA CODE TABLE 2044 0 0 4 CODE TABLE 2044 0 2 002045 INDICATOR FOR TYPE OF PLATFORM CODE TABLE 2045 0 0 4 CODE TABLE 2045 0 2 002046 WAVE MEASUREMENT INSTRUMENTATION CODE TABLE 2046 0 0 4 CODE TABLE 2046 0 2 002048 SATELLITE SENSOR INDICATOR CODE TABLE 2048 0 0 4 CODE TABLE 2048 0 2 002049 GEOSTATIONARY SATELLITE DATA-PROCESSING TECHNIQUE USED FLAG TABLE 2049 0 0 8 FLAG TABLE 2049 0 3 002050 GEOSTATIONARY SOUNDER SATELLITE CHANNELS USED FLAG TABLE 2050 0 0 20 FLAG TABLE 2050 0 7 002051 INDICATOR TO SPECIFY OBSERVING METHOD FOR EXTREME TEMPERATURES CODE TABLE 2051 0 0 4 CODE TABLE 2051 0 2 002052 GEOSTATIONARY IMAGER SATELLITE CHANNELS USED FLAG TABLE 2052 0 0 6 FLAG TABLE 2052 0 2 002053 GOES-I/M BRIGHTNESS TEMPERATURE CHARACTERISTICS CODE TABLE 2053 0 0 4 CODE TABLE 2053 0 2 002054 GOES-I/M SOUNDINGS PARAMETER CHARACTERISTICS CODE TABLE 2054 0 0 4 CODE TABLE 2054 0 2 002055 GEOSTATIONARY SOUNDINGS STATISTICAL PARAMETERS CODE TABLE 2055 0 0 4 CODE TABLE 2055 0 2 002056 GEOSTATIONARY SOUNDINGS ACCURACY STATISTICS CODE TABLE 2056 0 0 4 CODE TABLE 2056 0 2 002057 ORIGIN OF FIRST GUESS INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2057 0 0 4 CODE TABLE 2057 0 2 002058 VALID TIMES OF FIRST GUESS INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2058 0 0 4 CODE TABLE 2058 0 2 002059 ORIGIN OF ANALYSIS INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2059 0 0 4 CODE TABLE 2059 0 2 002060 ORIGIN OF SURFACE INFORMATION FOR GOES-I/M SOUNDINGS CODE TABLE 2060 0 0 4 CODE TABLE 2060 0 2 002061 AIRCRAFT NAVIGATIONAL SYSTEM CODE TABLE 2061 0 0 3 CODE TABLE 2061 0 1 002062 TYPE OF AIRCRAFT DATA RELAY SYSTEM CODE TABLE 2062 0 0 4 CODE TABLE 2062 0 2 002063 AIRCRAFT ROLL ANGLE DEGREE 2 -18000 16 DEGREE 2 5 002064 AIRCRAFT ROLL ANGLE QUALITY CODE TABLE 2064 0 0 2 CODE TABLE 2064 0 1 002065 ACARS GROUND RECEIVING STATION CCITTIA5 0 0 40 CHARACTER 0 5 002066 RADIOSONDE GROUND RECEIVING SYSTEM CODE TABLE 2066 0 0 6 CODE TABLE 2066 0 2 002067 RADIOSONDE OPERATING FREQUENCY Hz -5 0 15 Hz -5 5 002070 ORIGINAL SPECIFICATION OF LATITUDE/LONGITUDE CODE TABLE 2070 0 0 4 CODE TABLE 2070 0 2 002080 BALLOON MANUFACTURER CODE TABLE 2080 0 0 6 CODE TABLE 2080 0 2 002081 TYPE OF BALLOON CODE TABLE 2081 0 0 5 CODE TABLE 2081 0 2 002082 WEIGHT OF BALLOON KG 3 0 12 KG 3 4 002083 TYPE OF BALLOON SHELTER CODE TABLE 2083 0 0 4 CODE TABLE 2083 0 2 002084 TYPE OF GAS USED IN BALLOON CODE TABLE 2084 0 0 4 CODE TABLE 2084 0 2 002085 AMOUNT OF GAS USED IN BALLOON KG 3 0 13 KG 3 4 002086 BALLOON FLIGHT TRAIN LENGTH M 1 0 10 M 1 4 002091 ENTRY SENSOR 4/20 MA A 4 0 10 A 4 3 002095 TYPE OF PRESSURE SENSOR CODE TABLE 2095 0 0 5 CODE TABLE 2095 0 2 002096 TYPE OF TEMPERATURE SENSOR CODE TABLE 2096 0 0 5 CODE TABLE 2096 0 2 002097 TYPE OF HUMIDITY SENSOR CODE TABLE 2097 0 0 5 CODE TABLE 2097 0 2 002100 RADAR CONSTANT dB 1 0 12 dB 1 4 002101 TYPE OF ANTENNA CODE TABLE 2101 0 0 4 CODE TABLE 2101 0 2 002102 ANTENNA HEIGHT ABOVE TOWER BASE M 0 0 8 M 0 3 002103 RADOME FLAG TABLE 2103 0 0 2 FLAG TABLE 2103 0 1 002104 ANTENNA POLARISATION CODE TABLE 2104 0 0 4 CODE TABLE 2104 0 2 002105 MAXIMUM ANTENNA GAIN dB 0 0 6 dB 0 2 002106 3-DB BEAMWIDTH DEGREE 1 0 6 DEGREE 1 2 002107 SIDELOBE SUPPRESSION dB 0 0 6 dB 0 2 002108 CROSSPOL DISCRIMINATION (ON AXIS) dB 0 0 6 dB 0 2 002109 ANTENNA SPEED (AZIMUTH) DEGREE/S 2 0 12 DEGREE/S 2 4 002110 ANTENNA SPEED (ELEVATION) DEGREE/S 2 0 12 DEGREE/S 2 4 002111 RADAR INCIDENCE ANGLE DEGREE 1 0 10 DEGREE 1 4 002112 RADAR LOOK ANGLE DEGREE 1 0 12 DEGREE 1 4 002113 NUMBER OF AZIMUTH LOOKS NUMERIC 0 0 4 NUMERIC 0 2 002114 ANTENNA EFFECTIVE SURFACE AREA M**2 0 0 15 M**2 0 5 002115 TYPE OF SURFACE OBSERVING EQUIPMENT CODE TABLE 2115 0 0 5 CODE TABLE 2115 0 2 002121 MEAN FREQUENCY Hz -8 0 7 Hz -8 3 002122 FREQUENCY AGILITY RANGE Hz -6 -128 8 Hz -6 3 002123 PEAK POWER W -4 0 7 W -4 3 002124 AVERAGE POWER W -1 0 7 W -1 3 002125 PULSE REPETITION FREQUENCY Hz -1 0 8 Hz -1 3 002126 PULSE WIDTH S 7 0 6 S 7 2 002127 RECEIVER INTERMEDIATE FREQUENCY Hz -6 0 7 Hz -6 3 002128 INTERMEDIATE FREQUENCY BANDWIDTH Hz -5 0 6 Hz -5 2 002129 MINIMUM DETECTABLE SIGNAL dB 0 -150 5 dB 0 3 002130 DYNAMIC RANGE dB 0 0 7 dB 0 3 002131 SENSITIVITY TIME CONTROL (STC) FLAG TABLE 2131 0 0 2 FLAG TABLE 2131 0 1 002132 AZIMUTH POINTING ACCURACY DEGREE 2 0 6 DEGREE 2 2 002133 ELEVATION POINTING ACCURACY DEGREE 2 0 6 DEGREE 2 2 002134 ANTENNA BEAM AZIMUTH DEGREE 2 0 16 DEGREE 2 5 002135 ANTENNA ELEVATION DEGREE 2 -9000 15 DEGREE 2 5 002136 RANGE PROCESSED BY RANGE ATTENUATION CORRECTION M -3 0 16 M -3 5 002140 SATELLITE RADAR BEAM AZIMUTH ANGLE DEGREE 0 0 9 DEGREE 0 3 002141 MEASUREMENT TYPE CCITTIA5 0 0 24 CHARACTER 0 3 002142 OZONE INSTRUMENT SERIAL NUMBER/ IDENTIFICATION CCITTIA5 0 0 32 CHARACTER 0 4 002143 OZONE INSTRUMENT TYPE CODE TABLE 2143 0 0 7 CODE TABLE 2143 0 3 002144 LIGHT SOURCE TYPE FOR BREWER SPECTRO PHOTOMETER CODE TABLE 2144 0 0 4 CODE TABLE 2144 0 2 002145 WAVE LENGTH SETTING FOR DOBSON INSTRUMENTS CODE TABLE 2145 0 0 4 CODE TABLE 2145 0 2 002146 SOURCE CONDITIONS FOR DOBSON INSTRUMENTS CODE TABLE 2146 0 0 4 CODE TABLE 2146 0 2 002148 DATA COLLECTION AND/OR LOCATION SYSTEM CODE TABLE 2148 0 0 5 CODE TABLE 2148 0 2 002149 TYPE OF DATA BUOY CODE TABLE 2149 0 0 6 CODE TABLE 2149 0 2 002150 TOVS/ATOVS/AVHRR INSTRUMENTATION CHANNEL NUMBER CODE TABLE 2150 0 0 6 CODE TABLE 2150 0 2 002151 RADIOMETER IDENTIFIER CODE TABLE 2151 0 0 11 CODE TABLE 2151 0 4 002152 SATELLITE INSTRUMENT USED IN DATA PROCESSING(6) FLAG TABLE 2152 0 0 31 FLAG TABLE 2152 0 10 002153 SATELLITE CHANNEL CENTRE FREQUENCY Hz -8 0 26 Hz -8 8 002154 SATELLITE CHANNEL BAND WIDTH Hz -8 0 26 Hz -8 8 002163 HEIGHT ASSIGNMENT METHOD CODE TABLE 2163 0 0 4 CODE TABLE 2163 0 2 002164 TRACER CORRELATION METHOD CODE TABLE 2164 0 0 3 CODE TABLE 2164 0 1 002166 RADIANCE TYPE CODE TABLE 2166 0 0 4 CODE TABLE 2166 0 2 002167 RADIANCE COMPUTATIONAL METHOD CODE TABLE 2167 0 0 4 CODE TABLE 2167 0 2 002168 HYDROSTATIC PRESSURE OF LOWER END OF CABLE (THERMISTOR STRING) PA -3 0 16 KPA 0 5 002169 ANEMOMETER TYPE CODE TABLE 2169 0 0 4 CODE TABLE 2169 0 2 002172 PRODUCT TYPE FOR RETRIEVED ATMOSPHERIC GASES CODE TABLE 2172 0 0 8 CODE TABLE 2172 0 3 002173 SQUARE OF THE OFF NADIR ANGLE (7) DEGREE2 4 0 10 DEGREE2 4 4 002175 METHOD OF PRECIPITATION MEASUREMENT CODE TABLE 2175 0 0 4 CODE TABLE 2175 0 2 002176 METHOD OF STATE OF GROUND MEASUREMENT CODE TABLE 2176 0 0 4 CODE TABLE 2176 0 2 002177 METHOD OF SNOW DEPTH MEASUREMENT CODE TABLE 2177 0 0 4 CODE TABLE 2177 0 2 002178 METHOD OF LIQUID CONTENT MEASUREMENT OF PRECIPITATION CODE TABLE 2178 0 0 4 CODE TABLE 2178 0 2 002179 TYPE OF SKY CONDITION ALGORITHM CODE TABLE 2179 0 0 4 CODE TABLE 2179 0 2 002180 MAIN PRESENT WEATHER DETECTING SYSTEM CODE TABLE 2180 0 0 4 CODE TABLE 2180 0 2 002181 SUPPLEMENTARY PRESENT WEATHER SENSOR FLAG TABLE 2181 0 0 21 FLAG TABLE 2181 0 7 002182 VISIBILITY MEASUREMENT SYSTEM CODE TABLE 2182 0 0 4 CODE TABLE 2182 0 2 002183 CLOUD DETECTION SYSTEM CODE TABLE 2183 0 0 4 CODE TABLE 2183 0 2 002184 TYPE OF LIGHTNING DETECTION SENSOR CODE TABLE 2184 0 0 4 CODE TABLE 2184 0 2 002185 METHOD OF EVAPORATION MEASUREMENT CODE TABLE 2185 0 0 4 CODE TABLE 2185 0 2 002186 CAPABILITY TO DETECT PRECIPITATION PHENOMENA FLAG TABLE 2186 0 0 30 FLAG TABLE 2186 0 10 002187 CAPABILITY TO DETECT OTHER WEATHER PHENOMENA FLAG TABLE 2187 0 0 18 FLAG TABLE 2187 0 6 002188 CAPABILITY TO DETECT OBSCURATION FLAG TABLE 2188 0 0 21 FLAG TABLE 2188 0 7 002189 CAPABILITY TO DISCRIMINATE LIGHTNING STRIKES FLAG TABLE 2189 0 0 12 FLAG TABLE 2189 0 4 002190 LAGRANGIAN DRIFTER SUBMERGENCE (% TIME SUBMERGED) % 0 0 7 % 0 3 002196 SATELLITE CLASSIFICATION CODE TABLE 2196 0 0 9 CODE TABLE 0 3 002197 SATELLITE CHANNEL CENTRE FREQUENCY Hz -8 0 26 Hz -8 8 002198 SATELLITE CHANNEL BAND WIDTH Hz -8 0 26 Hz -8 8 002199 INTEGRATED MEAN HUMIDITY COMPUTATIONAL METHOD CODE TABLE 2199 0 0 4 CODE TABLE 0 2 002221 SEGMENT SIZE AT NADIR IN X DIRECTION M 0 0 18 M 0 6 002222 SEGMENT SIZE AT NADIR IN Y DIRECTION M 0 0 18 M 0 6 002231 HEIGHT ASSIGNMENT METHOD CODE TABLE 2231 0 0 4 CODE TABLE 0 2 002232 TRACER CORRELATION METHOD CODE TABLE 2232 0 0 3 CODE TABLE 0 1 002251 RADIANCE COMPUTATIONAL METHOD CODE TABLE 2251 0 0 4 CODE TABLE 0 2 002252 SATELLITE INSTRUMENT DATA USED IN PROCESSING FLAG TABLE 2252 0 0 31 FLAG TABLE 0 10 002253 HUMIDITY COMPUTATIONAL METHOD CODE TABLE 2253 0 0 8 CODE TABLE 0 3 002254 RADIANCE TYPE CODE TABLE 2254 0 0 4 CODE TABLE 0 2 004001 YEAR YEAR 0 0 12 YEAR 0 4 004002 MONTH MONTH 0 0 4 MONTH 0 2 004003 DAY DAY 0 0 6 DAY 0 2 004004 HOUR HOUR 0 0 5 HOUR 0 2 004005 MINUTE MINUTE 0 0 6 MINUTE 0 2 004006 SECOND SECOND 0 0 6 SECOND 0 2 004007 SECONDS WITHIN A MINUTE (MICROSECOND ACCURACY) SECOND 6 0 26 SECOND 6 8 004011 TIME INCREMENT YEAR 0 -1024 11 YEAR 0 4 004012 TIME INCREMENT MONTH 0 -1024 11 MONTH 0 4 004013 TIME INCREMENT DAY 0 -1024 11 DAY 0 4 004014 TIME INCREMENT HOUR 0 -1024 11 HOUR 0 4 004015 TIME INCREMENT MINUTE 0 -2048 12 MINUTE 0 4 004016 TIME INCREMENT SECOND 0 -4096 13 SECOND 0 4 004017 REFERENCE TIME PERIOD FOR ACCUMULATED OR EXTREME DATA MINUTE 0 -1440 12 MINUTE 0 4 004021 TIME PERIOD OR DISPLACEMENT YEAR 0 -1024 11 YEAR 0 4 004022 TIME PERIOD OR DISPLACEMENT MONTH 0 -1024 11 MONTH 0 4 004023 TIME PERIOD OR DISPLACEMENT DAY 0 -1024 11 DAY 0 4 004024 TIME PERIOD OR DISPLACEMENT HOUR 0 -2048 12 HOUR 0 4 004025 TIME PERIOD OR DISPLACEMENT MINUTE 0 -2048 12 MINUTE 0 4 004026 TIME PERIOD OR DISPLACEMENT SECOND 0 -4096 13 SECOND 0 4 004031 DURATION OF TIME RELATING TO FOLLOWING VALUE HOUR 0 0 8 HOUR 0 3 004032 DURATION OF TIME RELATING TO FOLLOWING VALUE MINUTE 0 0 6 MINUTE 0 2 004041 TIME DIFFERENCE, UTC -LMT (SEE NOTE 6) MINUTE 0 -1440 12 MINUTE 0 4 004043 DAY OF THE YEAR DAY 0 0 9 DAY 0 3 004051 PRINCIPAL TIME OF DAILY READING OF MAXIMUM TEMPERATURE HOUR 0 0 5 HOUR 0 2 004052 PRINCIPAL TIME OF DAILY READING OF MINIMUM TEMPERATURE HOUR 0 0 5 HOUR 0 2 004053 NUMBER OF DAYS WITH PRECIPITATION EQUAL TO OR MORE THAN 1 MM NUMERIC 0 0 6 NUMERIC 0 2 004059 TIMES OF OBSERVATION USED TO COMPUTE THE REPORTED MEAN VALUES FLAG TABLE 4059 0 0 6 FLAG TABLE 4059 0 2 004065 SHORT TIME INCREMENT MINUTE 0 -128 8 MINUTE 0 2 004073 SHORT TIME PERIOD OR DISPLACEMENT DAY 0 -128 8 DAY 0 2 004074 SHORT TIME PERIOD OR DISPLACEMENT HOUR 0 -128 8 HOUR 0 2 004075 SHORT TIME PERIOD OR DISPLACEMENT MINUTE 0 -128 8 MINUTE 0 2 005001 LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7 005002 LATITUDE (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4 005011 LATITUDE INCREMENT (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7 005012 LATITUDE INCREMENT (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4 005021 BEARING OR AZIMUTH DEGREE TRUE 2 0 16 DEGREE TRUE 2 5 005022 SOLAR AZIMUTH DEGREE TRUE 2 0 16 DEGREE TRUE 2 5 005030 DIRECTION (SPECTRAL) DEGREE 0 0 12 DEGREE 0 4 005031 ROW NUMBER NUMERIC 0 0 12 NUMERIC 0 4 005033 PIXEL SIZE ON HORIZONTAL - 1 M -1 0 16 M -1 5 005034 ALONG TRACK ROW NUMBER NUMERIC 0 0 11 NUMERIC 0 4 005036 SHIP TRANSECT NUMBER ACCORDING TO SOOP NUMERIC 0 0 7 NUMERIC 0 2 005040 ORBIT NUMBER NUMERIC 0 0 24 NUMERIC 0 8 005041 SCAN LINE NUMBER NUMERIC 0 0 8 NUMERIC 0 3 005042 CHANNEL NUMBER NUMERIC 0 0 6 NUMERIC 0 2 005043 FIELD OF VIEW NUMBER NUMERIC 0 0 8 NUMERIC 0 3 005044 SATELLITE CYCLE NUMBER NUMERIC 0 0 11 NUMERIC 0 4 005052 CHANNEL NUMBER INCREMENT NUMERIC 0 0 5 NUMERIC 0 2 005053 FIELD OF VIEW NUMBER INCREMENT NUMERIC 0 0 5 NUMERIC 0 2 006001 LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8 006002 LONGITUDE (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5 006011 LONGITUDE INCREMENT (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8 006012 LONGITUDE INCREMENT (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5 006021 DISTANCE M -1 0 13 M -1 4 006030 WAVE NUMBER (SPECTRAL) RAD/M 5 0 13 RAD/M 5 4 006031 COLUMN NUMBER NUMERIC 0 0 12 NUMERIC 0 4 006033 PIXEL SIZE ON HORIZONTAL - 2 M -1 0 16 M -1 5 006034 CROSS-TRACK CELL NUMBER NUMERIC 0 0 7 NUMERIC 0 3 006040 RADIUS OF CONFIDENCE M 0 0 13 M 0 4 007001 HEIGHT OF STATION (SEE NOTE 1) M 0 -400 15 M 0 5 007002 HEIGHT OR ALTITUDE M -1 -40 16 M -1 5 007003 GEOPOTENTIAL M**2/S**2 -1 -400 17 M**2/S**2 -1 6 007004 PRESSURE PA -1 0 14 PA -1 5 007005 HEIGHT INCREMENT M 0 -400 12 M 0 4 007006 HEIGHT ABOVE STATION M 0 0 15 M 0 5 007007 HEIGHT M 0 -1000 17 M 0 6 007008 GEOPOTENTIAL M**2/S**2 0 -10000 20 M**2/S**2 0 7 007009 GEOPOTENTIAL HEIGHT GPM 0 -1000 17 GPM 0 5 007010 FLIGHT LEVEL M 0 -1024 16 FT -1 5 007021 ELEVATION (SEE NOTE 2) DEGREE 2 -9000 15 DEGREE 2 5 007022 SOLAR ELEVATION DEGREE 2 -9000 15 DEGREE 2 5 007024 SATELLITE ZENITH ANGLE DEGREE 2 -9000 15 DEGREE 2 5 007025 SOLAR ZENITH ANGLE DEGREE 2 -9000 15 DEGREE 2 5 007030 HEIGHT OF STATION GROUND ABOVE MEAN SEA LEVEL (SEE NOTE 3) M 1 - 4000 17 M 1 5 007031 HEIGHT OF BAROMETER ABOVE MEAN SEA LEVEL (SEE NOTE 4) M 1 - 4000 17 M 1 5 007032 HEIGHT OF SENSOR ABOVE LOCAL GROUND (OR DECK OF MARINE PLATFORM) M 2 0 16 M 2 5 007033 HEIGHT OF SENSOR ABOVE WATER SURFACE (SEE NOTE 6) M 1 0 12 M 1 4 007061 DEPTH BELOW LAND SURFACE M 2 0 14 M 2 5 007062 DEPTH BELOW SEA/WATER SURFACE M 1 0 17 M 1 6 007064 HEIGHT ABOVE STATION (SENSOR HEIGHT ARTIFICIALLY CORRECTED) (SEE M 0 0 4 M 0 2 007070 DROGUE DEPTH M 0 0 10 M 0 4 008001 VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8001 0 0 7 FLAG TABLE 8001 0 3 008002 VERTICAL SIGNIFICANCE (SURFACE OBSERVATIONS) CODE TABLE 8002 0 0 6 CODE TABLE 8002 0 2 008003 VERTICAL SIGNIFICANCE (SATELLITE OBSERVATIONS) CODE TABLE 8003 0 0 6 CODE TABLE 8003 0 2 008004 PHASE OF AIRCRAFT FLIGHT CODE TABLE 8004 0 0 3 CODE TABLE 8004 0 1 008005 METEOROLOGICAL ATTRIBUTE SIGNIFICANCE CODE TABLE 8005 0 0 4 CODE TABLE 8005 0 2 008006 OZONE VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8006 0 0 9 FLAG TABLE 8006 0 3 008007 DIMENSIONAL SIGNIFICANCE CODE TABLE 8007 0 0 4 CODE TABLE 8007 0 2 008008 RADIATION VERTICAL SOUNDING SIGNIFICANCE FLAG TABLE 8008 0 0 9 FLAG TABLE 8008 0 3 008009 DETAILED PHASE OF FLIGHT CODE TABLE 8009 0 0 4 CODE TABLE 8009 0 2 008010 SURFACE QUALIFIER (TEMPERATURE DATA) CODE TABLE 8010 0 0 5 CODE TABLE 8010 0 2 008011 METEOROLOGICAL FEATURE CODE TABLE 8011 0 0 6 CODE TABLE 8011 0 2 008012 LAND/SEA QUALIFIER CODE TABLE 8012 0 0 2 CODE TABLE 8012 0 1 008013 DAY/NIGHT QUALIFIER CODE TABLE 8013 0 0 2 CODE TABLE 8013 0 1 008014 QUALIFIER FOR RUNWAY VISUAL RANGE CODE TABLE 8014 0 0 4 CODE TABLE 8014 0 2 008016 CHANGE QUALIFIER OF A TREND-TYPE FORECAST OR AN AERODROME FORECA CODE TABLE 8016 0 0 3 CODE TABLE 8016 0 1 008017 QUALIFIER OF THE TIME WHEN THE FORECAST CHANGE IS EXPECTED CODE TABLE 8017 0 0 2 CODE TABLE 8017 0 1 008018 SEAWINDS LAND/ICE SURFACE TYPE FLAG TABLE 8018 0 0 17 FLAG TABLE 8018 0 6 008020 TOTAL NUMBER OF MISSING ENTITIES (WITH RESPECT TO ACCUMULATION O NUMERIC 0 0 16 NUMERIC 0 5 008021 TIME SIGNIFICANCE CODE TABLE 8021 0 0 5 CODE TABLE 8021 0 2 008022 TOTAL NUMBER (WITH RESPECT TO ACCUMULATION OR AVERAGE) NUMERIC 0 0 16 NUMERIC 0 5 008023 FIRST ORDER STATISTICS CODE TABLE 8023 0 0 6 CODE TABLE 8023 0 2 008024 DIFFERENCE STATISTICS CODE TABLE 8024 0 0 6 CODE TABLE 8024 0 2 008025 TIME DIFFERENCE QUALIFIER CODE TABLE 8025 0 0 4 CODE TABLE 8025 0 2 008030 MANUAL ON CODES (VOLUME I.1, SECTION C) CODE TABLE FROM WHICH DA NUMERIC 0 0 13 NUMERIC 0 4 008031 DATA CATEGORY CREX TABLE A NUMERIC 0 0 8 NUMERIC 0 3 008033 METHOD OF DERIVATION OF PERCENTAGE CONFIDENCE CODE TABLE 8033 0 0 7 CODE TABLE 8033 0 3 008035 TYPE OF MONITORING EXERCISE CODE TABLE 8035 0 0 3 CODE TABLE 8035 0 1 008036 TYPE OF CENTRE OR STATION PERFORMING MONITORING CODE TABLE 8036 0 0 3 CODE TABLE 8036 0 1 008040 FLIGHT LEVEL SIGNIFICANCE CODE TABLE 8040 0 0 6 CODE TABLE 8040 0 2 008041 DATA SIGNIFICANCE CODE TABLE 8041 0 0 5 CODE TABLE 8041 0 2 008050 QUALIFIER FOR NUMBER OF MISSING VALUES IN CALCULATION OF STATIST CODE TABLE 8050 0 0 4 CODE TABLE 8050 0 2 008051 QUALIFIER FOR NUMBER OF MISSING VALUES IN CALCULATION OF STATIST CODE TABLE 8051 0 0 3 CODE TABLE 8051 0 1 008052 CONDITION FOR WHICH NUMBER OF DAYS OF OCCURRENCE FOLLOWS CODE TABLE 8052 0 0 5 CODE TABLE 8052 0 2 008053 DAY OF OCCURRENCE QUALIFIER CODE TABLE 8053 0 0 2 CODE TABLE 8053 0 1 008060 SAMPLE SCANNING MODE SIGNIFICANCE CODE TABLE 8060 0 0 4 CODE TABLE 8060 0 2 008070 TOVS/ATOVS PRODUCT QUALIFIER CODE TABLE 8070 0 0 4 CODE TABLE 8070 0 2 008072 PIXEL(S) TYPE CODE TABLE 8072 0 0 3 CODE TABLE 8072 0 1 008074 ALTIMETER ECHO TYPE CODE TABLE 8074 0 0 2 CODE TABLE 8074 0 1 008075 ASCENDING/DESCENDING ORBIT QUALIFIER CODE TABLE 8075 0 0 2 CODE TABLE 8075 0 1 008076 TYPE OF BAND CODE TABLE 8076 0 0 6 CODE TABLE 8076 0 2 008080 QUALIFIER FOR GTSSPP QUALITY FLAG CODE TABLE 8080 0 0 6 CODE TABLE 8080 0 2 008081 TYPE OF EQUIPMENT CODE TABLE 8081 0 0 6 CODE TABLE 8081 0 2 008082 ARTIFICIAL CORRECTION OF SENSOR HEIGHT TO ANOTHER VALUE CODE TABLE 8082 0 0 3 CODE TABLE 8082 0 1 010001 HEIGHT OF LAND SURFACE M 0 -400 15 M 0 5 010002 HEIGHT M -1 -40 16 M -1 5 010003 GEOPOTENTIAL M**2/S**2 -1 -400 17 M**2/S**2 -1 6 010004 PRESSURE PA -1 0 14 PA -1 5 010007 HEIGHT M 0 -1000 17 M 0 6 010008 GEOPOTENTIAL M**2/S**2 0 -10000 20 M**2/S**2 0 7 010009 GEOPOTENTIAL HEIGHT GPM 0 -1000 17 GPM 0 5 010010 MINIMUM PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14 PA -1 5 010011 MAXIMUM PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14 PA -1 5 010031 IN DIRECTION OF THE NORTH POLE, DISTANCE FROM THE EARTH'S CENTRE M 2 -1073741824 31 M 2 10 010040 NUMBER OF RETRIEVED LAYERS NUMERIC 0 0 10 NUMERIC 0 4 010050 STANDARD DEVIATION ALTITUDE M 2 0 16 M 2 5 010051 PRESSURE REDUCED TO MEAN SEA LEVEL PA -1 0 14 PA -1 5 010052 ALTIMETER SETTING (QNH) PA -1 0 14 PA -1 5 010060 PRESSURE CHANGE PA -1 -1024 11 PA -1 4 010061 3-HOUR PRESSURE CHANGE PA -1 -500 10 PA -1 4 010062 24-HOUR PRESSURE CHANGE PA -1 -1000 11 PA -1 4 010063 CHARACTERISTIC OF PRESSURE TENDENCY CODE TABLE 10063 0 0 4 CODE TABLE 10063 0 2 010070 INDICATED AIRCRAFT ALTITUDE M 0 -400 16 M 0 5 010197 ANEMOMETER HEIGHT M 0 0 9 M 0 3 011001 WIND DIRECTION DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 011002 WIND SPEED M/S 1 0 12 M/S 1 4 011003 U-COMPONENT M/S 1 -4096 13 M/S 1 4 011004 V-COMPONENT M/S 1 -4096 13 M/S 1 4 011005 W-COMPONENT PA/S 1 -512 10 PA/S 1 4 011006 W-COMPONENT M/S 2 -4096 13 M/S 2 4 011010 WIND DIRECTION ASSOCIATED WITH WIND SPEED WHICH FOLLOWS DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 011011 WIND DIRECTION AT 10 M DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 011012 WIND SPEED AT 10 M M/S 1 0 12 M/S 1 4 011013 WIND DIRECTION AT 5 M DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 011014 WIND SPEED AT 5 M M/S 1 0 12 M/S 1 4 011016 EXTREME COUNTERCLOCKWISE WIND DIRECTION OF A VARIABLE WIND DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 011017 EXTREME CLOCKWISE WIND DIRECTION OF A VARIABLE WIND DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 011019 STEADINESS OF WIND (6) % 0 0 7 % 0 3 011021 RELATIVE VORTICITY 1/S 9 -65536 17 1/S 9 6 011022 DIVERGENCE 1/S 9 -65536 17 1/S 9 6 011023 VELOCITY POTENTIAL M**2/S -2 -65536 17 M**2/S -2 6 011031 DEGREE OF TURBULENCE CODE TABLE 11031 0 0 4 CODE TABLE 11031 0 2 011032 HEIGHT OF BASE OF TURBULENCE M -1 -40 16 M -1 5 011033 HEIGHT OF TOP OF TURBULENCE M -1 -40 16 M -1 5 011034 VERTICAL GUST VELOCITY M/S 1 -1024 11 M/S 1 4 011035 VERTICAL GUST ACCELERATION M/S**2 2 -8192 14 M/S**2 2 5 011036 MAXIMUM DERIVED EQUIVALENT VERTICAL GUST SPEED M/S 1 0 10 M/S 1 4 011037 TURBULENCE INDEX CODE TABLE 11037 0 0 6 CODE TABLE 11037 0 2 011038 TIME OF OCCURRENCE OF PEAK EDDY DISSIPATION RATE CODE TABLE 11038 0 0 5 CODE TABLE 11038 0 2 011039 EXTENDED TIME OF OCCURRENCE OF PEAK EDDY DISSIPATION RATE CODE TABLE 11039 0 0 6 CODE TABLE 11039 0 2 011040 MAXIMUM WIND SPEED (MEAN WIND) M/S 1 0 12 M/S 1 4 011041 MAXIMUM WIND GUST SPEED M/S 1 0 12 M/S 1 4 011042 MAXIMUM WIND SPEED (10-MIN MEAN WIND) M/S 1 0 12 M/S 1 4 011043 MAXIMUM WIND GUST DIRECTION DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 011044 MEAN WIND DIRECTION FOR SURFACE - 1500 M (5000 FEET) DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 011045 MEAN WIND SPEED FOR SURFACE - 1500 M (5000 FEET) M/S 1 0 12 M/S 1 4 011046 MAXIMUM INSTANTANEOUS WIND SPEED M/S 1 0 12 M/S 1 4 011047 MAXIMUM INSTANTANEOUS WIND SPEED OVER 10 MINUTES M/S 1 0 12 M/S 1 4 011049 STANDARD DEVIATION OF WIND DIRECTION DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 011050 STANDARD DEVIATION OF HORIZONTAL WIND SPEED M/S 1 0 12 M/S 1 4 011051 STANDARD DEVIATION OF VERTICAL WIND SPEED M/S 1 0 8 M/S 1 3 011052 FORMAL UNCERTAINTY IN WIND SPEED M/S 2 0 13 M/S 2 5 011053 FORMAL UNCERTAINTY IN WIND DIRECTION DEGREE TRUE 2 0 15 DEGREE TRUE 2 5 011061 ABSOLUTE WIND SHEAR IN 1 KM LAYER BELOW M/S 1 0 12 M/S 1 4 011062 ABSOLUTE WIND SHEAR IN 1 KM LAYER ABOVE M/S 1 0 12 M/S 1 4 011070 DESIGNATOR OF THE RUNWAY AFFECTED BY WIND SHEAR (INCLUDING ALL) CCITTIA5 0 0 32 CHARACTER 0 4 011071 TURBULENT VERTICAL MOMENTUM FLUX M**2/S**2 3 -128 14 M**2/S**2 3 5 011072 TURBULENT VERTICAL BUOYANCY FLUX KM/S 3 -128 11 KM/S 3 4 011073 TURBULENT KINETIC ENERGY M**2/S**2 2 -1024 13 M**2/S**2 2 4 011074 DISSIPATION ENERGY M**2/S**2 2 -1024 10 M**2/S**2 2 4 011075 MEAN TURBULENCE INTENSITY (EDDY DISSIPATION RATE) M**(2/3)/S 2 0 8 M**(2/3)/S 2 3 011076 PEAK TURBULENCE INTENSITY (EDDY DISSIPATION RATE) M**(2/3)/S 2 0 8 M**(2/3)/S 2 3 011077 REPORTING INTERVAL OR AVERAGING TIME FOR EDDY DISSIPATION RATE S 0 0 12 S 0 4 011081 MODEL WIND DIRECTION AT 10M DEGREE TRUE 2 0 16 DEGREE TRUE 2 5 011082 MODEL WIND SPEED AT 10M M/S 2 0 14 M/S 2 4 011230 MAXIMUM MEAN WIND SPEED M/S 1 -4096 13 M/S 1 4 011231 MEAN WIND SPEED M/S 1 -4096 13 M/S 1 4 011232 MINIMUM MEAN WIND SPEED M/S 1 -4096 13 M/S 1 4 011233 HIGHEST GUST DURING THE 10 MINUTE PERIOD PRECEDING OBSERVATION M/S 1 -4096 13 M/S 1 4 011233 HIGHEST GUST DURING THE 10 MINUTE PERIOD PRECEDING OBSERVATION M/S 1 -4096 13 M/S 1 4 012001 TEMPERATURE/DRY-BULB TEMPERATURE K 1 0 12 C 1 3 012002 WET-BULB TEMPERATURE K 1 0 12 C 1 3 012003 DEW-POINT TEMPERATURE K 1 0 12 C 1 3 012004 DRY-BULB TEMPERATURE AT 2 M K 1 0 12 C 1 3 012005 WET-BULB TEMPERATURE AT 2 M K 1 0 12 C 1 3 012006 DEW-POINT TEMPERATURE AT 2 M K 1 0 12 C 1 3 012007 VIRTUAL TEMPERATURE K 1 0 12 C 1 3 012011 MAXIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED K 1 0 12 C 1 3 012012 MINIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED K 1 0 12 C 1 3 012013 GROUND MINIMUM TEMPERATURE, PAST 12 HOURS K 1 0 12 C 1 3 012014 MAXIMUM TEMPERATURE AT 2 M, PAST 12 HOURS K 1 0 12 C 1 3 012015 MINIMUM TEMPERATURE AT 2 M, PAST 12 HOURS K 1 0 12 C 1 3 012016 MAXIMUM TEMPERATURE AT 2 M, PAST 24 HOURS K 1 0 12 C 1 3 012017 MINIMUM TEMPERATURE AT 2 M, PAST 24 HOURS K 1 0 12 C 1 3 012021 MAXIMUM TEMPERATURE AT 2M K 2 0 16 C 2 4 012022 MINIMUM TEMPERATURE AT 2M K 2 0 16 C 2 4 012030 SOIL TEMPERATURE K 1 0 12 C 1 3 012051 STANDARD DEVIATION TEMPERATURE K 1 0 10 C 1 3 012052 HIGHEST DAILY MEAN TEMPERATURE K 1 0 12 C 1 3 012053 LOWEST DAILY MEAN TEMPERATURE K 1 0 12 C 1 3 012061 SKIN TEMPERATURE K 1 0 12 C 1 3 012062 EQUIVALENT BLACK BODY TEMPERATURE K 1 0 12 C 1 3 012063 BRIGHTNESS TEMPERATURE K 1 0 12 C 1 3 012064 INSTRUMENT TEMPERATURE K 1 0 12 K 1 4 012065 STANDARD DEVIATION BRIGHTNESS TEMPERATURE K 1 0 12 K 1 4 012070 WARM LOAD TEMPERATURE K 2 0 16 K 2 5 012071 COLDEST CLUSTER TEMPERATURE K 1 0 12 K 1 4 012072 RADIANCE WM**(-2)SR**(-1) 6 0 31 WM**(-2)SR**(-1) 6 9 012073 TEMPERATURE K 2 0 16 C 2 4 012075 SPECTRAL RADIANCE WM**(-3)SR**(-1) -3 0 16 WM**(-3)SR**(-1) -3 5 012076 RADIANCE WM**(-2)SR**(-1) 3 0 16 WM**(-2)SR**(-1) 3 5 012101 TEMPERATURE/DRY-BULB TEMPERATURE K 2 0 16 C 2 4 012102 WET-BULB TEMPERATURE K 2 0 16 C 2 4 012103 DEW-POINT TEMPERATURE K 2 0 16 C 2 4 012104 DRY-BULB TEMPERATURE AT 2M K 2 0 16 C 2 4 012105 WEB-BULB TEMPERATURE AT 2M K 2 0 16 C 2 4 012106 DEW-POINT TEMPERATURE AT 2M K 2 0 16 C 2 4 012107 VIRTUAL TEMPERATURE K 2 0 16 C 2 4 012111 MAXIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED K 2 0 16 C 2 4 012112 MINIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED K 2 0 16 C 2 4 012113 GROUND MINIMUM TEMPERATURE, PAST 12 HOURS K 2 0 16 C 2 4 012114 MAXIMUM TEMPERATURE AT 2M, PAST 12 HOURS K 2 0 16 C 2 4 012115 MINIMUM TEMPERATURE AT 2M, PAST 12 HOURS K 2 0 16 C 2 4 012116 MAXIMUM TEMPERATURE AT 2M, PAST 24 HOURS K 2 0 16 C 2 4 012117 MINIMUM TEMPERATURE AT 2M, PAST 24 HOURS K 2 0 16 C 2 4 012118 MAXIMUM TEMPERATURE AT HEIGHT SPECIFIED, PAST 24 HOURS K 2 0 16 C 2 4 012119 MINIMUM TEMPERATURE AT HEIGHT SPECIFIED, PAST 24 HOURS K 2 0 16 C 2 4 012130 SOIL TEMPERATURE K 2 0 16 C 2 4 012151 STANDARD DEVIATION OF DAILY MEAN TEMPERATURE K 2 0 12 C 2 4 012152 HIGHEST DAILY MEAN TEMPERATURE K 2 0 16 C 2 4 012153 LOWEST DAILY MEAN TEMPERATURE K 2 0 16 C 2 4 012161 SKIN TEMPERATURE K 2 0 16 C 2 4 012162 EQUIVALENT BLACK BODY TEMPERATURE K 2 0 16 C 2 4 012163 BRIGHTNESS TEMPERATURE K 2 0 16 C 2 4 012164 INSTRUMENT TEMPERATURE K 2 0 16 K 2 5 012171 COLDEST CLUSTER TEMPERATURE K 2 0 16 K 2 5 012193 COLDEST CLUSTER TEMPERATURE K 1 0 12 K 1 4 012194 RADIANCE W/M**2*STER*M**(-1) 6 0 31 W/M**2*STER*M**(-1) 6 10 012195 SPECTRAL RADIANCE W/M**2*STER*M**(-1) 10 0 31 W/M**2*STER*M**(-1) 10 10 012196 RADIANCE W/M**2*STER 3 0 16 W/M**2*STER 3 4 013001 SPECIFIC HUMIDITY KG/KG 5 0 14 KG/KG 5 5 013002 MIXING RATIO KG/KG 5 0 14 KG/KG 5 5 013003 RELATIVE HUMIDITY % 0 0 7 % 0 3 013004 VAPOUR PRESSURE PA -1 0 10 PA -1 4 013005 VAPOUR DENSITY KG/M**3 3 0 7 KG/M**3 3 3 013006 MIXING HEIGHTS M -1 -40 16 M -1 5 013007 MINIMUM RELATIVE HUMIDITY % 0 0 7 % 0 3 013008 MAXIMUM RELATIVE HUMIDITY % 0 0 7 % 0 3 013009 RELATIVE HUMIDITY % 1 -1000 12 % 1 4 013011 TOTAL PRECIPITATION/TOTAL WATER EQUIVALENT KG/M**2 1 -1 14 KG/M**2 1 5 013012 DEPTH OF FRESH SNOW M 2 -2 12 M 2 4 013013 TOTAL SNOW DEPTH M 2 -2 16 M 2 5 013014 RAINFALL/WATER EQUIVALENT OF SNOW (AVERAGED RATE) KG/(M**2)S 4 0 12 KG/(M**2)S 4 4 013015 SNOWFALL (AVERAGED RATE) M/S 7 0 12 M/S 7 4 013016 PRECIPITABLE WATER KG/M**2 0 0 7 KG/M**2 0 3 013019 TOTAL PRECIPITATION PAST 1 HOUR KG/M**2 1 -1 14 KG/M**2 1 4 013020 TOTAL PRECIPITATION PAST 3 HOURS KG/M**2 1 -1 14 KG/M**2 1 5 013021 TOTAL PRECIPITATION PAST 6 HOURS KG/M**2 1 -1 14 KG/M**2 1 5 013022 TOTAL PRECIPITATION PAST 12 HOURS KG/M**2 1 -1 14 KG/M**2 1 5 013023 TOTAL PRECIPITATION PAST 24 HOURS KG/M**2 1 -1 14 KG/M**2 1 5 013031 EVAPOTRANSPIRATION KG/M**2 0 0 7 KG/M**2 0 3 013032 EVAPORATION/EVAPOTRANSPIRATION KG/M**2 1 0 8 KG/M**2 1 3 013033 EVAPORATION/EVAPOTRANSPIRATION KG/M**2 1 0 10 KG/M**2 1 4 013038 SUPERADIABATIC INDICATOR CODE TABLE 13038 0 0 2 CODE TABLE 13038 0 1 013039 TERRAIN TYPE (ICE/SNOW) CODE TABLE 13039 0 0 3 CODE TABLE 13039 0 1 013040 SURFACE FLAG CODE TABLE 13040 0 0 4 CODE TABLE 13040 0 2 013041 PASQUILL-GIFFORD STABILITY CATEGORY CODE TABLE 13041 0 0 4 CODE TABLE 13041 0 2 013042 PARCEL LIFTED INDEX (TO 500 HPA) K 0 -20 6 K 0 2 013043 BEST LIFTED INDEX (TO 500 HPA) K 0 -20 6 K 0 2 013051 FREQUENCY GROUP, PRECIPITATION CODE TABLE 13051 0 0 4 CODE TABLE 13051 0 2 013052 HIGHEST DAILY AMOUNT OF PRECIPITATION KG/M**2 1 -1 14 KG/M**2 1 5 013055 INTENSITY OF PRECIPITATION KG/(M**2)S 4 0 8 MM H-1 1 4 013058 SIZE OF PRECIPITATING ELEMENT M 4 0 7 MM 1 3 013059 NUMBER OF FLASHES (THUNDERSTORM) NUMERIC 0 0 7 NUMERIC 0 3 013060 TOTAL ACCUMULATED PRECIPITATION KG/M**2 1 -1 17 KG/M**2 1 5 013071 UPSTREAM WATER LEVEL M 2 0 14 M 2 4 013072 DOWNSTREAM WATER LEVEL M 2 0 14 M 2 4 013073 MAXIMUM WATER LEVEL M 2 0 14 M 2 4 013080 WATER PH pH 1 0 10 pH 1 3 013081 WATER CONDUCTIVITY SIEMENS/M 3 0 14 SIEMENS/M 3 4 013082 WATER TEMPERATURE K 1 0 12 K 1 4 013083 DISSOLVED OXYGEN KG/M**3 6 0 15 KG/M**3 6 5 013084 TURBIDITY LUMEN 0 0 14 LUMEN 0 4 013085 OXYDATION REDUCTION POTENTIAL (ORP) V 3 0 14 V 3 4 013090 RADIOMETER WATER VAPOUR CONTENT KGM-2 1 0 10 KGM-2 1 4 013091 RADIOMETER LIQUID CONTENT KGM-2 2 0 8 KGM-2 2 3 014001 LONG-WAVE RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12 J/M**2 -3 4 014002 LONG-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12 J/M**2 -3 4 014003 SHORT-WAVE RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12 J/M**2 -3 4 014004 SHORT-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12 J/M**2 -3 4 014011 NET LONG-WAVE RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12 J/M**2 -3 4 014012 NET LONG-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12 J/M**2 -3 4 014013 NET SHORT-WAVE RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -3 -2048 12 J/M**2 -3 4 014014 NET SHORT-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -3 -2048 12 J/M**2 -3 4 014015 NET RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -4 -16384 15 J/M**2 -4 5 014016 NET RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 -16384 15 J/M**2 -4 5 014017 INSTANTANEOUS LONG-WAVE RADIATION W/M**2 -3 -2048 12 W/M**2 -3 4 014018 INSTANTANEOUS SHORT-WAVE RADIATION W/M**2 -3 -2048 12 W/M**2 -3 4 014019 SURFACE ALBEDO % 0 0 7 % 0 3 014020 GLOBAL SOLAR RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -4 0 15 J/M**2 -4 5 014021 GLOBAL SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15 J/M**2 -4 5 014022 DIFFUSE SOLAR RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -4 0 15 J/M**2 -4 5 014023 DIFFUSE SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15 J/M**2 -4 5 014024 DIRECT SOLAR RADIATION, INTEGRATED OVER 24 HOURS J/M**2 -4 0 15 J/M**2 -4 5 014025 DIRECT SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED J/M**2 -4 0 15 J/M**2 -4 5 014026 ALBEDO AT THE TOP OF CLOUDS % 0 0 7 % 0 3 014027 ALBEDO % 0 0 7 % 0 3 014028 GLOBAL SOLAR RADIATION (HIGH ACCURACY), INTEGRATED OVER PERIOD S J/M**2 -2 0 16 J/M**2 -2 5 014029 DIFFUSE SOLAR RADIATION (HIGH ACCURACY), INTEGRATED OVER PERIOD J/M**2 -2 0 16 J/M**2 -2 5 014030 DIRECT SOLAR RADIATION (HIGH ACCURACY), INTEGRATED OVER PERIOD S J/M**2 -2 0 16 J/M**2 -2 5 014031 TOTAL SUNSHINE MINUTE 0 0 11 MINUTE 0 4 014032 TOTAL SUNSHINE HOUR 0 0 10 HOUR 0 4 014033 TOTAL SUNSHINE % 0 0 9 % 0 3 014034 SUNSHINE OVER PERIOD SPECIFIED MINUTE 0 0 11 MINUTE 0 4 014042 BI-DIRECTIONAL REFLECTANCE % 0 0 7 % 0 3 014045 CHANNEL RADIANCE (W/M**2)*(1/SR)*CM 0 0 11 WM-2SR-1CM-1 0 4 014050 EMISSIVITY (SEE NOTE 5) % 1 0 10 % 1 4 014051 DIRECT SOLAR RADIATION INTEGRATED OVER LAST HOUR J/M**2 -3 0 14 JM-2 -3 4 015001 TOTAL OZONE DU 0 0 10 DU 0 4 015002 AIR MASS (SLANT PATH AT 22 KM) NUMERIC 2 0 10 NUMERIC 2 3 015003 MEASURED OZONE PARTIAL PRESSURE (SOUNDING) PA 4 0 9 NBAR 0 3 015004 OZONE SOUNDING CORRECTION FACTOR NUMERIC 3 0 11 NUMERIC 3 4 015005 OZONE P DU 0 0 10 DU 0 3 015011 LOG 10 OF INTEGRATED ELECTRON DENSITY LOG (1/M2) 3 14000 13 LOG (M-2) 3 4 015015 MAXIMUM IMAGE SPECTRAL COMPONENT BEFORE NORMALIZATION NUMERIC 0 0 31 NUMERIC 0 10 015020 INTEGRATED 03 DENSITY KG/M**2 8 0 21 KG/M**2 8 7 015031 ATMOSPHERIC PATH DELAY IN SATELLITE SIGNAL M 4 10000 15 M 4 5 015032 ESTIMATED ERROR IN ATMOSPHERIC PATH DELAY M 4 0 10 M 4 4 015033 DIFFERENCE IN PATH DELAYS FOR LIMB VIEWS AT EXTREMES OF SCAN M 5 -10000 15 M 5 5 015034 ESTIMATED ERROR IN PATH DELAY DIFFERENCE M 5 0 14 M 5 5 015035 COMPONENT OF ZENITH PATH DELAY DUE TO WATER VAPOUR M 4 0 14 M 4 5 019001 TYPE OF SYNOPTIC FEATURE CODE TABLE 19001 0 0 6 CODE TABLE 19001 0 2 019002 EFFECTIVE RADIUS OF FEATURE M -2 0 12 M -2 4 019003 WIND SPEED THRESHOLD M/S 0 0 8 M/S 0 3 019004 EFFECTIVE RADIUS WITH RESPECT TO WIND SPEEDS ABOVE THRESHOLD M -2 0 12 M -2 4 019005 DIRECTION OF MOTION OF FEATURE DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 019006 SPEED OF MOTION OF FEATURE M/S 2 0 14 M/S 2 5 019007 EFFECTIVE RADIUS OF FEATURE M -3 0 12 M -3 4 019008 VERTICAL EXTENT OF CIRCULATION CODE TABLE 19008 0 0 3 CODE TABLE 19008 0 1 019009 EFFECTIVE RADIUS WITH RESPECT TO WIND SPEEDS ABOVE THRESHOLD (LA M -3 0 12 M -3 4 019010 METHOD FOR TRACKING THE CENTRE OF SYNOPTIC FEATURE CODE TABLE 19010 0 0 4 CODE TABLE 19010 0 2 020001 HORIZONTAL VISIBILITY M -1 0 13 M -1 4 020002 VERTICAL VISIBILITY M -1 0 7 M -1 3 020003 PRESENT WEATHER (SEE NOTE 1) CODE TABLE 20003 0 0 9 CODE TABLE 20003 0 3 020004 PAST WEATHER (1) (SEE NOTE 2) CODE TABLE 20004 0 0 5 CODE TABLE 20004 0 2 020005 PAST WEATHER (2) (SEE NOTE 2) CODE TABLE 20005 0 0 5 CODE TABLE 20005 0 2 020008 CLOUD DISTRIBUTION FOR AVIATION CODE TABLE 20008 0 0 5 CODE TABLE 20008 0 2 020009 GENERAL WEATHER INDICATOR (TAF/METAR) CODE TABLE 20009 0 0 4 CODE TABLE 20009 0 2 020010 CLOUD COVER (TOTAL) % 0 0 7 % 0 3 020011 CLOUD AMOUNT CODE TABLE 20011 0 0 4 CODE TABLE 20011 0 2 020012 CLOUD TYPE CODE TABLE 20012 0 0 6 CODE TABLE 20012 0 2 020013 HEIGHT OF BASE OF CLOUD M -1 -40 11 M -1 4 020014 HEIGHT OF TOP OF CLOUD M -1 -40 11 M -1 4 020015 PRESSURE AT BASE OF CLOUD PA -1 0 14 PA -1 5 020016 PRESSURE AT TOP OF CLOUD PA -1 0 14 PA -1 5 020017 CLOUD TOP DESCRIPTION CODE TABLE 20017 0 0 4 CODE TABLE 20017 0 2 020018 TENDENCY OF RUNWAY VISUAL RANGE CODE TABLE 20018 0 0 2 CODE TABLE 20018 0 1 020019 SIGNIFICANT PRESENT OR FORECAST WEATHER CCITTIA5 0 0 72 CHARACTER 0 9 020020 SIGNIFICANT RECENT WEATHER PHENOMENA CCITTIA5 0 0 32 CHARACTER 0 4 020021 TYPE OF PRECIPITATION FLAG TABLE 20021 0 0 30 FLAG TABLE 20021 0 10 020022 CHARACTER OF PRECIPITATION CODE TABLE 20022 0 0 4 CODE TABLE 20022 0 2 020023 OTHER WEATHER PHENOMENA FLAG TABLE 20023 0 0 18 FLAG TABLE 20023 0 6 020024 INTENSITY OF PHENOMENA CODE TABLE 20024 0 0 3 CODE TABLE 20024 0 1 020025 OBSCURATION FLAG TABLE 20025 0 0 21 FLAG TABLE 20025 0 7 020026 CHARACTER OF OBSCURATION CODE TABLE 20026 0 0 4 CODE TABLE 20026 0 2 020027 PHENOMENA OCCURRENCE FLAG TABLE 20027 0 0 9 FLAG TABLE 20027 0 3 020029 RAIN FLAG CODE TABLE 20029 0 0 2 CODE TABLE 20029 0 1 020031 ICE DEPOSIT (THICKNESS) M 2 0 7 M 2 3 020032 RATE OF ICE ACCRETION CODE TABLE 20032 0 0 3 CODE TABLE 20032 0 1 020033 CAUSE OF ICE ACCRETION FLAG TABLE 20033 0 0 4 FLAG TABLE 20033 0 2 020034 SEA ICE CONCENTRATION CODE TABLE 20034 0 0 5 CODE TABLE 20034 0 2 020035 AMOUNT AND TYPE OF ICE CODE TABLE 20035 0 0 4 CODE TABLE 20035 0 2 020036 ICE SITUATION CODE TABLE 20036 0 0 5 CODE TABLE 20036 0 2 020037 ICE DEVELOPMENT CODE TABLE 20037 0 0 5 CODE TABLE 20037 0 2 020038 BEARING OF ICE EDGE (SEE NOTE 3) DEGREE TRUE 0 0 12* DEGREE TRUE 0 3 020039 ICE DISTANCE M -1 0 13 M -1 4 020041 AIRFRAME ICING CODE TABLE 20041 0 0 4 CODE TABLE 20041 0 2 020042 AIRFRAME ICING PRESENT CODE TABLE 20042 0 0 2 CODE TABLE 20042 0 1 020043 PEAK LIQUID WATER CONTENT KG/M**3 4 0 7 KG/M**3 4 2 020044 AVERAGE LIQUID WATER CONTENT KG/M**3 4 0 7 KG/M**3 4 2 020045 SUPERCOOLED LARGE DROPLET (SLD) CONDITIONS CODE TABLE 20045 0 0 2 CODE TABLE 20045 0 1 020051 AMOUNT OF LOW CLOUDS % 0 0 7 % 0 3 020052 AMOUNT OF MIDDLE CLOUDS % 0 0 7 % 0 3 020053 AMOUNT OF HIGH CLOUDS % 0 0 7 % 0 3 020061 RUNWAY VISUAL RANGE (RVR) M 0 0 12 M 0 4 020062 STATE OF THE GROUND (WITH OR WITHOUT SNOW) CODE TABLE 20062 0 0 5 CODE TABLE 20062 0 2 020063 SPECIAL PHENOMENA CODE TABLE 20063 0 0 10 CODE TABLE 20063 0 4 020065 SNOW COVER (SEE NOTE 4) % 0 0 7 % 0 3 020070 MINIMUM NUMBER OF ATMOSPHERICS NUMERIC 0 0 7 NUMERIC 0 3 020071 ACCURACY OF FIX AND RATE OF ATMOSPHERICS CODE TABLE 20071 0 0 4 CODE TABLE 20071 0 2 020081 CLOUD AMOUNT IN SEGMENT % 0 0 7 % 0 3 020082 AMOUNT SEGMENT CLOUD FREE % 0 0 7 % 0 3 020090 SPECIAL CLOUDS CODE TABLE 20090 0 0 4 CODE TABLE 20090 0 2 020192 SPECIAL PHENOMENA CODE TABLE 20192 0 0 14 CODE TABLE 0 5 021001 HORIZONTAL REFLECTIVITY dB 0 -64 7 dB 0 3 021002 VERTICAL REFLECTIVITY dB 0 -64 7 dB 0 3 021003 DIFFERENTIAL REFLECTIVITY dB 1 -5 7 dB 1 3 021005 LINEAR DEPOLARISATION RATIO dB 0 -65 6 dB 0 2 021006 CIRCULAR DEPOLARISATION RATIO dB 0 -65 6 dB 0 2 021011 DOPPLER MEAN VELOCITY IN X-DIRECTION M/S 0 -128 8 M/S 0 3 021012 DOPPLER MEAN VELOCITY IN Y-DIRECTION M/S 0 -128 8 M/S 0 3 021013 DOPPLER MEAN VELOCITY IN Z-DIRECTION M/S 0 -128 8 M/S 0 3 021014 DOPPLER MEAN VELOCITY (RADIAL) M/S 1 -4096 13 M/S 1 4 021017 DOPPLER VELOCITY SPECTRAL WIDTH M/S 1 0 8 M/S 1 3 021021 ECHO TOPS M -3 0 4 M -3 2 021030 SIGNAL TO NOISE RATIO dB 0 -32 8 dB 0 3 021031 VERTICALLY INTEGRATED LIQUID-WATER CONTENT KG/M**2 0 0 7 KG/M**2 0 3 021036 RADAR RAINFALL INTENSITY M/S 7 0 12 M/S 7 4 021041 BRIGHT-BAND HEIGHT M -2 0 8 M -2 3 021051 SIGNAL POWER ABOVE 1 MW dB 0 -256 8 dB 0 3 021062 BACKSCATTER dB 2 -5000 13 dB 2 4 021063 RADIOMETRIC RESOLUTION (NOISE VALUE) % 1 0 10 % 1 4 021064 CLUTTER NOISE ESTIMATE NUMERIC 0 0 8 NUMERIC 0 3 021065 MISSING PACKET COUNTER NUMERIC 0 -127 8 NUMERIC 0 3 021066 WAVE SCATTEROMETER PRODUCT CONFIDENCE DATA FLAG TABLE 21066 0 0 12 FLAG TABLE 21066 0 4 021067 WIND PRODUCT CONFIDENCE DATA FLAG TABLE 21067 0 0 13 FLAG TABLE 21067 0 5 021068 RADAR ALTIMETER PRODUCT CONFIDENCE DATA FLAG TABLE 21068 0 0 8 FLAG TABLE 21068 0 3 021069 SST PRODUCT CONFIDENCE DATA FLAG TABLE 21069 0 0 10 FLAG TABLE 21069 0 4 021070 SST PRODUCT CONFIDENCE DATA (SADIST-2) FLAG TABLE 21070 0 0 23 FLAG TABLE 21070 0 6 021071 PEAKINESS NUMERIC 0 0 16 NUMERIC 0 5 021072 SATELLITE ALTIMETER CALIBRATION STATUS FLAG TABLE 21072 0 0 4 FLAG TABLE 21072 0 2 021073 SATELLLITE ALTIMETER INSTRUMENT MODE FLAG TABLE 21073 0 0 9 FLAG TABLE 21073 0 3 021075 IMAGE SPECTRUM INTENSITY NUMERIC 0 0 8 NUMERIC 0 3 021076 REPRESENTATION OF INTENSITIES CODE TABLE 21076 0 0 3 CODE TABLE 21076 0 1 021077 ALTITUDE CORRECTION (IONOSPHERE) M 3 0 14 M 3 5 021078 ALTITUDE CORRECTION (DRY TROPOSPHERE) M 3 0 9 M 3 3 021079 ALTITUDE CORRECTION (WET TROPOSPHERE) M 3 2000 10 M 3 4 021080 ALTITUDE CORRECTION (CALIBRATION CONSTANT) M 3 0 11 M 3 4 021081 OPEN LOOP CORRECTION (HEIGHT-TIME LOOP) M 3 0 10 M 3 4 021082 OPEN LOOP CORRECTION (AUTO GAIN CONTROL) dB 3 -3000 14 dB 3 5 021083 WARM TARGET CALIBRATION NUMERIC 0 0 16 NUMERIC 0 5 021084 COLD TARGET CALIBRATION NUMERIC 0 0 16 NUMERIC 0 5 021085 ATSR SEA SURFACE TEMPERATURE ACROSS- TRACK BAND NUMBER NUMERIC 0 0 4 NUMERIC 0 2 021091 RADAR SIGNAL DOPPLER SPECTRUM 0TH MOMENT dB 0 -100 8 dB 0 3 021092 RASS SIGNAL DOPPLER SPECTRUM 0TH MOMENT, REFERRING TO RASS SIGNA dB 0 -100 8 dB 0 3 021101 NUMBER OF VECTOR AMBIGUITIES NUMERIC 0 0 3 NUMERIC 0 1 021102 INDEX OF SELECTED WIND VECTOR NUMERIC 0 0 3 NUMERIC 0 1 021103 TOTAL NUMBER OF SIGMA-0 MEASUREMENTS NUMERIC 0 0 5 NUMERIC 0 2 021104 LIKELIHOOD COMPUTED FOR SOLUTION NUMERIC 3 -30000 15 NUMERIC 3 5 021105 NORMALIZED RADAR CROSS-SECTION dB 2 -10000 14 dB 2 5 021106 KP VARIANCE COEFFICIENT (ALPHA) NUMERIC 3 0 14 NUMERIC 3 5 021107 KP VARIANCE COEFFICIENT (BETA) NUMERIC 8 0 16 NUMERIC 8 5 021109 SEAWINDS WIND VECTOR CELL QUALITY FLAG TABLE 21109 0 0 17 FLAG TABLE 21109 0 6 021110 NUMBER OF INNER-BEAM SIGMA-0 (FORWARD OF SATELLITE) NUMERIC 0 0 6 NUMERIC 0 2 021111 NUMBER OF OUTER-BEAM SIGMA-0 (FORWARD OF SATELLITE) NUMERIC 0 0 6 NUMERIC 0 2 021112 NUMBER OF INNER-BEAM SIGMA-0 (AFT OF SATELLITE) NUMERIC 0 0 6 NUMERIC 0 2 021113 NUMBER OF OUTER-BEAM SIGMA-0 (AFT OF SATELLITE) NUMERIC 0 0 6 NUMERIC 0 2 021114 KP VARIANCE COEFFICENT (GAMMA) dB 3 -140000 18 dB 3 6 021115 SEAWINDS SIGMA-0 QUALITY FLAG TABLE 21115 0 0 17 FLAG TABLE 21115 0 6 021116 SEAWINDS SIGMA-0 MODE FLAG TABLE 21116 0 0 17 FLAG TABLE 21116 0 6 021117 SIGMA-0 VARIANCE QUALITY CONTROL NUMERIC 2 0 16 NUMERIC 2 5 021118 ATTENUATION CORRECTION ON SIGMA-0 dB 2 -10000 14 dB 2 5 021119 WIND SCATTEROMETER GEOPHYSICAL MODEL FUNCTION CODE TABLE 21119 0 0 6 CODE TABLE 21119 0 2 021120 PROBABILITY OF RAIN NUMERIC 3 0 10 NUMERIC 3 4 021121 SEAWINDS NOF* RAIN INDEX NUMERIC 0 0 8 NUMERIC 0 3 021122 ATTENUATION CORRECTION OF SIGMA-0 (FROM TB) dB 2 -10000 14 dB 2 5 021123 SEAWINDS NORMALIZED RADAR CROSS SECTION dB 2 -30000 15 dB 2 5 021128 NUMBER OF VALID POINTS PER SECOND USED TO DERIVE PREVIOUS PARAME NUMERIC 0 0 8 NUMERIC 0 3 021192 RADAR BACK SCATTER dB 2 -5000 13 dB 2 4 021193 NOISE FIGURE % 0 0 7 % 0 3 021194 BACKGROUND NOISE LEVEL NUMERIC 0 0 8 NUMERIC 0 3 021195 MISSING PACKET COUNTER NUMERIC 0 -127 8 NUMERIC 0 3 022001 DIRECTION OF WAVES DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 022002 DIRECTION OF WIND WAVES DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 022003 DIRECTION OF SWELL WAVES DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 022004 DIRECTION OF CURRENT DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 022011 PERIOD OF WAVES S 0 0 6 S 0 2 022012 PERIOD OF WIND WAVES S 0 0 6 S 0 2 022013 PERIOD OF SWELL WAVES S 0 0 6 S 0 2 022021 HEIGHT OF WAVES M 1 0 10 M 1 4 022022 HEIGHT OF WIND WAVES M 1 0 10 M 1 4 022023 HEIGHT OF SWELL WAVES M 1 0 10 M 1 4 022025 STANDARD DEVIATION WAVE HEIGHT M 2 0 10 M 2 4 022026 STANDARD DEVIATION OF SIGNIFICANT WAVE HEIGHT M 2 0 10 M 2 4 022031 SPEED OF CURRENT M/S 2 0 13 M/S 2 4 022035 TIDAL ELEVATION WITH RESPECT TO LOCAL CHART DATUM M 2 0 14 M 2 4 022036 METEOROLOGICAL RESIDUAL TIDAL ELEVATION (SURGE OR OFFSET) M 2 0 14 M 2 4 022037 TIDAL ELEVATION WITH RESPECT TO NATIONAL LAND DATUM M 3 -10000 15 M 3 5 022038 TIDAL ELEVATION WITH RESPECT TO LOCAL CHART DATUM M 3 -10000 15 M 3 5 022039 METEOROLOGICAL RESIDUAL TIDAL ELEVATION (SURGE OR OFFSET) M 3 -5000 12 M 3 4 022040 METEOROLOGICAL RESIDUAL TIDAL ELEVATION (SURGE OR OFFSET) M 3 -5000 14 M 3 5 022041 SEA-SURFACE TEMPERATURE (15-DAY RUNNING MEAN) K 1 0 12 K 1 4 022042 SEA/WATER TEMPERATURE K 1 0 12 K 1 4 022043 SEA/WATER TEMPERATURE K 2 0 15 K 2 5 022044 SOUND VELOCITY M/S 1 0 14 M/S 1 5 022045 SEA/WATER TEMPERATURE K 3 0 19 K 3 6 022050 STANDARD DEVIATION SEA-SURFACE TEMPERATURE K 2 0 8 K 2 3 022055 FLOAT CYCLE NUMBER NUMERIC 0 0 10 NUMERIC 0 3 022056 DIRECTION OF PROFILE CODE TABLE 22056 0 0 2 CODE TABLE 22056 0 1 022060 LAGRANGIAN DRIFTER DROGUE STATUS CODE TABLE 022060 0 0 3 CODE TABLE 22060 0 1 022061 STATE OF THE SEA CODE TABLE 22061 0 0 4 CODE TABLE 22061 0 2 022062 SALINITY PART PER THOUSAND 2 0 14 PART PER THOUSAND 2 5 022063 TOTAL WATER DEPTH M 0 0 14 M 0 5 022064 SALINITY PART PER THOUSAND 3 0 17 PART PER THOUSAND 3 6 022065 WATER PRESSURE PA -3 0 17 PA -3 6 022066 WATER CONDUCTIVITY S M-1 6 0 26 S M-1 6 8 022067 INSTRUMENT TYPE FOR WATER TEMPERATURE PROFILE MEASUREMENT CODE TABLE 22067 0 0 10 CODE TABLE 22067 0 4 022068 WATER TEMPERATURE PROFILE RECORDER TYPES CODE TABLE 22068 0 0 7 CODE TABLE 22068 0 3 022070 SIGNIFICANT WAVE HEIGHT M 2 0 13 M 2 4 022071 SPECTRAL PEAK WAVE PERIOD S 1 0 9 S 1 3 022072 SPECTRAL PEAK WAVE LENGTH M 0 0 13 M 0 4 022073 MAXIMUM WAVE HEIGHT M 2 0 13 M 2 4 022074 AVERAGE WAVE PERIOD S 1 0 9 S 1 3 022075 AVERAGE WAVE LENGTH M 0 0 13 M 0 4 022076 DIRECTION FROM WHICH DOMINANT WAVES ARE COMING DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 022077 DIRECTIONAL SPREAD OF DOMINANT WAVE DEGREE 0 0 9 DEGREE 0 3 022078 DURATION OF WAVE RECORD S 0 0 12 S 0 4 022079 LENGTH OF WAVE RECORD M 0 0 16 M 0 5 022080 WAVEBAND CENTRAL FREQUENCY Hz 3 0 10 Hz 3 4 022081 WAVEBAND CENTRAL WAVE NUMBER 1/M 5 0 13 1/M 5 4 022082 MAXIMUM NON-DIRECTIONAL SPECTRAL WAVE DENSITY M**2S 2 0 20 M**2S 2 7 022083 MAXIMUM NON-DIRECTIONAL SPECTRAL WAVE NUMBER M**3 2 0 20 M**3 2 7 022084 BAND CONTAINING MAXIMUM NON- DIRECTIONAL SPECTRAL WAVE DENSITY NUMERIC 0 0 7 NUMERIC 0 3 022085 SPECTRAL WAVE DENSITY RATIO NUMERIC 0 0 7 NUMERIC 0 3 022086 MEAN DIRECTION FROM WHICH WAVES ARE COMING DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 022087 PRINCIPAL DIRECTION FROM WHICH WAVES ARE COMING DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 022088 FIRST NORMALIZED POLAR COORDINATE FROM FOURIER COEFFICIENTS NUMERIC 2 0 7 NUMERIC 2 3 022089 SECOND NORMALIZED POLAR COORDINATE FROM FOURIER COEFFICIENTS NUMERIC 2 0 7 NUMERIC 2 3 022090 NON-DIRECTIONAL SPECTRAL ESTIMATE BY WAVE FREQUENCY M**2S 2 0 20 M**2S 2 7 022091 NON-DIRECTIONAL SPECTRAL ESTIMATE BY WAVE NUMBER M**3 2 0 20 M**3 2 7 022092 DIRECTIONAL SPECTRAL ESTIMATE BY WAVE FREQUENCY M**2S/RAD 2 0 20 M**2S/RAD 2 7 022093 DIRECTIONAL SPECTRAL ESTIMATE BY WAVE NUMBER M**4 2 0 20 M**4 2 7 022094 TOTAL NUMBER OF WAVE BANDS NUMERIC 0 0 7 NUMERIC 0 3 022095 DIRECTIONAL SPREAD OF INDIVIDUAL WAVES DEGREE 0 0 8 DEGREE 0 3 022096 SPECTRAL BAND WIDTH 1/S 3 0 4 1/S 3 2 022097 MEAN WAVELENGTH > 731 M OF IMAGE SPECTRUM AT LOW WAVE NUMBERS M 0 0 14 M 0 5 022098 WAVELENGTH SPREAD (WAVELENGTH > 731 M) AT LOW WAVE NUMBERS M 0 0 14 M 0 5 022099 MEAN DIRECTION AT LOW WAVE NUMBERS (WAVELENGTH > 731 M) DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 022100 DIRECTION SPREAD AT LOW WAVE NUMBERS(WAVELENGTH > 731 M) DEGREE 0 0 9 DEGREE 0 3 022101 TOTAL ENERGY (WAVELENGTH > 731M) AT LOW WAVE NUMBERS NUMERIC 0 0 31 NUMERIC 0 10 022120 TIDE STATION AUTOMATED WATER LEVEL CHECK CODE TABLE 22120 0 0 5 CODE TABLE 22120 0 2 022121 TIDE STATION MANUAL WATER LEVEL CHECK CODE TABLE 22121 0 0 5 CODE TABLE 22121 0 2 022122 TIDE STATION AUTOMATED METEOROLOGICAL DATA CHECK CODE TABLE 22122 0 0 5 CODE TABLE 22122 0 2 022123 TIDE STATION MANUAL METEOROLOGICAL DATA CHECK CODE TABLE 22123 0 0 5 CODE TABLE 22123 0 2 022141 SEA-SURFACE TEMPERATURE (15-DAY RUNNING MEAN) K 2 0 15 K 2 5 023001 ACCIDENT EARLY NOTIFICATION - ARTICLE APPLICABLE CODE TABLE 23001 0 0 3 CODE TABLE 23001 0 1 023002 ACTIVITY OR FACILITY INVOLVED IN INCIDENT CODE TABLE 23002 0 0 5 CODE TABLE 23002 0 2 023003 TYPE OF RELEASE CODE TABLE 23003 0 0 3 CODE TABLE 23003 0 1 023004 COUNTERMEASURES TAKEN NEAR BORDER CODE TABLE 23004 0 0 3 CODE TABLE 23004 0 1 023005 CAUSE OF INCIDENT CODE TABLE 23005 0 0 2 CODE TABLE 23005 0 1 023006 INCIDENT SITUATION CODE TABLE 23006 0 0 3 CODE TABLE 23006 0 1 023007 CHARACTERISTICS OF RELEASE CODE TABLE 23007 0 0 3 CODE TABLE 23007 0 1 023008 STATE OF CURRENT RELEASE CODE TABLE 23008 0 0 2 CODE TABLE 23008 0 1 023009 STATE OF EXPECTED RELEASE CODE TABLE 23009 0 0 2 CODE TABLE 23009 0 1 023016 POSSIBILITY OF SIGNIFICANT CHEMICAL TOXIC HEALTH EFFECT CODE TABLE 23016 0 0 2 CODE TABLE 23016 0 1 023017 FLOW DISCHARGE OF MAJOR RECIPIENT M**3/S 6 0 20 M**3/S 6 7 023018 RELEASE BEHAVIOUR OVER TIME CODE TABLE 23018 0 0 3 CODE TABLE 23018 0 1 023019 ACTUAL RELEASE HEIGHT M 0 -15000 17 M 0 6 023021 EFFECTIVE RELEASE HEIGHT M 0 -15000 17 M 0 6 023022 DISTANCE OF RELEASE POINT OR SITE OF INCIDENT M 0 0 24 M 0 8 023023 MAIN TRANSPORT SPEED IN THE ATMOSPHERE M/S 1 0 12 M/S 1 4 023024 MAIN TRANSPORT SPEED IN WATER M/S 2 0 13 M/S 2 4 023025 MAIN TRANSPORT SPEED IN GROUND WATER M/S 2 0 13 M/S 2 4 023027 MAIN TRANSPORT DIRECTION IN THE ATMOSPHERE DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 023028 MAIN TRANSPORT DIRECTION IN WATER DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 023029 MAIN TRANSPORT DIRECTION IN GROUND WATER DEGREE TRUE 0 0 9 DEGREE TRUE 0 3 023031 POSSIBILITY THAT PLUME WILL ENCOUNTER PRECIPITATION IN STATE IN CODE TABLE 23031 0 0 2 CODE TABLE 23031 0 1 023032 PLUME WILL ENCOUNTER CHANGE IN WIND DIRECTION AND/OR SPEED FLAG CODE TABLE 23032 0 0 2 CODE TABLE 23032 0 1 024001 ESTIMATE OF AMOUNT OF RADIOACTIVITY RELEASED UP TO SPECIFIED TIM Bq -11 0 28 Bq -11 9 024002 ESTIMATED MAXIMUM POTENTIAL RELEASE Bq -11 0 28 Bq -11 9 024003 COMPOSITION OF RELEASE CODE TABLE 24003 0 0 5 CODE TABLE 24003 0 2 024004 ELEMENT NAME CCITTIA5 0 0 16 CHARACTER 0 2 024005 ISOTOPE MASS NUMERIC 0 0 9 NUMERIC 0 3 024011 DOSE mSv 2 0 32 mSv 2 10 024012 TRAJECTORY DOSE (DEFINED LOCATION AND EXPECTED TIME OF ARRIVAL) mSv 2 0 32 mSv 2 10 024013 GAMMA DOSE IN AIR ALONG THE MAIN TRANSPORT PATH (DEFINED LOCATIO mSv 2 0 32 mSv 2 10 024021 AIR CONCENTRATION (OF NAMED ISOTOPE TYPE INCLUDING GROSS BETA) Bq/M**3 2 0 32 Bq/M**3 2 10 024022 CONCENTRATION IN PRECIPITATION (OF NAMES ISOTOPE TYPE) Bq/L 2 0 32 BQ L-1 2 10 024023 PULSE RATE OF BETA RADIATION 1/S 1 0 14 1/S 1 4 024024 PULSE RATE OF GAMMA RADIATION 1/S 1 0 14 1/S 1 4 025001 RANGE-GATE LENGTH M -1 0 6 M -1 2 025002 NUMBER OF GATES AVERAGED NUMERIC 0 0 4 NUMERIC 0 2 025003 NUMBER OF INTEGRATED PULSES NUMERIC 0 0 8 NUMERIC 0 3 025004 ECHO PROCESSING CODE TABLE 25004 0 0 2 CODE TABLE 25004 0 1 025005 ECHO INTEGRATION CODE TABLE 25005 0 0 2 CODE TABLE 25005 0 1 025006 Z TO R CONVERSION CODE TABLE 25006 0 0 3 CODE TABLE 25006 0 1 025007 Z TO R CONVERSION FACTOR NUMERIC 0 0 12 NUMERIC 0 4 025008 Z TO R CONVERSION EXPONENT NUMERIC 2 0 9 NUMERIC 2 3 025009 CALIBRATION METHOD FLAG TABLE 25009 0 0 4 FLAG TABLE 25009 0 2 025010 CLUTTER TREATMENT CODE TABLE 25010 0 0 4 CODE TABLE 25010 0 2 025011 GROUND OCCULTATION CORRECTION (SCREENING) CODE TABLE 25011 0 0 2 CODE TABLE 25011 0 1 025012 RANGE ATTENUATION CORRECTION CODE TABLE 25012 0 0 2 CODE TABLE 25012 0 1 025013 BRIGHT-BAND CORRECTION FLAG TABLE 25013 0 0 2 FLAG TABLE 25013 0 1 025014 AZIMUTH CLUTTER CUT-OFF (SEE NOTE 1) NUMERIC 0 0 12 NUMERIC 0 4 025015 RADOME ATTENUATION CORRECTION FLAG TABLE 25015 0 0 2 FLAG TABLE 25015 0 1 025016 CLEAR-AIR ATTENUATION CORRECTION dB/M 5 0 6 dB/M 5 2 025017 PRECIPITATION ATTENUATION CORRECTION FLAG TABLE 25017 0 0 2 FLAG TABLE 25017 0 1 025018 A TO Z LAW FOR ATTENUATION FACTOR NUMERIC 7 0 6 NUMERIC 7 2 025019 A TO Z LAW FOR ATTENUATION EXPONENT NUMERIC 2 0 7 NUMERIC 2 3 025020 MEAN SPEED ESTIMATION CODE TABLE 25020 0 0 2 CODE TABLE 25020 0 1 025021 WIND COMPUTATION ENHANCEMENT FLAG TABLE 25021 0 0 8 FLAG TABLE 25021 0 3 025025 BATTERY VOLTAGE V 1 0 9 V 1 3 025026 BATTERY VOLTAGE (LARGE RANGE) V 1 0 12 V 1 4 025028 OPERATOR OR MANUFACTURER DEFINED PARAMETER NUMERIC 1 -16384 15 NUMERIC 1 5 025030 RUNNING MEAN SEA-SURFACE TEMPERATURE USAGE CODE TABLE 25030 0 0 2 CODE TABLE 25030 0 1 025032 WIND PROFILER MODE INFORMATION CODE TABLE 25032 0 0 2 CODE TABLE 25032 0 1 025033 WIND PROFILER SUBMODE INFORMATION* CODE TABLE 25033 0 0 2 CODE TABLE 25033 0 1 025034 WIND PROFILER QUALITY CONTROL TEST RESULTS* FLAG TABLE 25034 0 0 4 FLAG TABLE 25034 0 2 025036 ATMOSPHERICS LOCATION METHOD CODE TABLE 25036 0 0 4 CODE TABLE 25036 0 2 025040 CO2 WIND PRODUCT DERIVATION CODE TABLE 25040 0 0 4 CODE TABLE 25040 0 2 025041 MOVING PLATFORM DIRECTION REPORTING METHOD CODE TABLE 25041 0 0 2 CODE TABLE 25041 0 1 025042 MOVING PLATFORM SPEED REPORTING METHOD CODE TABLE 25042 0 0 2 CODE TABLE 25042 0 1 025043 WAVE SAMPLING INTERVAL (TIME) S 4 0 15 S 4 5 025044 WAVE SAMPLING INTERVAL (SPACE) M 2 0 14 M 2 5 025045 HIRS CHANNEL COMBINATION FLAG TABLE 25045 0 0 21 FLAG TABLE 25045 0 7 025046 MSU CHANNEL COMBINATION FLAG TABLE 25046 0 0 5 FLAG TABLE 25046 0 2 025047 SSU CHANNEL COMBINATION FLAG TABLE 25047 0 0 4 FLAG TABLE 25047 0 2 025048 AMSU-A CHANNEL COMBINATION FLAG TABLE 25048 0 0 16 FLAG TABLE 25048 0 6 025049 AMSU-B CHANNEL COMBINATION FLAG TABLE 25049 0 0 6 FLAG TABLE 25049 0 2 025051 AVHRR CHANNEL COMBINATION FLAG TABLE 25051 0 0 7 FLAG TABLE 25051 0 3 025053 OBSERVATION QUALITY FLAG TABLE 25053 0 0 12 FLAG TABLE 25053 0 4 025054 SSMIS SUBFRAME ID NEMBER NUMERIC 0 0 5 NUMERIC 0 2 025055 MULTIPLEXER HOUSEKEEPING K 2 0 16 K 2 5 025060 SOFTWARE IDENTIFICATION (SEE NOTE 2) NUMERIC 0 0 14 NUMERIC 0 5 025061 SOFTWARE IDENTIFICATION AND VERSION NUMBER CCITTIA5 0 0 96 CHARACTER 0 12 025065 ORIENTATION CORRECTION (AZIMUTH) DEGREE 2 -1000 11 DEGREE 2 4 025066 ORIENTATION CORRECTION (ELEVATION) DEGREE 2 -1000 11 DEGREE 2 4 025067 RADIOSONDE RELEASE POINT PRESSURE CORRECTION PA 0 -8000 14 PA 0 4 025068 NUMBER OF ARCHIVE RECOMPUTES NUMERIC 0 0 7 NUMERIC 0 3 025069 FLIGHT LEVEL PRESSURE CORRECTIONS FLAG TABLE 25069 0 0 8 FLAG TABLE 25069 0 3 025070 MAJOR FRAME COUNT NUMERIC 0 0 4 NUMERIC 0 2 025071 FRAME COUNT NUMERIC 0 0 5 NUMERIC 0 2 025075 SATELLITE ANTENNA CORRECTIONS VERSION NUMBER NUMERIC 0 0 5 NUMERIC 0 2 025076 LOG-10 OF (TEMPERATURE-RADIANCE CENTRAL WAVE NUMBER) FOR ATOVS LOG (1/M) 8 0 30 LOG (1/M) 8 10 025077 BANDWIDTH CORRECTION COEFFICIENT 1 FOR ATOVS NUMERIC 5 -100000 18 NUMERIC 5 7 025078 BANDWIDTH CORRECTION COEFFICIENT 2 FOR ATOVS NUMERIC 5 0 17 NUMERIC 5 6 025079 ALBEDO-RADIANCE SOLAR FILTERED IRRADIANCE FOR ATOVS W/M**2 4 0 24 W/M**2 4 8 025080 ALBEDO-RADIANCE EQUIVALENT FILTER WIDTH FOR ATOVS M 10 0 14 M 10 5 025085 FRACTION OF CLEAR PIXELS IN HIRS FOV NUMERIC 0 0 7 NUMERIC 0 3 025086 DEPTH CORRECTION INDICATOR CODE TABLE 25086 0 0 2 CODE TABLE 25086 0 1 025091 STRUCTURE CONSTANT OF THE REFRACTION INDEX (CN2) dB 3 -18192 13 dB 3 5 025092 ACOUSTIC PROPAGATION VELOCITY M/S 2 28000 14 M/S 2 5 025093 RASS COMPUTATION CORRECTION FLAG TABLE 25093 0 0 8 FLAG TABLE 25093 0 3 025095 ALTIMETER STATE FLAG FLAG TABLE 25095 0 0 2 FLAG TABLE 25095 0 1 025096 RADIOMETER STATE FLAG FLAG TABLE 25096 0 0 5 FLAG TABLE 25096 0 2 025097 THREE DIMENSIONAL ERROR ESTIMATE OF THE NAVIGATOR ORBIT CODE TABLE 25097 0 0 4 CODE TABLE 25097 0 2 025100 XBT/XCTD FALL RATE EQUATION COEFFICIENT A NUMERIC 5 0 20 NUMERIC 5 6 025101 XBT/XCTD FALL RATE EQUATION COEFFICIENT B NUMERIC 5 -500000 21 NUMERIC 5 6 026001 PRINCIPAL TIME OF DAILY READING IN UTC OF MAXIMUM TEMPERATURE HOUR 1 0 12 HOUR 1 3 026002 PRINCIPAL TIME OF DAILY READING IN UTC OF MINIMUM TEMPERATURE HOUR 1 0 12 HOUR 1 3 026003 TIME DIFFERENCE MINUTE 0 -1440 12 MINUTE 0 4 026010 HOURS INCLUDED FLAG TABLE 26010 0 0 26 FLAG TABLE 26010 0 9 026020 DURATION OF PRECIPITATION MINUTE 0 0 11 MINUTE 0 4 027001 LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7 027002 LATITUDE (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4 027003 ALTERNATE LATITUDE (COARSE ACCURACY) DEGREE 2 -9000 15 DEGREE 2 4 027004 ALTERNATE LATITUDE (HIGH ACCURACY) DEGREE 5 -9000000 25 DEGREE 5 7 027020 SATELLITE LOCATION COUNTER NUMERIC 0 0 16 NUMERIC 0 5 027021 SATELLITE SUBLOCATION DIMENSION NUMERIC 0 0 16 NUMERIC 0 5 027031 IN DIRECTION OF 0 DEGREES LONGITUDE, DISTANCE FROM THE EARTH'S C M 2 -1073741824 31 M 2 10 028001 LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8 028002 LONGITUDE (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5 028003 ALTERNATE LONGITUDE (COARSE ACCURACY) DEGREE 2 -18000 16 DEGREE 2 5 028004 ALTERNATE LONGITUDE (HIGH ACCURACY) DEGREE 5 -18000000 26 DEGREE 5 8 028031 IN DIRECTION 90 DEGREES EAST, DISTANCE FROM THE EARTH'S CENTRE M 2 -1073741824 31 M 2 10 029001 PROJECTION TYPE CODE TABLE 29001 0 0 3 CODE TABLE 29001 0 1 029002 CO-ORDINATE GRID TYPE CODE TABLE 29002 0 0 3 CODE TABLE 29002 0 1 030001 PIXEL VALUE (4 BITS) NUMERIC 0 0 4 NUMERIC 0 2 030002 PIXEL VALUE (8 BITS) NUMERIC 0 0 8 NUMERIC 0 3 030004 PIXEL VALUE (16 BITS) NUMERIC 0 0 16 NUMERIC 0 5 030021 NUMBER OF PIXELS PER ROW NUMERIC 0 0 12 NUMERIC 0 4 030022 NUMBER OF PIXELS PER COLUMN NUMERIC 0 0 12 NUMERIC 0 4 030031 PICTURE TYPE CODE TABLE 30031 0 0 4 CODE TABLE 30031 0 2 030032 COMBINATION WITH OTHER DATA FLAG TABLE 30032 0 0 16 FLAG TABLE 30032 0 6 031000 SHORT DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 1 NUMERIC 0 1 031001 DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 8 NUMERIC 0 3 031002 EXTENDED DELAYED DESCRIPTOR REPLICATION FACTOR NUMERIC 0 0 16 NUMERIC 0 5 031011 DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 8 NUMERIC 0 3 031012 EXTENDED DELAYED DESCRIPTOR AND DATA REPETITION FACTOR NUMERIC 0 0 16 NUMERIC 0 5 031021 ASSOCIATED FIELD SIGNIFICANCE CODE TABLE 31021 0 0 6 CODE TABLE 31021 0 2 031031 DATA PRESENT INDICATOR FLAG TABLE 31031 0 0 1 FLAG TABLE 31031 0 1 033002 QUALITY INFORMATION CODE TABLE 33002 0 0 2 CODE TABLE 33002 0 1 033003 QUALITY INFORMATION CODE TABLE 33003 0 0 3 CODE TABLE 33003 0 1 033005 QUALITY INFORMATION (AWS DATA) FLAG TABLE 33005 0 0 30 FLAG TABLE 33005 0 10 033006 INTERNAL MEASUREMENT STATUS INFORMATION (AWS) CODE TABLE 33006 0 0 3 CODE TABLE 33006 0 1 033007 PER CENT CONFIDENCE % 0 0 7 % 0 3 033015 DATA QUALITY CHECK INDICATOR CODE TABLE 33015 0 0 6 CODE TABLE 33015 0 2 033020 QUALITY CONTROL INDICATION OF FOLLOWING VALUE CODE TABLE 33020 0 0 3 CODE TABLE 33020 0 1 033021 QUALITY OF FOLLOWING VALUE CODE TABLE 33021 0 0 2 CODE TABLE 33021 0 1 033022 QUALITY OF BUOY SATELLITE TRANSMISSION CODE TABLE 33022 0 0 2 CODE TABLE 33022 0 1 033023 QUALITY OF BUOY LOCATION CODE TABLE 33023 0 0 2 CODE TABLE 33023 0 1 033024 STATION ELEVATION QUALITY MARK (FOR MOBILE STATIONS) CODE TABLE 33024 0 0 4 CODE TABLE 33024 0 2 033025 ACARS INTERPOLATED VALUES CODE TABLE 33025 0 0 3 CODE TABLE 33025 0 1 033026 MOISTURE QUALITY CODE TABLE 33026 0 0 6 CODE TABLE 33026 0 2 033027 LOCATION QUALITY CLASS (RANGE OF RADIUS OF 66 % CONFIDENCE) CODE TABLE 33027 0 0 3 CODE TABLE 33027 0 1 033030 SCAN LINE STATUS FLAGS FOR ATOVS FLAG TABLE 33030 0 0 24 FLAG TABLE 33030 0 8 033031 SCAN LINE QUALITY FLAGS FOR ATOVS FLAG TABLE 33031 0 0 24 FLAG TABLE 33031 0 8 033032 CHANNEL QUALITY FLAGS FOR ATOVS FLAG TABLE 33032 0 0 24 FLAG TABLE 33032 0 8 033033 FIELD OF VIEW QUALITY FLAGS FOR ATOVS FLAG TABLE 33033 0 0 24 FLAG TABLE 33033 0 8 033035 MANUAL/AUTOMATIC QUALITY CONTROL CODE TABLE 33035 0 0 4 CODE TABLE 33035 0 2 033036 NOMINAL CONFIDENCE THRESHOLD % 0 0 7 % 0 3 033037 WIND CORRELATION ERROR FLAG TABLE 33037 0 0 20 FLAG TABLE 33037 0 7 033038 QUALITY FLAGS FOR GROUND-BASED GNSS DATA FLAG TABLE 33038 0 0 10 FLAG TABLE 33038 0 4 033040 CONFIDENCE INTERVAL % 0 0 7 PERCENT 0 3 033041 ATTRIBUTE OF FOLLOWING VALUE CODE TABLE 33041 0 0 2 CODE TABLE 33041 0 1 033050 GLOBAL GTSPP QUALITY FLAG CODE TABLE 33050 0 0 4 CODE TABLE 33050 0 2 035000 FM AND REGIONAL CODE NUMBER CODE TABLE 35000 0 0 10 CODE TABLE 35000 0 3 035001 TIME-FRAME FOR MONITORING CODE TABLE 35001 0 0 3 CODE TABLE 35001 0 1 035011 NUMBER OF REPORTS ACTUALLY RECEIVED NUMERIC 0 0 14 NUMERIC 0 4 035021 BULLETIN BEING MONITORED (TTAAII) CCITTIA5 0 0 48 CHARACTER 0 6 035022 BULLETIN BEING MONITORED (YYGGGG) CCITTIA5 0 0 48 CHARACTER 0 6 035023 BULLETIN BEING MONITORED (CCCC) CCITTIA5 0 0 32 CHARACTER 0 4 035024 BULLETIN BEING MONITORED (BBB) CCITTIA5 0 0 24 CHARACTER 0 3 035030 DISCREPANCIES IN THE AVAILABILITY OF EXPECTED DATA CODE TABLE 35030 0 0 4 CODE TABLE 35030 0 1 035031 QUALIFIER ON MONITORING RESULTS CODE TABLE 35031 0 0 7 CODE TABLE 35031 0 2 035032 CAUSE OF MISSING DATA CODE TABLE 35032 0 0 4 CODE TABLE 35032 0 1 035033 OBSERVATION AND COLLECTION DEFICIENCIES CODE TABLE 35033 0 0 7 CODE TABLE 35033 0 2 035034 STATISTICAL TRENDS FOR AVAILABILITY OF DATA (DURING THE SURVEY P CODE TABLE 35034 0 0 3 CODE TABLE 35034 0 1 035035 REASON FOR TERMINATION CODE TABLE 35035 0 0 5 CODE TABLE 35035 0 2 dballe-5.18/extra/test-repinfo2.csv0000644000175000017500000000031511634672332014162 0000000000000001,synop,report synottico,101,oss,0 200,FIXspnpo,FIX experiment,200,pre,255 210,LCBspnpo,LCB experiment,210,pre,255 220,MODspnpo,MOD experiment,220,pre,255 255,generic,export generici da DB Meteo,-5,?,255 dballe-5.18/extra/csv/0000755000175000017500000000000011533746523011622 500000000000000dballe-5.18/extra/csv/temp1.csv0000644000175000017500000005475211533746523013322 00000000000000Longitude,Latitude,Report,Date,Level1,L1,Level2,L2,Time range,P1,P2,Varcode,Value 9.2833,45.444,temp,2011-01-24 00:00:00,1,,,,254,0,0,B10004,100700 9.2833,45.444,temp,2011-01-24 00:00:00,100,770,0,5,254,0,0,B08042,4 9.2833,45.444,temp,2011-01-24 00:00:00,100,770,0,5,254,0,0,B12101,228.86 9.2833,45.444,temp,2011-01-24 00:00:00,100,770,0,5,254,0,0,B12103,192.86 9.2833,45.444,temp,2011-01-24 00:00:00,100,1000,0,2,254,0,0,B08042,32 9.2833,45.444,temp,2011-01-24 00:00:00,100,1000,0,2,254,0,0,B10008,302999 9.2833,45.444,temp,2011-01-24 00:00:00,100,1000,0,2,254,0,0,B11001,145 9.2833,45.444,temp,2011-01-24 00:00:00,100,1000,0,2,254,0,0,B11002,9.8 9.2833,45.444,temp,2011-01-24 00:00:00,100,1000,0,2,254,0,0,B12101,229.86 9.2833,45.444,temp,2011-01-24 00:00:00,100,1000,0,2,254,0,0,B12103,193.86 9.2833,45.444,temp,2011-01-24 00:00:00,100,1110,0,6,254,0,0,B08042,2 9.2833,45.444,temp,2011-01-24 00:00:00,100,1110,0,6,254,0,0,B11001,140 9.2833,45.444,temp,2011-01-24 00:00:00,100,1110,0,6,254,0,0,B11002,6.7 9.2833,45.444,temp,2011-01-24 00:00:00,100,1190,0,6,254,0,0,B08042,2 9.2833,45.444,temp,2011-01-24 00:00:00,100,1190,0,6,254,0,0,B11001,165 9.2833,45.444,temp,2011-01-24 00:00:00,100,1190,0,6,254,0,0,B11002,9.3 9.2833,45.444,temp,2011-01-24 00:00:00,100,1350,0,6,254,0,0,B08042,2 9.2833,45.444,temp,2011-01-24 00:00:00,100,1350,0,6,254,0,0,B11001,120 9.2833,45.444,temp,2011-01-24 00:00:00,100,1350,0,6,254,0,0,B11002,8.2 9.2833,45.444,temp,2011-01-24 00:00:00,100,1450,0,6,254,0,0,B08042,2 9.2833,45.444,temp,2011-01-24 00:00:00,100,1450,0,6,254,0,0,B11001,150 9.2833,45.444,temp,2011-01-24 00:00:00,100,1450,0,6,254,0,0,B11002,10.8 9.2833,45.444,temp,2011-01-24 00:00:00,100,1570,0,6,254,0,0,B08042,2 9.2833,45.444,temp,2011-01-24 00:00:00,100,1570,0,6,254,0,0,B11001,145 9.2833,45.444,temp,2011-01-24 00:00:00,100,1570,0,6,254,0,0,B11002,10.8 9.2833,45.444,temp,2011-01-24 00:00:00,100,1630,0,5,254,0,0,B08042,4 9.2833,45.444,temp,2011-01-24 00:00:00,100,1630,0,5,254,0,0,B12101,227.46 9.2833,45.444,temp,2011-01-24 00:00:00,100,1630,0,5,254,0,0,B12103,192.46 9.2833,45.444,temp,2011-01-24 00:00:00,100,1670,0,6,254,0,0,B08042,2 9.2833,45.444,temp,2011-01-24 00:00:00,100,1670,0,6,254,0,0,B11001,135 9.2833,45.444,temp,2011-01-24 00:00:00,100,1670,0,6,254,0,0,B11002,7.7 9.2833,45.444,temp,2011-01-24 00:00:00,100,1840,0,6,254,0,0,B08042,2 9.2833,45.444,temp,2011-01-24 00:00:00,100,1840,0,6,254,0,0,B11001,140 9.2833,45.444,temp,2011-01-24 00:00:00,100,1840,0,6,254,0,0,B11002,5.1 9.2833,45.444,temp,2011-01-24 00:00:00,100,1850,0,5,254,0,0,B08042,4 9.2833,45.444,temp,2011-01-24 00:00:00,100,1850,0,5,254,0,0,B12101,222.66 9.2833,45.444,temp,2011-01-24 00:00:00,100,1850,0,5,254,0,0,B12103,188.66 9.2833,45.444,temp,2011-01-24 00:00:00,100,2000,0,2,254,0,0,B08042,32 9.2833,45.444,temp,2011-01-24 00:00:00,100,2000,0,2,254,0,0,B10008,257765 9.2833,45.444,temp,2011-01-24 00:00:00,100,2000,0,2,254,0,0,B11001,70 9.2833,45.444,temp,2011-01-24 00:00:00,100,2000,0,2,254,0,0,B11002,4.6 9.2833,45.444,temp,2011-01-24 00:00:00,100,2000,0,2,254,0,0,B12101,223.26 9.2833,45.444,temp,2011-01-24 00:00:00,100,2000,0,2,254,0,0,B12103,189.26 9.2833,45.444,temp,2011-01-24 00:00:00,100,2210,0,6,254,0,0,B08042,2 9.2833,45.444,temp,2011-01-24 00:00:00,100,2210,0,6,254,0,0,B11001,115 9.2833,45.444,temp,2011-01-24 00:00:00,100,2210,0,6,254,0,0,B11002,1.0 9.2833,45.444,temp,2011-01-24 00:00:00,100,2230,0,5,254,0,0,B08042,4 9.2833,45.444,temp,2011-01-24 00:00:00,100,2230,0,5,254,0,0,B12101,224.06 9.2833,45.444,temp,2011-01-24 00:00:00,100,2230,0,5,254,0,0,B12103,190.06 9.2833,45.444,temp,2011-01-24 00:00:00,100,2620,0,5,254,0,0,B08042,4 9.2833,45.444,temp,2011-01-24 00:00:00,100,2620,0,5,254,0,0,B12101,219.86 9.2833,45.444,temp,2011-01-24 00:00:00,100,2620,0,5,254,0,0,B12103,186.86 9.2833,45.444,temp,2011-01-24 00:00:00,100,3000,0,2,254,0,0,B08042,32 9.2833,45.444,temp,2011-01-24 00:00:00,100,3000,0,2,254,0,0,B10008,231959 9.2833,45.444,temp,2011-01-24 00:00:00,100,3000,0,2,254,0,0,B11001,105 9.2833,45.444,temp,2011-01-24 00:00:00,100,3000,0,2,254,0,0,B11002,1.5 9.2833,45.444,temp,2011-01-24 00:00:00,100,3000,0,2,254,0,0,B12101,222.06 9.2833,45.444,temp,2011-01-24 00:00:00,100,3000,0,2,254,0,0,B12103,188.06 9.2833,45.444,temp,2011-01-24 00:00:00,100,3060,0,5,254,0,0,B08042,4 9.2833,45.444,temp,2011-01-24 00:00:00,100,3060,0,5,254,0,0,B12101,222.26 9.2833,45.444,temp,2011-01-24 00:00:00,100,3060,0,5,254,0,0,B12103,188.26 9.2833,45.444,temp,2011-01-24 00:00:00,100,3260,0,6,254,0,0,B08042,2 9.2833,45.444,temp,2011-01-24 00:00:00,100,3260,0,6,254,0,0,B11001,10 9.2833,45.444,temp,2011-01-24 00:00:00,100,3260,0,6,254,0,0,B11002,5.1 9.2833,45.444,temp,2011-01-24 00:00:00,100,3510,0,6,254,0,0,B08042,2 9.2833,45.444,temp,2011-01-24 00:00:00,100,3510,0,6,254,0,0,B11001,25 9.2833,45.444,temp,2011-01-24 00:00:00,100,3510,0,6,254,0,0,B11002,7.7 9.2833,45.444,temp,2011-01-24 00:00:00,100,3690,0,6,254,0,0,B08042,2 9.2833,45.444,temp,2011-01-24 00:00:00,100,3690,0,6,254,0,0,B11001,360 9.2833,45.444,temp,2011-01-24 00:00:00,100,3690,0,6,254,0,0,B11002,5.1 9.2833,45.444,temp,2011-01-24 00:00:00,100,4030,0,5,254,0,0,B08042,4 9.2833,45.444,temp,2011-01-24 00:00:00,100,4030,0,5,254,0,0,B12101,217.26 9.2833,45.444,temp,2011-01-24 00:00:00,100,4030,0,5,254,0,0,B12103,185.26 9.2833,45.444,temp,2011-01-24 00:00:00,100,4320,0,6,254,0,0,B08042,2 9.2833,45.444,temp,2011-01-24 00:00:00,100,4320,0,6,254,0,0,B11001,15 9.2833,45.444,temp,2011-01-24 00:00:00,100,4320,0,6,254,0,0,B11002,1.5 9.2833,45.444,temp,2011-01-24 00:00:00,100,5000,0,2,254,0,0,B08042,32 9.2833,45.444,temp,2011-01-24 00:00:00,100,5000,0,2,254,0,0,B10008,199775 9.2833,45.444,temp,2011-01-24 00:00:00,100,5000,0,2,254,0,0,B11001,320 9.2833,45.444,temp,2011-01-24 00:00:00,100,5000,0,2,254,0,0,B11002,4.6 9.2833,45.444,temp,2011-01-24 00:00:00,100,5000,0,2,254,0,0,B12101,219.66 9.2833,45.444,temp,2011-01-24 00:00:00,100,5000,0,2,254,0,0,B12103,186.66 9.2833,45.444,temp,2011-01-24 00:00:00,100,5070,0,5,254,0,0,B08042,4 9.2833,45.444,temp,2011-01-24 00:00:00,100,5070,0,5,254,0,0,B12101,219.86 9.2833,45.444,temp,2011-01-24 00:00:00,100,5070,0,5,254,0,0,B12103,186.86 9.2833,45.444,temp,2011-01-24 00:00:00,100,7000,0,2,254,0,0,B08042,32 9.2833,45.444,temp,2011-01-24 00:00:00,100,7000,0,2,254,0,0,B10008,178679 9.2833,45.444,temp,2011-01-24 00:00:00,100,7000,0,2,254,0,0,B11001,350 9.2833,45.444,temp,2011-01-24 00:00:00,100,7000,0,2,254,0,0,B11002,3.1 9.2833,45.444,temp,2011-01-24 00:00:00,100,7000,0,2,254,0,0,B12101,218.26 9.2833,45.444,temp,2011-01-24 00:00:00,100,7000,0,2,254,0,0,B12103,186.26 9.2833,45.444,temp,2011-01-24 00:00:00,100,7240,0,6,254,0,0,B08042,2 9.2833,45.444,temp,2011-01-24 00:00:00,100,7240,0,6,254,0,0,B11001,335 9.2833,45.444,temp,2011-01-24 00:00:00,100,7240,0,6,254,0,0,B11002,5.1 9.2833,45.444,temp,2011-01-24 00:00:00,100,7500,0,6,254,0,0,B08042,2 9.2833,45.444,temp,2011-01-24 00:00:00,100,7500,0,6,254,0,0,B11001,305 9.2833,45.444,temp,2011-01-24 00:00:00,100,7500,0,6,254,0,0,B11002,6.2 9.2833,45.444,temp,2011-01-24 00:00:00,100,7680,0,6,254,0,0,B08042,2 9.2833,45.444,temp,2011-01-24 00:00:00,100,7680,0,6,254,0,0,B11001,305 9.2833,45.444,temp,2011-01-24 00:00:00,100,7680,0,6,254,0,0,B11002,5.1 9.2833,45.444,temp,2011-01-24 00:00:00,100,10000,0,2,254,0,0,B08042,38 9.2833,45.444,temp,2011-01-24 00:00:00,100,10000,0,2,254,0,0,B10008,156405 9.2833,45.444,temp,2011-01-24 00:00:00,100,10000,0,2,254,0,0,B11001,355 9.2833,45.444,temp,2011-01-24 00:00:00,100,10000,0,2,254,0,0,B11002,3.1 9.2833,45.444,temp,2011-01-24 00:00:00,100,10000,0,2,254,0,0,B12101,217.06 9.2833,45.444,temp,2011-01-24 00:00:00,100,10000,0,2,254,0,0,B12103,185.06 9.2833,45.444,temp,2011-01-24 00:00:00,100,10000,0,5,254,0,0,B08042,38 9.2833,45.444,temp,2011-01-24 00:00:00,100,10000,0,5,254,0,0,B12101,217.06 9.2833,45.444,temp,2011-01-24 00:00:00,100,10000,0,5,254,0,0,B12103,185.06 9.2833,45.444,temp,2011-01-24 00:00:00,100,10000,0,6,254,0,0,B08042,38 9.2833,45.444,temp,2011-01-24 00:00:00,100,10000,0,6,254,0,0,B11001,355 9.2833,45.444,temp,2011-01-24 00:00:00,100,10000,0,6,254,0,0,B11002,3.1 9.2833,45.444,temp,2011-01-24 00:00:00,100,10900,0,6,254,0,0,B08042,2 9.2833,45.444,temp,2011-01-24 00:00:00,100,10900,0,6,254,0,0,B11001,15 9.2833,45.444,temp,2011-01-24 00:00:00,100,10900,0,6,254,0,0,B11002,5.1 9.2833,45.444,temp,2011-01-24 00:00:00,100,11400,0,5,254,0,0,B08042,4 9.2833,45.444,temp,2011-01-24 00:00:00,100,11400,0,5,254,0,0,B12101,219.46 9.2833,45.444,temp,2011-01-24 00:00:00,100,11400,0,5,254,0,0,B12103,186.46 9.2833,45.444,temp,2011-01-24 00:00:00,100,12900,0,6,254,0,0,B08042,2 9.2833,45.444,temp,2011-01-24 00:00:00,100,12900,0,6,254,0,0,B11001,340 9.2833,45.444,temp,2011-01-24 00:00:00,100,12900,0,6,254,0,0,B11002,5.7 9.2833,45.444,temp,2011-01-24 00:00:00,100,14100,0,6,254,0,0,B08042,2 9.2833,45.444,temp,2011-01-24 00:00:00,100,14100,0,6,254,0,0,B11001,25 9.2833,45.444,temp,2011-01-24 00:00:00,100,14100,0,6,254,0,0,B11002,5.1 9.2833,45.444,temp,2011-01-24 00:00:00,100,14900,0,6,254,0,0,B08042,2 9.2833,45.444,temp,2011-01-24 00:00:00,100,14900,0,6,254,0,0,B11001,20 9.2833,45.444,temp,2011-01-24 00:00:00,100,14900,0,6,254,0,0,B11002,5.1 9.2833,45.444,temp,2011-01-24 00:00:00,100,15000,0,2,254,0,0,B08042,32 9.2833,45.444,temp,2011-01-24 00:00:00,100,15000,0,2,254,0,0,B10008,130894 9.2833,45.444,temp,2011-01-24 00:00:00,100,15000,0,2,254,0,0,B11001,20 9.2833,45.444,temp,2011-01-24 00:00:00,100,15000,0,2,254,0,0,B11002,5.7 9.2833,45.444,temp,2011-01-24 00:00:00,100,15000,0,2,254,0,0,B12101,219.06 9.2833,45.444,temp,2011-01-24 00:00:00,100,15000,0,2,254,0,0,B12103,186.06 9.2833,45.444,temp,2011-01-24 00:00:00,100,16000,0,6,254,0,0,B08042,2 9.2833,45.444,temp,2011-01-24 00:00:00,100,16000,0,6,254,0,0,B11001,40 9.2833,45.444,temp,2011-01-24 00:00:00,100,16000,0,6,254,0,0,B11002,8.2 9.2833,45.444,temp,2011-01-24 00:00:00,100,17400,0,5,254,0,0,B08042,6 9.2833,45.444,temp,2011-01-24 00:00:00,100,17400,0,5,254,0,0,B12101,216.66 9.2833,45.444,temp,2011-01-24 00:00:00,100,17400,0,5,254,0,0,B12103,186.66 9.2833,45.444,temp,2011-01-24 00:00:00,100,17400,0,6,254,0,0,B08042,6 9.2833,45.444,temp,2011-01-24 00:00:00,100,17400,0,6,254,0,0,B11001,15 9.2833,45.444,temp,2011-01-24 00:00:00,100,17400,0,6,254,0,0,B11002,14.9 9.2833,45.444,temp,2011-01-24 00:00:00,100,20000,0,2,254,0,0,B08042,32 9.2833,45.444,temp,2011-01-24 00:00:00,100,20000,0,2,254,0,0,B10008,112938 9.2833,45.444,temp,2011-01-24 00:00:00,100,20000,0,2,254,0,0,B11001,25 9.2833,45.444,temp,2011-01-24 00:00:00,100,20000,0,2,254,0,0,B11002,13.4 9.2833,45.444,temp,2011-01-24 00:00:00,100,20000,0,2,254,0,0,B12101,217.66 9.2833,45.444,temp,2011-01-24 00:00:00,100,20000,0,2,254,0,0,B12103,189.66 9.2833,45.444,temp,2011-01-24 00:00:00,100,21100,0,6,254,0,0,B08042,2 9.2833,45.444,temp,2011-01-24 00:00:00,100,21100,0,6,254,0,0,B11001,20 9.2833,45.444,temp,2011-01-24 00:00:00,100,21100,0,6,254,0,0,B11002,11.8 9.2833,45.444,temp,2011-01-24 00:00:00,100,21400,0,5,254,0,0,B08042,4 9.2833,45.444,temp,2011-01-24 00:00:00,100,21400,0,5,254,0,0,B12101,218.46 9.2833,45.444,temp,2011-01-24 00:00:00,100,21400,0,5,254,0,0,B12103,193.46 9.2833,45.444,temp,2011-01-24 00:00:00,100,23100,0,3,254,0,0,B08042,20 9.2833,45.444,temp,2011-01-24 00:00:00,100,23100,0,3,254,0,0,B11001,40 9.2833,45.444,temp,2011-01-24 00:00:00,100,23100,0,3,254,0,0,B11002,17.0 9.2833,45.444,temp,2011-01-24 00:00:00,100,23100,0,3,254,0,0,B12101,214.06 9.2833,45.444,temp,2011-01-24 00:00:00,100,23100,0,3,254,0,0,B12103,197.06 9.2833,45.444,temp,2011-01-24 00:00:00,100,23100,0,5,254,0,0,B08042,20 9.2833,45.444,temp,2011-01-24 00:00:00,100,23100,0,5,254,0,0,B12101,214.06 9.2833,45.444,temp,2011-01-24 00:00:00,100,23100,0,5,254,0,0,B12103,197.06 9.2833,45.444,temp,2011-01-24 00:00:00,100,24500,0,6,254,0,0,B08042,2 9.2833,45.444,temp,2011-01-24 00:00:00,100,24500,0,6,254,0,0,B11001,55 9.2833,45.444,temp,2011-01-24 00:00:00,100,24500,0,6,254,0,0,B11002,17.5 9.2833,45.444,temp,2011-01-24 00:00:00,100,25000,0,2,254,0,0,B08042,32 9.2833,45.444,temp,2011-01-24 00:00:00,100,25000,0,2,254,0,0,B10008,99004 9.2833,45.444,temp,2011-01-24 00:00:00,100,25000,0,2,254,0,0,B11001,55 9.2833,45.444,temp,2011-01-24 00:00:00,100,25000,0,2,254,0,0,B11002,19.5 9.2833,45.444,temp,2011-01-24 00:00:00,100,25000,0,2,254,0,0,B12101,217.06 9.2833,45.444,temp,2011-01-24 00:00:00,100,25000,0,2,254,0,0,B12103,200.06 9.2833,45.444,temp,2011-01-24 00:00:00,100,28300,0,6,254,0,0,B08042,2 9.2833,45.444,temp,2011-01-24 00:00:00,100,28300,0,6,254,0,0,B11001,50 9.2833,45.444,temp,2011-01-24 00:00:00,100,28300,0,6,254,0,0,B11002,37.0 9.2833,45.444,temp,2011-01-24 00:00:00,100,29500,0,5,254,0,0,B08042,4 9.2833,45.444,temp,2011-01-24 00:00:00,100,29500,0,5,254,0,0,B12101,219.66 9.2833,45.444,temp,2011-01-24 00:00:00,100,29500,0,5,254,0,0,B12103,203.66 9.2833,45.444,temp,2011-01-24 00:00:00,100,30000,0,2,254,0,0,B08042,32 9.2833,45.444,temp,2011-01-24 00:00:00,100,30000,0,2,254,0,0,B10008,87622 9.2833,45.444,temp,2011-01-24 00:00:00,100,30000,0,2,254,0,0,B11001,45 9.2833,45.444,temp,2011-01-24 00:00:00,100,30000,0,2,254,0,0,B11002,35.5 9.2833,45.444,temp,2011-01-24 00:00:00,100,30000,0,2,254,0,0,B12101,220.06 9.2833,45.444,temp,2011-01-24 00:00:00,100,30000,0,2,254,0,0,B12103,202.06 9.2833,45.444,temp,2011-01-24 00:00:00,100,31000,0,5,254,0,0,B08042,4 9.2833,45.444,temp,2011-01-24 00:00:00,100,31000,0,5,254,0,0,B12101,221.66 9.2833,45.444,temp,2011-01-24 00:00:00,100,31000,0,5,254,0,0,B12103,202.66 9.2833,45.444,temp,2011-01-24 00:00:00,100,32900,0,6,254,0,0,B08042,2 9.2833,45.444,temp,2011-01-24 00:00:00,100,32900,0,6,254,0,0,B11001,55 9.2833,45.444,temp,2011-01-24 00:00:00,100,32900,0,6,254,0,0,B11002,30.4 9.2833,45.444,temp,2011-01-24 00:00:00,100,34800,0,5,254,0,0,B08042,4 9.2833,45.444,temp,2011-01-24 00:00:00,100,34800,0,5,254,0,0,B12101,225.66 9.2833,45.444,temp,2011-01-24 00:00:00,100,34800,0,5,254,0,0,B12103,216.66 9.2833,45.444,temp,2011-01-24 00:00:00,100,36000,0,6,254,0,0,B08042,2 9.2833,45.444,temp,2011-01-24 00:00:00,100,36000,0,6,254,0,0,B11001,60 9.2833,45.444,temp,2011-01-24 00:00:00,100,36000,0,6,254,0,0,B11002,35.5 9.2833,45.444,temp,2011-01-24 00:00:00,100,39700,0,5,254,0,0,B08042,4 9.2833,45.444,temp,2011-01-24 00:00:00,100,39700,0,5,254,0,0,B12101,233.46 9.2833,45.444,temp,2011-01-24 00:00:00,100,39700,0,5,254,0,0,B12103,217.46 9.2833,45.444,temp,2011-01-24 00:00:00,100,40000,0,2,254,0,0,B08042,32 9.2833,45.444,temp,2011-01-24 00:00:00,100,40000,0,2,254,0,0,B10008,68881 9.2833,45.444,temp,2011-01-24 00:00:00,100,40000,0,2,254,0,0,B11001,60 9.2833,45.444,temp,2011-01-24 00:00:00,100,40000,0,2,254,0,0,B11002,31.4 9.2833,45.444,temp,2011-01-24 00:00:00,100,40000,0,2,254,0,0,B12101,233.46 9.2833,45.444,temp,2011-01-24 00:00:00,100,40000,0,2,254,0,0,B12103,219.46 9.2833,45.444,temp,2011-01-24 00:00:00,100,40200,0,5,254,0,0,B08042,4 9.2833,45.444,temp,2011-01-24 00:00:00,100,40200,0,5,254,0,0,B12101,233.26 9.2833,45.444,temp,2011-01-24 00:00:00,100,40200,0,5,254,0,0,B12103,220.26 9.2833,45.444,temp,2011-01-24 00:00:00,100,45500,0,5,254,0,0,B08042,4 9.2833,45.444,temp,2011-01-24 00:00:00,100,45500,0,5,254,0,0,B12101,239.66 9.2833,45.444,temp,2011-01-24 00:00:00,100,45500,0,5,254,0,0,B12103,222.66 9.2833,45.444,temp,2011-01-24 00:00:00,100,46400,0,5,254,0,0,B08042,4 9.2833,45.444,temp,2011-01-24 00:00:00,100,46400,0,5,254,0,0,B12101,240.26 9.2833,45.444,temp,2011-01-24 00:00:00,100,46400,0,5,254,0,0,B12103,230.26 9.2833,45.444,temp,2011-01-24 00:00:00,100,48800,0,6,254,0,0,B08042,2 9.2833,45.444,temp,2011-01-24 00:00:00,100,48800,0,6,254,0,0,B11001,55 9.2833,45.444,temp,2011-01-24 00:00:00,100,48800,0,6,254,0,0,B11002,17.0 9.2833,45.444,temp,2011-01-24 00:00:00,100,50000,0,2,254,0,0,B08042,36 9.2833,45.444,temp,2011-01-24 00:00:00,100,50000,0,2,254,0,0,B10008,53574 9.2833,45.444,temp,2011-01-24 00:00:00,100,50000,0,2,254,0,0,B11001,50 9.2833,45.444,temp,2011-01-24 00:00:00,100,50000,0,2,254,0,0,B11002,15.4 9.2833,45.444,temp,2011-01-24 00:00:00,100,50000,0,2,254,0,0,B12101,244.26 9.2833,45.444,temp,2011-01-24 00:00:00,100,50000,0,2,254,0,0,B12103,232.26 9.2833,45.444,temp,2011-01-24 00:00:00,100,50000,0,5,254,0,0,B08042,36 9.2833,45.444,temp,2011-01-24 00:00:00,100,50000,0,5,254,0,0,B12101,244.26 9.2833,45.444,temp,2011-01-24 00:00:00,100,50000,0,5,254,0,0,B12103,231.26 9.2833,45.444,temp,2011-01-24 00:00:00,100,53800,0,6,254,0,0,B08042,2 9.2833,45.444,temp,2011-01-24 00:00:00,100,53800,0,6,254,0,0,B11001,40 9.2833,45.444,temp,2011-01-24 00:00:00,100,53800,0,6,254,0,0,B11002,10.3 9.2833,45.444,temp,2011-01-24 00:00:00,100,54300,0,5,254,0,0,B08042,4 9.2833,45.444,temp,2011-01-24 00:00:00,100,54300,0,5,254,0,0,B12101,248.66 9.2833,45.444,temp,2011-01-24 00:00:00,100,54300,0,5,254,0,0,B12103,241.66 9.2833,45.444,temp,2011-01-24 00:00:00,100,57600,0,5,254,0,0,B08042,4 9.2833,45.444,temp,2011-01-24 00:00:00,100,57600,0,5,254,0,0,B12101,250.26 9.2833,45.444,temp,2011-01-24 00:00:00,100,57600,0,5,254,0,0,B12103,246.86 9.2833,45.444,temp,2011-01-24 00:00:00,100,60000,0,7,254,0,0,B08042,1 9.2833,45.444,temp,2011-01-24 00:00:00,100,60000,0,7,254,0,0,B11001,40 9.2833,45.444,temp,2011-01-24 00:00:00,100,60000,0,7,254,0,0,B11002,8.7 9.2833,45.444,temp,2011-01-24 00:00:00,100,62800,0,5,254,0,0,B08042,4 9.2833,45.444,temp,2011-01-24 00:00:00,100,62800,0,5,254,0,0,B12101,254.06 9.2833,45.444,temp,2011-01-24 00:00:00,100,62800,0,5,254,0,0,B12103,250.56 9.2833,45.444,temp,2011-01-24 00:00:00,100,64800,0,6,254,0,0,B08042,2 9.2833,45.444,temp,2011-01-24 00:00:00,100,64800,0,6,254,0,0,B11001,45 9.2833,45.444,temp,2011-01-24 00:00:00,100,64800,0,6,254,0,0,B11002,8.2 9.2833,45.444,temp,2011-01-24 00:00:00,100,68400,0,5,254,0,0,B08042,4 9.2833,45.444,temp,2011-01-24 00:00:00,100,68400,0,5,254,0,0,B12101,259.26 9.2833,45.444,temp,2011-01-24 00:00:00,100,68400,0,5,254,0,0,B12103,247.26 9.2833,45.444,temp,2011-01-24 00:00:00,100,69500,0,6,254,0,0,B08042,2 9.2833,45.444,temp,2011-01-24 00:00:00,100,69500,0,6,254,0,0,B11001,60 9.2833,45.444,temp,2011-01-24 00:00:00,100,69500,0,6,254,0,0,B11002,5.1 9.2833,45.444,temp,2011-01-24 00:00:00,100,70000,0,2,254,0,0,B08042,32 9.2833,45.444,temp,2011-01-24 00:00:00,100,70000,0,2,254,0,0,B10008,29230 9.2833,45.444,temp,2011-01-24 00:00:00,100,70000,0,2,254,0,0,B11001,60 9.2833,45.444,temp,2011-01-24 00:00:00,100,70000,0,2,254,0,0,B11002,4.6 9.2833,45.444,temp,2011-01-24 00:00:00,100,70000,0,2,254,0,0,B12101,260.46 9.2833,45.444,temp,2011-01-24 00:00:00,100,70000,0,2,254,0,0,B12103,248.46 9.2833,45.444,temp,2011-01-24 00:00:00,100,76400,0,5,254,0,0,B08042,4 9.2833,45.444,temp,2011-01-24 00:00:00,100,76400,0,5,254,0,0,B12101,266.26 9.2833,45.444,temp,2011-01-24 00:00:00,100,76400,0,5,254,0,0,B12103,248.26 9.2833,45.444,temp,2011-01-24 00:00:00,100,80000,0,7,254,0,0,B08042,1 9.2833,45.444,temp,2011-01-24 00:00:00,100,80000,0,7,254,0,0,B11001,5 9.2833,45.444,temp,2011-01-24 00:00:00,100,80000,0,7,254,0,0,B11002,3.6 9.2833,45.444,temp,2011-01-24 00:00:00,100,85000,0,2,254,0,0,B08042,32 9.2833,45.444,temp,2011-01-24 00:00:00,100,85000,0,2,254,0,0,B10008,14375 9.2833,45.444,temp,2011-01-24 00:00:00,100,85000,0,2,254,0,0,B11001,255 9.2833,45.444,temp,2011-01-24 00:00:00,100,85000,0,2,254,0,0,B11002,2.6 9.2833,45.444,temp,2011-01-24 00:00:00,100,85000,0,2,254,0,0,B12101,270.86 9.2833,45.444,temp,2011-01-24 00:00:00,100,85000,0,2,254,0,0,B12103,247.86 9.2833,45.444,temp,2011-01-24 00:00:00,100,88500,0,5,254,0,0,B08042,4 9.2833,45.444,temp,2011-01-24 00:00:00,100,88500,0,5,254,0,0,B12101,272.66 9.2833,45.444,temp,2011-01-24 00:00:00,100,88500,0,5,254,0,0,B12103,245.66 9.2833,45.444,temp,2011-01-24 00:00:00,100,88900,0,7,254,0,0,B08042,1 9.2833,45.444,temp,2011-01-24 00:00:00,100,88900,0,7,254,0,0,B11001,230 9.2833,45.444,temp,2011-01-24 00:00:00,100,88900,0,7,254,0,0,B11002,3.1 9.2833,45.444,temp,2011-01-24 00:00:00,100,90700,0,5,254,0,0,B08042,4 9.2833,45.444,temp,2011-01-24 00:00:00,100,90700,0,5,254,0,0,B12101,274.16 9.2833,45.444,temp,2011-01-24 00:00:00,100,90700,0,5,254,0,0,B12103,254.16 9.2833,45.444,temp,2011-01-24 00:00:00,100,91300,0,5,254,0,0,B08042,4 9.2833,45.444,temp,2011-01-24 00:00:00,100,91300,0,5,254,0,0,B12101,273.16 9.2833,45.444,temp,2011-01-24 00:00:00,100,91300,0,5,254,0,0,B12103,262.16 9.2833,45.444,temp,2011-01-24 00:00:00,100,96000,0,6,254,0,0,B08042,2 9.2833,45.444,temp,2011-01-24 00:00:00,100,96000,0,6,254,0,0,B11001,275 9.2833,45.444,temp,2011-01-24 00:00:00,100,96000,0,6,254,0,0,B11002,5.1 9.2833,45.444,temp,2011-01-24 00:00:00,100,96400,0,5,254,0,0,B08042,4 9.2833,45.444,temp,2011-01-24 00:00:00,100,96400,0,5,254,0,0,B12101,274.56 9.2833,45.444,temp,2011-01-24 00:00:00,100,96400,0,5,254,0,0,B12103,262.56 9.2833,45.444,temp,2011-01-24 00:00:00,100,99500,0,5,254,0,0,B08042,6 9.2833,45.444,temp,2011-01-24 00:00:00,100,99500,0,5,254,0,0,B12101,274.76 9.2833,45.444,temp,2011-01-24 00:00:00,100,99500,0,5,254,0,0,B12103,268.76 9.2833,45.444,temp,2011-01-24 00:00:00,100,99500,0,6,254,0,0,B08042,6 9.2833,45.444,temp,2011-01-24 00:00:00,100,99500,0,6,254,0,0,B11001,280 9.2833,45.444,temp,2011-01-24 00:00:00,100,99500,0,6,254,0,0,B11002,5.1 9.2833,45.444,temp,2011-01-24 00:00:00,100,100000,0,2,254,0,0,B08042,32 9.2833,45.444,temp,2011-01-24 00:00:00,100,100000,0,2,254,0,0,B10008,1599 9.2833,45.444,temp,2011-01-24 00:00:00,100,100000,0,2,254,0,0,B11001,270 9.2833,45.444,temp,2011-01-24 00:00:00,100,100000,0,2,254,0,0,B11002,3.6 9.2833,45.444,temp,2011-01-24 00:00:00,100,100000,0,2,254,0,0,B12101,274.36 9.2833,45.444,temp,2011-01-24 00:00:00,100,100000,0,2,254,0,0,B12103,269.56 9.2833,45.444,temp,2011-01-24 00:00:00,100,100700,0,1,254,0,0,B08042,64 9.2833,45.444,temp,2011-01-24 00:00:00,100,100700,0,1,254,0,0,B11001,250 9.2833,45.444,temp,2011-01-24 00:00:00,100,100700,0,1,254,0,0,B11002,1.0 9.2833,45.444,temp,2011-01-24 00:00:00,100,100700,0,1,254,0,0,B12101,273.56 9.2833,45.444,temp,2011-01-24 00:00:00,100,100700,0,1,254,0,0,B12103,269.56 9.2833,45.444,temp,2011-01-24 00:00:00,103,2000,,,254,0,0,B12101,273.56 9.2833,45.444,temp,2011-01-24 00:00:00,103,2000,,,254,0,0,B12103,269.56 9.2833,45.444,temp,2011-01-24 00:00:00,103,10000,,,254,0,0,B11001,250 9.2833,45.444,temp,2011-01-24 00:00:00,103,10000,,,254,0,0,B11002,2.0 9.2833,45.444,temp,2011-01-24 00:00:00,256,,258,0,254,0,0,B20011,0 9.2833,45.444,temp,2011-01-24 00:00:00,256,,258,0,254,0,0,B20013,2500 9.2833,45.444,temp,2011-01-24 00:00:00,256,,258,1,254,0,0,B20012,30 9.2833,45.444,temp,2011-01-24 00:00:00,256,,258,2,254,0,0,B20012,30 9.2833,45.444,temp,2011-01-24 00:00:00,256,,258,3,254,0,0,B20012,30 9.2833,45.444,temp,,,,,,,,,B01001,16 9.2833,45.444,temp,,,,,,,,,B01002,80 9.2833,45.444,temp,,,,,,,,,B01194,temp 9.2833,45.444,temp,,,,,,,,,B04001,2011 9.2833,45.444,temp,,,,,,,,,B04002,1 9.2833,45.444,temp,,,,,,,,,B04003,24 9.2833,45.444,temp,,,,,,,,,B04004,0 9.2833,45.444,temp,,,,,,,,,B04005,0 9.2833,45.444,temp,,,,,,,,,B04006,0 9.2833,45.444,temp,,,,,,,,,B05001,45.44442 9.2833,45.444,temp,,,,,,,,,B06001,9.28333 9.2833,45.444,temp,,,,,,,,,B07030,102.0 9.2833,45.444,temp,,,,,,,,,B07031,103.0 dballe-5.18/extra/runtest0000755000175000017500000000226211444431521012371 00000000000000#!/bin/sh -e TOP_SRCDIR=`pwd`/`dirname $0`/.. CMD=`pwd`/"$1" ## Set up the test environment export WREPORT_EXTRA_TABLES=$TOP_SRCDIR/tables export WREPORT_TESTDATA=$TOP_SRCDIR/extra export DBA_REPINFO=$TOP_SRCDIR/tables/repinfo.csv export DBA_TABLES=$TOP_SRCDIR/tables export DBA_TESTDATA=$TOP_SRCDIR/extra TESTDIR="`mktemp -d`" cd "$TESTDIR" touch test.sqlite ## Clean up the test environment at exit unless asked otherwise cleanup() { test -z "$PRESERVE" && rm -rf "$TESTDIR" } trap cleanup EXIT #id=`date +%y%m%d%H%M%S` #$DEBUGGER $BIN $ARGS 2>&1 | tee `pwd`/testrun-$id #echo Output saved in `pwd`/testrun-$id # Try to debug the libtool executable, if present DIR=`dirname $CMD` BASE=`basename $CMD` if [ ! -z "$DEBUGGER" ] && [ -x $DIR/.libs/lt-$BASE ] then echo "Running $DEBUGGER $DIR/.libs/lt-$BASE $ARGS" RES=0 if ! $DEBUGGER $DIR/.libs/lt-$BASE $ARGS then RES=$? echo "Failed with result $RES" fi else echo "Running $DEBUGGER $CMD $ARGS" RES=0 if ! $DEBUGGER $CMD $ARGS then RES=$? echo "Failed with result $RES" fi fi if [ ! -z "$PAUSE" ] then echo "Post-test inspection requested." echo "Exit this shell to cleanup the test environment." bash fi exit $RES dballe-5.18/extra/crex/0000755000175000017500000000000011173330007011752 500000000000000dballe-5.18/extra/crex/test-synop1.crex0000644000175000017500000000025011173330007014760 00000000000000CREX++ T000103 A000 D01031 R02005 B07061 B12030++ 10 280 1 2004 11 30 12 00 5355000 01320000 00080 00005 046 00010 042 00020 041 00050 053 00100 066++ 7777 dballe-5.18/extra/crex/test-synop2.crex0000644000175000017500000000041211173330007014761 00000000000000CREX++ T000103 A000 D07005 B13023 B13013++ 10 954 1 2004 11 30 12 00 4783000 01087000 00757 09201 ///// -0021 07 070 0060 017 008 /// 0450 010 02 02 100 01 08 0015 36 61 60 01 08 07 0017 02 // // //// 03 // // //// // // // //// ///// /////++ 7777 dballe-5.18/extra/crex/test-synop3.crex0000644000175000017500000000045111173330007014765 00000000000000CREX++ T000103 A000 D01031 B12013 B12017 B12016 B13031 B14015 B14031 B20062 B20192 B20192 B20192 B20192 B11233 B11041 B11230 B11231 B11232++ 02 945 1 2004 11 30 12 00 6185000 02480000 00145 /// /// /// /// ///// //// // ///// ///// ///// ///// //// //// //// //// ////++ 7777 dballe-5.18/extra/crex/test-temp0.crex0000644000175000017500000000562111173330007014563 00000000000000CREX++ T000103 A002 D09007 R04000 B07004 B08001 B11061 B11062 ++ 06 181 071 04 2004 11 30 12 00 5575000 01252000 00040 /// 01 // //// // // // 0075 10130 106 000039 062 023 215 0020 10000 040 000143 052 008 225 0050 09710 004 000378 032 -028 /// //// 09600 002 ////// /// /// 235 0070 09250 040 000762 -003 -035 240 0070 08790 004 001158 -043 -044 /// //// 08630 004 001300 -053 -054 /// //// 08600 004 001327 -057 -117 /// //// 08570 004 001354 -029 -179 /// //// 08530 004 001390 000 -190 /// //// 08500 040 001419 004 -226 245 0070 08340 004 001567 006 -244 /// //// 07590 004 002307 002 -178 /// //// 07000 040 002939 -033 -243 260 0120 06970 002 ////// /// /// 260 0120 06460 002 ////// /// /// 260 0090 06150 004 003931 -091 -211 /// //// 06010 004 004105 -097 -257 /// //// 05680 002 ////// /// /// 230 0110 05460 004 004823 -153 -343 /// //// 05370 002 ////// /// /// 240 0090 05000 040 005472 -207 -297 275 0070 04930 002 ////// /// /// 280 0070 04900 004 005614 -219 -329 /// //// 04800 002 ////// /// /// 290 0070 04510 004 006207 -263 -309 /// //// 04300 004 006544 -287 -367 /// //// 04050 002 ////// /// /// 295 0090 04000 040 007051 -333 -383 295 0090 03560 002 ////// /// /// 325 0090 03500 004 007952 -409 -447 /// //// 03180 004 008584 -463 -505 /// //// 03000 040 008963 -493 -529 330 0150 02500 040 010120 -565 -625 335 0200 02420 004 010315 -583 -643 /// //// 02000 040 011474 -673 -722 330 0210 01990 002 ////// /// /// 330 0210 01970 004 011555 -681 -729 /// //// 01810 024 012051 -697 -738 325 0200 01500 040 013170 -655 -765 325 0160 01490 004 013202 -647 -757 /// //// 01400 004 013574 -649 -789 /// //// 01180 004 014598 -641 -821 /// //// 01170 002 ////// /// /// 315 0110 01100 004 015017 -663 -853 /// //// 01000 042 015593 -631 -841 335 0110 00906 002 ////// /// /// 305 0120 00831 002 ////// /// /// 330 0190 00795 002 ////// /// /// 340 0180 00714 002 ////// /// /// 330 0160 00700 040 017711 -693 -893 330 0160 00685 024 017806 -697 -887 330 0160 00640 004 018205 -677 -887 /// //// 00599 002 ////// /// /// 335 0130 00500 040 019682 -695 -885 340 0150 00385 004 021178 -709 -899 /// //// 00377 002 ////// /// /// 345 0150 00318 002 ////// /// /// 340 0200 00300 040 022673 -697 -907 335 0190 00274 004 023162 -689 -899 /// //// 00268 002 ////// /// /// 330 0150 00235 002 ////// /// /// 350 0160 00216 002 ////// /// /// 340 0160 00200 040 025036 -701 -911 335 0170 00175 002 ////// /// /// 325 0240 00170 004 025934 -727 -917 /// //// 00155 004 026469 -699 -909 /// //// 00138 002 ////// /// /// 325 0170 00104 004 028776 -737 -927 /// //// 00100 040 029037 -733 -923 325 0260 00090 004 029609 -709 -899 /// //// 00083 002 ////// /// /// 315 0310 00080 004 030290 -725 -915 /// //// 00070 012 ////// /// /// 330 0440 00068 004 031240 -663 -873 /// //// 0001 00070 010 0140 ////++ 7777 dballe-5.18/extra/crex/test-mare0.crex0000644000175000017500000000026411173330007014540 00000000000000CREX++ T000103 A001 D08003++ 44613 010 000 0 2004 11 30 12 00 6827 00968 ///// ///// //// // /// //// /// /// /// //// /// // // /// // // //// // // // 2809++ 7777 dballe-5.18/extra/crex/test-mare1.crex0000644000175000017500000000026511173330007014542 00000000000000CREX++ T000103 A001 D08003++ 44743 010 000 0 2004 11 30 12 00 4302 -01245 10084 10084 0016 07 /// //// /// /// /// //// /// // // /// // // //// // // // 2882++ 7777 dballe-5.18/extra/crex/old/0000755000175000017500000000000011173330007012530 500000000000000dballe-5.18/extra/crex/old/test-buoy.crex0000644000175000017500000000032711173330007015270 00000000000000CREX++ T000103 A001 D08003 E++ 148583 2/// 3/// 40 52003 611 725 815 910 08336 1-14709 2///// 310114 4//// 5// 6/// 7//// 8/// 9/// 0/// 1//// 2/// 3// 4// 5/// 6// 7// 8//// 9// 0// 1// 2////++ 7777 dballe-5.18/extra/crex/old/test-acar.crex0000644000175000017500000000055711173330007015225 00000000000000CREX++ T000103 A004 B01006 B01008 B02061 B02062 B02002 B02005 B02070 B02063 B02001 B04001 B04002 B04003 B04004 B04005 B05002 B06002 B08004 B07004 B08021 B11001 B11002 B11031 B11034 B11035 B12001 B12003 B13003 B20041++ 00001008 JEWEITRA / 03 04 025 10 ///// 0 2003 12 21 21 01 3400 -08501 / 06318 // 296 0093 // //// ///// -035 /// /// //++ 7777 dballe-5.18/extra/crex/old/test-synop-ship.crex0000644000175000017500000000036411173330007016424 00000000000000CREX++ T000103 A001 D08004 B12005 B10197 E++ 1000001009 2315 3009 41 52003 611 705 806 900 0-0800 1-00320 2///// 310134 40001 500 6150 70080 8220 9171 0/// 12000 2003 302 402 5090 601 707 80045 937 025 116 22948 3190 4///++ 7777 dballe-5.18/extra/crex/old/test-synop.crex0000644000175000017500000000047511173330007015466 00000000000000CREX++ T000103 A000 D07005 B13023 B13013 E++ 110 2033 31 42003 512 621 722 800 95483000 000950000 100033 209917 309958 40041 5// 6300 70100 8011 9-005 0/// 12500 2002 301 401 5025 601 702 80175 935 020 110 201 307 406 50152 602 7// 8// 9//// 003 1// 2// 3//// 4// 5// 6// 7//// 8///// 9/////++ 7777 dballe-5.18/extra/crex/old/test-buoy-baddigit.crex0000644000175000017500000000032711173330007017035 00000000000000CREX++ T000103 A001 D08003 E++ 148583 2/// 3/// 40 52003 611 725 815 910 08336 1-14709 2///// 310114 4//// 5// 6/// 1//// 8/// 9/// 0/// 1//// 2/// 3// 4// 5/// 6// 7// 8//// 9// 0// 1// 2////++ 7777 dballe-5.18/extra/crex/old/test-temp.crex0000644000175000017500000000466411173330007015267 00000000000000CREX++ T000103 A002 D09007 R04000 B07004 B08001 B11061 B11062 E++ 161 2052 3/// 4// 52003 612 721 822 900 01348000 100217000 200227 3/// 4// 5// 6//// 7// 8// 9// 00052 110000 2040 3000126 4/// 5/// 6/// 7//// 809890 9100 0000223 1234 2-046 3020 40020 509250 6040 7000792 8228 9-092 0065 10100 208500 3040 4001505 5184 6-216 7080 80060 907000 0040 1003114 2094 3-066 4225 50060 605000 7040 8005766 9-059 0-539 1145 20040 304000 4040 5007443 6-159 7-609 8280 90040 003000 1040 2009493 3-335 4-605 5345 60140 702500 8040 9010719 0-437 1/// 2305 30150 402000 5040 6012160 7-555 8/// 9280 00180 101500 2040 3013896 4-695 5/// 6250 70310 801420 9010 0////// 1/// 2/// 3260 40320 501000 6040 7016240 8-785 9/// 0265 10090 200970 3024 4////// 5-799 6/// 7245 80070 900943 0002 1////// 2/// 3/// 4240 50060 600882 7002 8////// 9/// 0/// 1325 20050 300839 4002 5////// 6/// 7/// 8035 90050 000817 1002 2////// 3/// 4/// 5105 60050 700799 8002 9////// 0/// 1/// 2145 30060 400768 5004 6////// 7-819 8/// 9/// 0//// 100700 2044 3018221 4-757 5/// 6215 70050 800668 9002 0////// 1/// 2/// 3245 40050 500615 6004 7////// 8-717 9/// 0/// 1//// 200586 3002 4////// 5/// 6/// 7150 80020 900575 0002 1////// 2/// 3/// 4055 50030 600539 7002 8////// 9/// 0/// 1065 20070 300511 4002 5////// 6/// 7/// 8120 90100 000500 1040 2020172 3-697 4/// 5115 60100 700494 8002 9////// 0/// 1/// 2110 30100 400474 5004 6////// 7-689 8/// 9/// 0//// 100470 2002 3////// 4/// 5/// 6130 70070 800444 9002 0////// 1/// 2/// 3100 40050 500424 6002 7////// 8/// 9/// 0055 10040 200422 3004 4////// 5-641 6/// 7/// 8//// 900412 0002 1////// 2/// 3/// 4035 50050 600388 7002 8////// 9/// 0/// 1045 20060 300386 4004 5////// 6-657 7/// 8/// 9//// 000369 1002 2////// 3/// 4/// 5075 60070 700356 8004 9////// 0-619 1/// 2/// 3//// 400352 5002 6////// 7/// 8/// 9070 00100 100335 2002 3////// 4/// 5/// 6090 70120 800316 9002 0////// 1/// 2/// 3105 40090 500300 6040 7023232 8-605 9/// 0095 10080 200297 3002 4////// 5/// 6/// 7085 80090 900294 0004 1////// 2-605 3/// 4/// 5//// 600287 7002 8////// 9/// 0/// 1105 20080 300263 4002 5////// 6/// 7/// 8070 90080 000254 1002 2////// 3/// 4/// 5075 60100 700239 8002 9////// 0/// 1/// 2040 30090 400222 5002 6////// 7/// 8/// 9090 00080 100209 2006 3////// 4-523 5/// 6080 70090 800200 9040 0025762 1/// 2/// 3/// 4//// 50001 601420 7010 80070 90220++ 7777 dballe-5.18/extra/crex/old/test-satob.crex0000644000175000017500000000077011173330007015424 00000000000000CREX++ T000103 A005 D01043 D04001++ 0254 01 2003 12 21 23 00 00 3990000 -08950000 02 02600 -495 285 0267+ 0254 01 2003 12 21 23 00 00 3990000 -08950000 02 02600 -495 280 0267+ 0254 01 2003 12 21 23 00 00 3960000 -08890000 02 03100 -395 285 0216+ 0254 01 2003 12 21 23 00 00 3980000 -08790000 02 02800 -473 285 0231+ 0254 01 2003 12 21 23 00 00 3850000 -08960000 02 02600 -511 290 0236+ 0254 01 2003 12 21 23 00 00 3830000 -08970000 02 02200 -519 290 0241++ 7777 dballe-5.18/extra/crex/old/test-amdar.crex0000644000175000017500000000020511173330007015371 00000000000000CREX++ T000103 A004 D11001++ 00001008 0 2003 11 05 00 00 3150500 01311833 3 01005 -482 318 0293 // ///// ///// //++ 7777 dballe-5.18/extra/crex/test-mare2.crex0000644000175000017500000000054711173330007014546 00000000000000CREX++ T000103 A001 D01036 B12015 B12014 D02024 B22001 B22011 B22021 B13031 B14015 B14031 B20063 B20063 B20063 B20063 B20033 B20031 B20032 B20034 B20037 B20038 B20036++ SHIP 270 012 1 2004 11 30 12 00 3390 02900 /// /// /// // //// /// // //// /// // //// /// // //// /// ///// //// //// //// //// //// // /// / // // /// //++ 7777 dballe-5.18/extra/crex/test-synop0.crex0000644000175000017500000000037411173330007014766 00000000000000CREX++ T000103 A000 D07005 B13023 B13013++ 10 837 1 2004 11 30 12 00 4822000 00992000 00550 09434 10094 -0017 07 080 0060 030 007 /// 0500 010 02 02 100 01 08 0045 35 61 60 01 08 06 0035 02 // // //// 03 // // //// // // // //// ///// /////++ 7777 dballe-5.18/libdballef.pc.in0000644000175000017500000000031511173330007012616 00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: libdballef Description: DB-All.e Fortran API Version: @VERSION@ Cflags: -I${includedir} Libs: -L${libdir} -ldballef dballe-5.18/run-local0000755000175000017500000000051311450325223011431 00000000000000#!/bin/bash TOP_SRCDIR=$(cd $(dirname $0) && pwd) export LD_LIBRARY_PATH="$TOP_SRCDIR/dballe:$LD_LIBRARY_PATH" export WREPORT_EXTRA_TABLES=$TOP_SRCDIR/tables export DBA_REPINFO=$TOP_SRCDIR/tables/repinfo.csv export DBA_TABLES=$TOP_SRCDIR/tables/ export PYTHONPATH=$TOP_SRCDIR/swig export PATH="$TOP_SRCDIR/tools:$PATH" exec "$@" dballe-5.18/run-check.conf.example0000644000175000017500000000020711341210304013757 00000000000000# Examples with odbc: #DBA_DB=odbc://testdsn #DBA_DB=odbc://user@testdsn #DBA_DB=odbc://user:pass@testdsn #DBA_DB=sqlite://test.sqlite dballe-5.18/libdballe.pc.in0000644000175000017500000000034511450404344012457 00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: libdballe Description: DB-All.e C library Version: @VERSION@ Requires: libwreport >= 1.0 Cflags: -I${includedir} Libs: -L${libdir} -ldballe dballe-5.18/run-check0000755000175000017500000000014511433304557011425 00000000000000#!/bin/sh if [ -f run-check.conf ] then . ./run-check.conf export DBA_DB fi exec make check "$@" dballe-5.18/Makefile.am0000644000175000017500000000217111732344323011652 00000000000000## Process this file with automake to produce Makefile.in ACLOCAL_AMFLAGS = -I m4 SUBDIRS = tables dballe extra tools if DO_DBALLEF SUBDIRS += fortran endif if DO_DOCS SUBDIRS += doc endif if DO_DBALLE_PYTHON SUBDIRS += swig provami endif SUBDIRS += . #examples pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA=libdballe.pc libdballef.pc m4dir = $(datadir)/aclocal m4_DATA = libdballe.m4 libdballef.m4 man_MANS = dbatbl.1 dbamsg.1 if DO_DBALLE_DB man_MANS += dbadb.1 dbadb.1: tools/dbadb doc/add_templates_to_manpage ( cd tools && ./`basename $<` help manpage ) | ( cd $(srcdir) && $(srcdir)/doc/add_templates_to_manpage ) > $@ endif dbamsg.1: tools/dbamsg doc/add_templates_to_manpage ( cd tools && ./`basename $<` help manpage ) | ( cd $(srcdir) && $(srcdir)/doc/add_templates_to_manpage ) > $@ %.1: tools/% ( cd tools && ./`basename $<` help manpage ) > $@ EXTRA_DIST = autogen.sh \ libdballe.m4 libdballef.m4 \ libdballe.pc.in libdballef.pc.in \ $(conf_DATA) dballe.spec get_line_no run-check.conf.example \ run-check run-local show_code_notes \ TODO.provami UPGRADE-5.x CLEANFILES = $(man_MANS) dballe-5.18/configure.ac0000644000175000017500000002066611754230675012125 00000000000000dnl Process this file with autoconf to produce a configure script. AC_INIT(dballe, [5.18], [enrico@enricozini.org]) AC_CONFIG_SRCDIR([configure.ac]) AM_INIT_AUTOMAKE([foreign subdir-objects]) AM_CONFIG_HEADER(config.h) AC_CONFIG_MACRO_DIR([m4]) dnl Use libtool dnl AM_ENABLE_STATIC dnl AM_DISABLE_SHARED LT_INIT() LT_LANG([C++]) AM_PROG_LIBTOOL AC_ARG_ENABLE([dballe-db], [AS_HELP_STRING( [--enable-dballe-db], [build DB-All.e database support])], [], [enable_dballe_db="yes"]) AC_ARG_ENABLE([dballef], [AS_HELP_STRING( [--enable-dballef], [build DB-All.e Fortran bindings])], [], [enable_dballef="yes"]) AC_ARG_ENABLE([dballe-python], [AS_HELP_STRING( [--enable-dballe-python], [build DB-All.e Python bindings])], [], [enable_dballe_python="yes"]) AC_ARG_ENABLE([docs], [AS_HELP_STRING( [--enable-docs], [enable building of the documentation])], [], [enable_docs="yes"]) if test x"$enable_dballe_db" != x"yes"; then enable_dballe_python="no" fi AC_CHECK_PROG(have_latex2html, latex2html, yes, no) AC_CHECK_PROG(have_rst2html, rst2html, yes, no) AC_CHECK_PROG(have_swig, swig, yes, no) dnl To use subdirs AC_PROG_MAKE_SET AC_LANG([C++]) AC_ISC_POSIX AC_PROG_CC AC_PROG_CXX AC_PROG_FC([gfortran pgf90 ifort g95 xlf90 f90]) F77=$FC AM_PROG_CC_STDC dnl Needed by subdir-objects AM_PROG_CC_C_O dnl We want to invoke pkg-config directly PKG_PROG_PKG_CONFIG if test x$enable_docs = xyes then dnl Check for doxygen AC_CHECK_PROG(have_doxygen, doxygen, true) if test x$have_doxygen != xtrue then AC_MSG_WARN([doxygen was not found: documentation will not be built]) enable_docs=no fi fi dnl Check for gperf AC_CHECK_PROG(have_gperf, gperf, true) if test x$have_gperf != xtrue then AC_MSG_WARN([gperf was not found: relying on prebuilt sources]) has_build_gperf_sources=yes for f in dballe/core/record_keyword.cc dballe/core/aliases.cc dballe/msg/vars.cc do if ! test -f $f then has_build_gperf_sources=no AC_MSG_WARN([please extract $f from the distribution tarball]) fi done if test $has_build_gperf_sources = no then AC_MSG_ERROR([some gperf-generated source files are missing and gperf is not available to rebuild them]) fi fi dnl Check for missing functions in libc AC_CHECK_FUNC(vasprintf, , [ AC_DEFINE([USE_OWN_VASPRINTF], 1, [we need to use our own vasprintf]) ]) AC_CHECK_FUNC(bswap_32, , [ AC_DEFINE([USE_OWN_BSWAP], 1, [we need to use our own bswap_* functions]) ]) AC_CHECK_FUNC(strcasestr, [ AC_DEFINE([HAVE_STRCASESTR], 1, [we can use strcasestr]) ]) dnl Check if std::vector has a std::vector::data method AC_CACHE_CHECK(whether the compiler has std::vector::data (), ac_cv_cxx_have_vector_data, [AC_LANG_SAVE AC_LANG_CPLUSPLUS AC_TRY_COMPILE([#include using namespace std; ],[vector v; v.data(); return 0;], ac_cv_cxx_have_vector_data=yes, ac_cv_cxx_have_vector_data=no) AC_LANG_RESTORE ]) if test "$ac_cv_cxx_have_vector_data" = yes; then AC_DEFINE(HAVE_VECTOR_DATA,,[define if the compiler has the method std::vector::data ()]) fi if test x$docdir = x then docdir='${datadir}/doc/${PACKAGE_TARNAME}' AC_SUBST(docdir) fi if test x$have_swig = x"yes" then AM_PATH_PYTHON else enable_dballe_python=no fi dnl Check for wreport PKG_CHECK_MODULES(WREPORT,libwreport >= 2.0) if test x$enable_dballe_db = x"yes" then dnl Check for unixodbc AC_CHECK_HEADER(sql.h, AC_DEFINE(HAVE_ODBC_H, 1, sql.h (part of unixodbc) has been found), AC_MSG_WARN([*** sql.h not found. Check 'config.log' for more details.]) enable_dballe_db=false ) AC_CHECK_LIB(odbc, SQLAllocHandle, LIBS="$LIBS -lodbc", AC_MSG_WARN([*** libodbc not found. Check 'config.log' for more details.]) enable_dballe_db=false ) fi dnl Check for lua PKG_CHECK_EXISTS([lua5.1], [have_lua=yes], [have_lua=no]) if test x$have_lua = xyes then PKG_CHECK_MODULES(LUA,lua5.1,,[have_lua=no]) else PKG_CHECK_EXISTS([lua], [have_lua=yes], [have_lua=no]) if test x$have_lua = xyes then PKG_CHECK_MODULES(LUA,lua,,[have_lua=no]) else dnl We don't always have the luxury of .pc files for lua, it seems have_lua=yes AC_CHECK_LIB([lua], [lua_gettop], [true], [have_lua=no]) AC_CHECK_HEADER([lua.h], [true], [have_lua=no]) if test x$have_lua = xyes then LUA_CFLAGS= LUA_LIBS="-llua" fi fi fi if test x$have_lua = xyes then AC_DEFINE([HAVE_LUA], 1, [lua is available]) fi AM_CONDITIONAL([LUA], [test x"$have_lua" = x"yes"]) dnl Check for wibble PKG_CHECK_EXISTS([libwibble], [have_wibble=yes], [have_wibble=no]) if test x$have_wibble = xyes then PKG_CHECK_MODULES(WIBBLE,libwibble) enable_tests=yes else AC_MSG_WARN([libwibble not found, tests will be disabled]) enable_tests=no fi dnl Check for popt AC_CHECK_HEADER(popt.h, AC_DEFINE(HAVE_POPT_H, 1, popt.h has been found), AC_MSG_ERROR([*** popt.h not found. Check 'config.log' for more details.]) ) AC_CHECK_LIB(popt, poptGetContext, LIBS="$LIBS -lpopt", AC_MSG_ERROR([*** libpopt not found. Check 'config.log' for more details.]) ) LIBS="$LIBS -lm" confdir='${sysconfdir}'"/$PACKAGE" AC_SUBST(confdir) # tabledir="`$PKG_CONFIG --variable=tabledir libwreport`" tabledir='${datadir}/wreport' AC_SUBST(tabledir) dnl def_tabledir=`echo "${sharedstatedir}/lib/$PACKAGE/tables"` dnl AC_DEFINE_UNQUOTED(TABLE_DIR, "$def_tabledir", "Default location for table files") dnl From libtool's documentation: dnl dnl This flag accepts an argument of the form `CURRENT[:REVISION[:AGE]]'. dnl dnl CURRENT dnl The most recent interface number that this library implements. dnl dnl REVISION dnl The implementation number of the CURRENT interface. dnl dnl AGE dnl The difference between the newest and oldest interfaces that this dnl library implements. In other words, the library implements all the dnl interface numbers in the range from number `CURRENT - AGE' to dnl `CURRENT'. dnl dnl If two libraries have identical CURRENT and AGE numbers, then the dnl dynamic linker chooses the library with the greater REVISION number. dnl dnl 3. If the library source code has changed at all since the last dnl update, then increment REVISION (`C:R:A' becomes `C:r+1:A'). dnl dnl 4. If any interfaces have been added, removed, or changed since the dnl last update, increment CURRENT, and set REVISION to 0. dnl dnl 5. If any interfaces have been added since the last public release, dnl then increment AGE. dnl dnl 6. If any interfaces have been removed since the last public release, dnl then set AGE to 0. LIBDBALLE_VERSION_INFO="5:0:0" LIBDBALLEF_VERSION_INFO="4:19:0" AC_SUBST(LIBDBALLE_VERSION_INFO) AC_SUBST(LIBDBALLEF_VERSION_INFO) dnl Enable extra compiler warnings AX_CXXFLAGS_WARN_ALL dnl warnings="-Wall -Wextra -Werror=return-type -Werror=empty-body" dnl CFLAGS="$warnings $CFLAGS" dnl CXXFLAGS="$warnings $CXXFLAGS" # Enforce dependencies if test x"$enable_dballe_db" = x"yes"; then AC_DEFINE(HAVE_DBALLE_DB,[],[Have DB module]) fi if test x"$enable_dballef" = x"yes"; then AC_DEFINE(HAVE_DBALLEF,[],[Have Fortran bindings]) fi if test x"$enable_dballe_python" = x"yes"; then AC_DEFINE(HAVE_DBALLE_PYTHON,[],[Have Python bindings]) fi AM_CONDITIONAL([DO_DBALLE_DB], [test x"$enable_dballe_db" = x"yes"]) AM_CONDITIONAL([DO_DBALLEF], [test x"$enable_dballef" = x"yes"]) AM_CONDITIONAL([DO_DBALLE_PYTHON], [test x"$enable_dballe_python" = x"yes"]) AM_CONDITIONAL([DO_DOCS], [test x"$enable_docs" = x"yes"]) AM_CONDITIONAL([DO_TESTS], [test x"$enable_tests" = x"yes"]) AM_CONDITIONAL([HAVE_LATEX2HTML], [test x$have_latex2html = xyes]) AM_CONDITIONAL([HAVE_RST2HTML], [test x$have_rst2html = xyes]) AC_CONFIG_FILES([ Makefile dballe/Makefile fortran/Makefile tools/Makefile tables/Makefile extra/Makefile swig/Makefile doc/Makefile doc/libdballe.dox doc/libdballef.dox provami/Makefile libdballe.pc libdballef.pc ]) AC_OUTPUT #dballe/bench/Makefile #examples/Makefile dnl tests/Makefile dnl doc/Makefile AC_MSG_NOTICE([ =================================================== $PACKAGE_NAME-$PACKAGE_VERSION configuration: AS_HELP_STRING([db:], [$enable_dballe_db]) AS_HELP_STRING([Fortran:], [$enable_dballef]) AS_HELP_STRING([Python:], [$enable_dballe_python]) AS_HELP_STRING([documentation:], [$enable_docs]) AS_HELP_STRING([tests:], [$enable_tests]) AS_HELP_STRING([latex2html:], [$have_latex2html]) AS_HELP_STRING([rst2html:], [$have_rst2html]) ===================================================]) dballe-5.18/py-compile0000755000175000017500000001040011730345670011620 00000000000000#!/bin/sh # py-compile - Compile a Python program scriptversion=2011-06-08.12; # UTC # Copyright (C) 2000, 2001, 2003, 2004, 2005, 2008, 2009, 2011 Free # Software Foundation, Inc. # This program is free software; you can redistribute 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, see . # 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. # This file is maintained in Automake, please report # bugs to or send patches to # . if [ -z "$PYTHON" ]; then PYTHON=python fi me=py-compile usage_error () { echo "$me: $*" >&2 echo "Try \`$me --help' for more information." >&2 exit 1 } basedir= destdir= while test $# -ne 0; do case "$1" in --basedir) if test $# -lt 2; then usage_error "option '--basedir' requires an argument" else basedir=$2 fi shift ;; --destdir) if test $# -lt 2; then usage_error "option '--destdir' requires an argument" else destdir=$2 fi shift ;; -h|--help) cat <<\EOF Usage: py-compile [--help] [--version] [--basedir DIR] [--destdir DIR] FILES..." Byte compile some python scripts FILES. Use --destdir to specify any leading directory path to the FILES that you don't want to include in the byte compiled file. Specify --basedir for any additional path information you do want to be shown in the byte compiled file. Example: py-compile --destdir /tmp/pkg-root --basedir /usr/share/test test.py test2.py Report bugs to . EOF exit $? ;; -v|--version) echo "$me $scriptversion" exit $? ;; --) shift break ;; -*) usage_error "unrecognized option '$1'" ;; *) break ;; esac shift done files=$* if test -z "$files"; then usage_error "no files given" fi # if basedir was given, then it should be prepended to filenames before # byte compilation. if [ -z "$basedir" ]; then pathtrans="path = file" else pathtrans="path = os.path.join('$basedir', file)" fi # if destdir was given, then it needs to be prepended to the filename to # byte compile but not go into the compiled file. if [ -z "$destdir" ]; then filetrans="filepath = path" else filetrans="filepath = os.path.normpath('$destdir' + os.sep + path)" fi $PYTHON -c " import sys, os, py_compile files = '''$files''' sys.stdout.write('Byte-compiling python modules...\n') for file in files.split(): $pathtrans $filetrans if not os.path.exists(filepath) or not (len(filepath) >= 3 and filepath[-3:] == '.py'): continue sys.stdout.write(file) sys.stdout.flush() py_compile.compile(filepath, filepath + 'c', path) sys.stdout.write('\n')" || exit $? # this will fail for python < 1.5, but that doesn't matter ... $PYTHON -O -c " import sys, os, py_compile files = '''$files''' sys.stdout.write('Byte-compiling python modules (optimized versions) ...\n') for file in files.split(): $pathtrans $filetrans if not os.path.exists(filepath) or not (len(filepath) >= 3 and filepath[-3:] == '.py'): continue sys.stdout.write(file) sys.stdout.flush() py_compile.compile(filepath, filepath + 'o', path) sys.stdout.write('\n')" 2>/dev/null || : # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: dballe-5.18/TODO0000644000175000017500000002170211451115223010300 00000000000000TODO (18:02:30) pat1@jabber.linux.it: pare che provami non chiuda la connessione al db (18:02:40) pat1@jabber.linux.it: questo quando si esce (18:02:45) pat1@jabber.linux.it: mysql non fa una piega (18:02:53) pat1@jabber.linux.it: oracle pare non molli invece (18:03:03) pat1@jabber.linux.it: e obbliga a un ctrl-C - non accettare rep_cod da command line (al momento lo accetta ancora per compatibilità) - guardare software di Opera (licenza ignota) per codifica/decodifica BUFR satellite - aggiungere 'getting started' al README - mancano tetex-extra, swig, python-dev tra le dipendenze elencate nel sito - pacchettizzare debian/ - Per i test: 172.20.10.242 STORED PROCEDURE + Requisiti: MySQL 5 e libmyodbc >= 3.51.14 + Convertiti: pseudoana e context - Da fare: speedup prendilo, speedup import - prendilo: usare ODBC bulk insert - import: usare ODBC bulk insert sia per dati che per attributi - valutare sistema di speedup estrazione e inserimento per vol7d http://dev.mysql.com/doc/refman/5.0/en/declare-handlers.html http://dev.mysql.com/doc/refman/5.0/en/cursors.html - Batch insert - Fare una nuova tabella dati e attr per i dati di pseudoana, visto che vengono sempre comunque gestiti diversamente - Controllare che gli indici UNIQUE abbiano un senso, altrimenti tenerli solo per debug: ad ogni modo io in fase di insert devo fare una select, quindi... - Controllare che l'indice unique di pseudoana abbia un senso quando ident is null, altrimenti si può pensare di toglierlo - Fare un tool che data una tabella di un DB fa un analisi di quali tabelle sono correlate e di quanti valori distinti ci sono in ogni suo sottoinsieme di colonne $ mysql test2 -e "SELECT DISTINCT id_ana, datetime FROM data" | wc -l 103334 enrico@viaza:~/lavori/arpa$ mysql test2 -e "SELECT COUNT(1) FROM data" | wc -l 2 enrico@viaza:~/lavori/arpa$ mysql test2 -e "SELECT COUNT(1) FROM data" +----------+ | COUNT(1) | +----------+ | 1298237 | +----------+ $ mysql test2 -e "SELECT DISTINCT id_ana, id_dim4 FROM data" | wc -l 4869 $ mysql test2 -e "SELECT COUNT(1) FROM dim4" +----------+ | COUNT(1) | +----------+ | 41 | +----------+ - Aggiungere una tabella 'info (key varchar(255) primary key, val varchar(255))' in cui salvare metadati sul database tipo la versione del suo formato, e controllarla sempre in fase di apertura del database, dando errore se il formato non è supportato - Fare un programmino o uno script che fa dump di un database scrivendo in output tutti (e soli) i dati necessari a rigenerarlo, in un formato indipendente dalla struttura del database. Usarlo per fare dump e restore in caso cambi la struttura del database, e per provare database con struttura diversa. - Branch riorganizzazione livelli + Uniformare i livelli 101 e 121 e 141, 105 e 125, 108 e 128 + Vedere come committare i livelli uniformati - Cambiare i livelli in Oracle - http://www.easysoft.com/developer/interfaces/odbc/linux.html#cursor_lib_unixodbc - dballe.ma: - fare un exporter a linea di comando che esporti una query dballe in uno dei vari formati (come il salvataggio di provami) - fare il listone [(pos, val)] su file temporaneo - documentazione + la sintassi di read + l'elenco degli indici - esempi, tanti esempi - Implementare supporto per piú parametri di query in dbamsg filter - Spiegare nel record la differenza tra i parametri e i valori - Sistemare la documentazione dei moduli (secondo tab in doxygen) - Aggiungere documentazione specifica per ogni libreria: + Contenuto della B locale - Elenco dei campi dei record - Lista feature di codifica supportate per dballe-bufrex - Tabella di template supportati in import/export per dballe-msg - Spiegazione di livelli, scadenze, livello di anagrafica e le varie altre caratteristiche di dba_msg - Spiegazione della differenza tra dba_msg e dba_msgs - Lista database supportati in dballe-db e istruzioni sul setup dei vari tipi di DSN - Usare i BUFR da satellite anche in altri test di lettura, ricodifica, import, export - Reintrodurre la hash table nel record, visto che i dati extra di anagrafica ora vanno tutti nella listona delle variabili - Fare un generatore di query casuali sullo stile di mysqld.log e testare cosa succede a InnoDB quando si inserisce un mare di roba - Esportare i dati dei satelliti in NetCDF per Lokal col formato che mi darà la Francesca Prestazioni + vedere come va con postgres * Optimizations - Remove the big unique index on context (it's already been enforced by the rest of the code, that looks up from and existing context index before inserting, and does it inside a transaction) * Milestone release-extra - Export AOF * BUFR - In fase di export sounding BUFR e CREX, non esportare i livelli extra * Documentazione codice - Spiegare l'architettura del sistema di I/O encoding e decoding - Spiegare come aggiungere: - nuovi template di export bufrex - nuove conversioni tra unità di misura - nuove funzioni ai tool a linea di comando - import da nuovi template bufrex (farlo mettendo questa documentazione in un nuovo gruppo 'tasks') * Tools - In fase di conversione, aggiungere uno switch per fare unset di tutti i valori che hanno intervallo di confidenza al di sotto di una soglia data - Fare un import delle anagrafiche che scandisca una serie di CREX: - mettendo assieme i dati anagrafici delle varie stazioni. - controlli che le stazioni non si spostino e alla fine inserisca tutto nella tabella di anagrafica * Procedura per supportare un nuovo tipo report in un formato specifico - Cercare un file con un'osservazione nel formato voluto - Cercare un file con la stessa osservazione in un formato per cui è già supportata, o in alternativa, cercare un dump dei dati presenti nel campione - Aggiungere il campione all'archivio dei test case - Aggiungere a check_import i test per il nuovo file, usando l'altro file o i dati del dump come riferimento - Implementare - Appunti per un nuovo report: - La nuova API (con un programma di esempio è forse meglio) - Cosa è stato fatto finora - Cosa verrà fatto in futuro - MySQL 4? (transazioni (forse non servono), DELETE USING, performance, faremo delle prove) - Completamento API dalle specifiche - semantica elencamele - semantica QC - semantica cancellazione * Note dalla presentazione - Non è molto felice la definizione "reti" - quadballitem: serve la idba_seti(handle, "rep_cod", 1) dopo la seti("ana_id")? - [no, perché nessuno poi la saprebbe/potrebbe mantenere] Fare un'interfaccia python con solo quello che serve per fare toolettini grafici per import, export, correzione dati anagrafici, correzione singoli dati - Articolo per ARPA rivista - Mettere assert nel codice - Verificare memory leak - Controllare il keynote di Triggell alla LCA sui tool da avere per controllare il software - Domande - Scrivere il test per guidare la stesura del codice: dato un AOF (o uno per tipo) fare l'elenco delle variabili fisiche che ci si aspetta in output (coi loro codici WMO o B locale), e usarle per testare il codice. -> Meglio: convertire 4/5 bufr di tipo diverso in AOF, poi darmi gli AOF e il dump dei BUFR * Tools - Export di variabili in un foglio elettronico * CREX - Raggruppare i dati che abbiamo per tipo report e vedere quali informazioni di contesto ci sono per ogni tipo report - Documentazione - Test - Parse Entry C - Testare il decoding di CREX con piú di una subsection - Encoding CREX con piú di una subsection - Encoding CREX con entry C - Inserimento informazioni sul report * BUFR - Gestire in input le entry C 22 e C24 - Export - Fare un file di configurazione dove specificare il numero dell'originating centre da usare nell'Identification Section dei BUFR generati * Refactoring - Future optimizations for dba_vartable can make use of string tables to store varinfo descriptions and units instead of long fixed-length records. - The string table cannot grow dynamically or it will invalidate the string pointers - Distinguere nei messaggi: - Metainformazioni (nome del file, offset del messaggio, numero d'ordine, ...) - Informazioni codificate (il messaggio codificato) - Informazioni decodificate (il contenuto del messaggio) * Dballe - Espansione code table quando si fa enqc di un parametro di tipo "CODE TABLE" (sembra un compito impossibile, a meno ché qualcuno non trovi una lista parsabile di tutte le variabili e i loro valori. C'e' anche da vedere come gestire eventuali aggiornamenti futuri) * Guida utente - Troubleshooting - Raccogliere casi mano a mano che si presentano dballe-5.18/config.sub0000755000175000017500000010517611730345667011624 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. timestamp='2012-02-10' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU 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 . # # 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. # Please send patches to . Submit a context # diff and a properly formatted GNU ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 \ | ns16k | ns32k \ | open8 \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze) basic_machine=microblaze-xilinx ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i386-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: dballe-5.18/tools/0000755000175000017500000000000011754670141011041 500000000000000dballe-5.18/tools/dbatbl.cc0000644000175000017500000003077111674665002012531 00000000000000/* * dbatbl - commandline table management tool * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include #include #include #include #include #include #include #include #include "config.h" using namespace dballe; using namespace dballe::cmdline; using namespace wreport; using namespace std; const Vartable* btable = NULL; const DTable* dtable = NULL; static int op_csv; int op_verbose = 0; /** * Check that all unit conversions are allowed by dba_uniconv * * @returns true if all conversions worked, false if some exceptions were thrown */ static bool check_unit_conversions(const char* id) { const Vartable* othertable = Vartable::get(id); bool res = true; for (Vartable::const_iterator info = othertable->begin(); info != othertable->end(); ++info) { Varcode varcode = info->var; /* if (var % 1000 == 0) fprintf(stderr, "Testing %s %d\n", ids[i], var); */ if (varcode != 0 && !info->is_string()) { try { Varinfo local = varinfo(varcode); convert_units(info->unit, local->unit, 1.0); } catch (std::exception& e) { fprintf(stderr, "Checking conversion for var B%02d%03d: %s", WR_VAR_X(varcode), WR_VAR_Y(varcode), e.what()); res = false; } } } return res; } static void print_varinfo(const Varinfo& info) { char fmtdesc[100]; if (info->is_string()) snprintf(fmtdesc, 99, "%d characters", info->len); else if (info->scale == 0) snprintf(fmtdesc, 99, "%d digits", info->len); else if (info->scale > 0) { unsigned i = 0; if (info->len > info->scale) for ( ; i < info->len - info->scale && i < 99; i++) fmtdesc[i] = '#'; fmtdesc[i++] = '.'; for (int j = 0; j < info->scale && i < 99; i++, j++) fmtdesc[i] = '#'; fmtdesc[i] = 0; } else if (info->scale < 0) { unsigned i; for (i = 0; i < info->len && i < 99; i++) fmtdesc[i] = '#'; for (int j = 0; j < -info->scale && i < 99; i++, j++) fmtdesc[i] = '0'; fmtdesc[i] = 0; } #if 0 if (VARINFO_IS_STRING(info)) printf("%d%02d%03d %s [%s, %s]\n", WR_VAR_F(info->var), WR_VAR_X(info->var), WR_VAR_Y(info->var), info->desc, info->unit, fmtdesc); else printf("%d%02d%03d %s [%s, %s] %f<=x<=%f\n", WR_VAR_F(info->var), WR_VAR_X(info->var), WR_VAR_Y(info->var), info->desc, info->unit, fmtdesc, info->dmin, info->dmax); #else printf("%d%02d%03d %s [%s, %s] range (%g -- %g)\n", WR_VAR_F(info->var), WR_VAR_X(info->var), WR_VAR_Y(info->var), info->desc, info->unit, fmtdesc, info->dmin, info->dmax); #endif } static void print_varinfo_csv(const Varinfo& info) { char fmtdesc[100]; const char* s; if (info->is_string()) snprintf(fmtdesc, 99, "%d characters", info->len); else if (info->scale == 0) snprintf(fmtdesc, 99, "%d digits", info->len); else if (info->scale > 0) { unsigned i; for (i = 0; i < info->len - info->scale && i < 99; i++) fmtdesc[i] = '#'; fmtdesc[i++] = '.'; for (int j = 0; j < info->scale && i < 99; i++, j++) fmtdesc[i] = '#'; fmtdesc[i] = 0; } else if (info->scale < 0) { unsigned i; for (i = 0; i < info->len && i < 99; i++) fmtdesc[i] = '#'; for (int j = 0; j < -info->scale && i < 99; i++, j++) fmtdesc[i] = '0'; fmtdesc[i] = 0; } printf("%d%02d%03d,", WR_VAR_F(info->var), WR_VAR_X(info->var), WR_VAR_Y(info->var)); for (s = info->desc; *s != 0; ++s) if (*s != ',' && *s != '"') putc(*s, stdout); printf(",%s,%s\n", info->unit, fmtdesc); } static void expand_table_entry(Varcode val, int level) { int i; for (i = 0; i < level; i++) printf("\t"); switch (WR_VAR_F(val)) { case 0: { Varinfo info = btable->query(val); print_varinfo(info); break; } case 3: { Opcodes ops = ::dtable->query(val); printf("%d%02d%03d\n", WR_VAR_F(val), WR_VAR_X(val), WR_VAR_Y(val)); for (size_t i = 0; i < ops.size(); ++i) expand_table_entry(ops[i], level+1); break; } default: printf("%d%02d%03d\n", WR_VAR_F(val), WR_VAR_X(val), WR_VAR_Y(val)); } } int do_cat(poptContext optCon) { const char* item; /* Throw away the command name */ poptGetArg(optCon); if (poptPeekArg(optCon) == NULL) item = "dballe"; else item = poptGetArg(optCon); while (item != NULL) { const Vartable* table = Vartable::get(item); for (Vartable::const_iterator info = table->begin(); info != table->end(); ++info) { if (op_csv) print_varinfo_csv(*info); else print_varinfo(*info); } item = poptGetArg(optCon); } return 0; } int do_grep(poptContext optCon) { const Vartable* table; const char* pattern; /* Throw away the command name */ poptGetArg(optCon); if (poptPeekArg(optCon) == NULL) dba_cmdline_error(optCon, "there should be at least one B or D item to expand. Examples are: B01002 or D03001"); pattern = poptGetArg(optCon); table = Vartable::get("dballe"); for (Vartable::const_iterator info = table->begin(); info != table->end(); ++info) { #if HAVE_STRCASESTR if (strcasestr(info->desc, pattern) != NULL) #else #warning dbatbl grep is case sensite on this sytstem, since strcasestr is not available if (strstr(info->desc, pattern) != NULL) #endif { if (op_csv) print_varinfo_csv(*info); else print_varinfo(*info); } } return 0; } int do_expand(poptContext optCon) { const char* item; /* Throw away the command name */ poptGetArg(optCon); btable = Vartable::get("dballe"); ::dtable = DTable::get("D000203"); if (poptPeekArg(optCon) == NULL) dba_cmdline_error(optCon, "there should be at least one B or D item to expand. Examples are: B01002 or D03001"); while ((item = poptGetArg(optCon)) != NULL) expand_table_entry(descriptor_code(item), 0); return 0; } int do_expandcode(poptContext optCon) { const char* item; /* Throw away the command name */ poptGetArg(optCon); while ((item = poptGetArg(optCon)) != NULL) { int code = strtol(item, NULL, 10); char c = 'B'; switch (WR_VAR_F(code)) { case 0: c = 'B'; break; case 1: c = 'R'; break; case 2: c = 'C'; break; case 3: c = 'D'; break; } printf("%s: %c%02d%03d\n", item, c, WR_VAR_X(code), WR_VAR_Y(code)); } return 0; } static const char* table_type = "b"; int do_index(poptContext optCon) { const char* file; const char* id; /* Throw away the command name */ poptGetArg(optCon); file = poptGetArg(optCon); id = poptGetArg(optCon); if (file == NULL) dba_cmdline_error(optCon, "input file has not been specified"); if (id == NULL) dba_cmdline_error(optCon, "indexed table ID has not been specified"); if (strcmp(table_type, "b") == 0) { if (strcmp(id, "dballe") != 0) { /* If it's an external table, check unit conversions to DBALLE * correspondents */ if (!check_unit_conversions(id)) fprintf(stderr, "Warning: some variables cannot be converted from %s to dballe\n", id); } } else if (strcmp(table_type, "d") == 0) ; /* DBA_RUN_OR_RETURN(bufrex_dtable_index(file, id)); */ /* else if (strcmp(type, "conv") == 0) DBA_RUN_OR_RETURN(bufrex_convtable_index_csv(file, id)); */ else dba_cmdline_error(optCon, "'%s' is not a valid table type", table_type); return 0; } int do_describe(poptContext optCon) { const char* what; /* Throw away the command name */ poptGetArg(optCon); if ((what = poptGetArg(optCon)) == NULL) dba_cmdline_error(optCon, "you need to specify what you want to describe. Available options are: 'level' and 'trange'"); if (strcmp(what, "level") == 0) { const char* sltype1 = poptGetArg(optCon); const char* sl1 = poptGetArg(optCon); const char* sltype2 = poptGetArg(optCon); const char* sl2 = poptGetArg(optCon); if (sltype1 == NULL) dba_cmdline_error(optCon, "you need provide 1, 2, 3 or 4 numbers that identify the level or layer"); string formatted = Level( strtoul(sltype1, NULL, 10), sl1 == NULL ? 0 : strtoul(sl1, NULL, 10), sltype2 == NULL ? 0 : strtoul(sltype2, NULL, 10), sl2 == NULL ? 0 : strtoul(sl2, NULL, 10)).describe(); puts(formatted.c_str()); } else if (strcmp(what, "trange") == 0) { const char* sptype = poptGetArg(optCon); const char* sp1 = poptGetArg(optCon); const char* sp2 = poptGetArg(optCon); if (sptype == NULL) dba_cmdline_error(optCon, "you need provide 1, 2 or 3 numbers that identify the time range"); string formatted = Trange( strtoul(sptype, NULL, 10), sp1 == NULL ? 0 : strtoul(sp1, NULL, 10), sp2 == NULL ? 0 : strtoul(sp2, NULL, 10)).describe(); puts(formatted.c_str()); } else dba_cmdline_error(optCon, "cannot handle %s. Available options are: 'level' and 'trange'.", what); return 0; } static struct tool_desc dbatbl; struct poptOption dbatbl_cat_options[] = { { "help", '?', 0, 0, 1, "print an help message" }, { "csv", 'c', POPT_ARG_NONE, &op_csv, 0, "output variables in CSV format" }, POPT_TABLEEND }; struct poptOption dbatbl_expand_options[] = { { "help", '?', 0, 0, 1, "print an help message" }, POPT_TABLEEND }; struct poptOption dbatbl_expandcode_options[] = { { "help", '?', 0, 0, 1, "print an help message" }, POPT_TABLEEND }; struct poptOption dbatbl_index_options[] = { { "help", '?', 0, 0, 1, "print an help message" }, { "type", 't', POPT_ARG_STRING, &table_type, 0, "format of the table to index ('b', 'd', 'conv')", "type" }, POPT_TABLEEND }; struct poptOption dbatbl_describe_options[] = { { "help", '?', 0, 0, 1, "print an help message" }, POPT_TABLEEND }; static void init() { dbatbl.desc = "Manage on-disk reference tables for DB-ALLe"; dbatbl.longdesc = "This tool allows to index and query the tables that are " "needed for normal functioning of DB-ALLe"; dbatbl.ops = (struct op_dispatch_table*)calloc(7, sizeof(struct op_dispatch_table)); dbatbl.ops[0].func = do_cat; dbatbl.ops[0].aliases[0] = "cat"; dbatbl.ops[0].usage = "cat tableid [tableid [...]]"; dbatbl.ops[0].desc = "Output all the contents of a WMO B table."; dbatbl.ops[0].longdesc = NULL; dbatbl.ops[0].optable = dbatbl_cat_options; dbatbl.ops[1].func = do_grep; dbatbl.ops[1].aliases[0] = "grep"; dbatbl.ops[1].usage = "grep string"; dbatbl.ops[1].desc = "Output all the contents of the local B table whose description contains the given string."; dbatbl.ops[1].longdesc = NULL; dbatbl.ops[1].optable = dbatbl_cat_options; dbatbl.ops[2].func = do_expand; dbatbl.ops[2].aliases[0] = "expand"; dbatbl.ops[2].usage = "expand table-entry [table-entry [...]]"; dbatbl.ops[2].desc = "Describe a WMO B table entry or expand a WMO D table entry in its components."; dbatbl.ops[2].longdesc = NULL; dbatbl.ops[2].optable = dbatbl_expand_options; dbatbl.ops[3].func = do_expandcode; dbatbl.ops[3].aliases[0] = "expandcode"; dbatbl.ops[3].usage = "expandcode varcode [varcode [...]]"; dbatbl.ops[3].desc = "Expand the value of a packed variable code"; dbatbl.ops[3].longdesc = NULL; dbatbl.ops[3].optable = dbatbl_expandcode_options; dbatbl.ops[4].func = do_index; dbatbl.ops[4].aliases[0] = "index"; dbatbl.ops[4].usage = "index [options] filename index-id"; dbatbl.ops[4].desc = "Index the contents of a table file"; dbatbl.ops[4].longdesc = NULL; dbatbl.ops[4].optable = dbatbl_index_options; dbatbl.ops[5].func = do_describe; dbatbl.ops[5].aliases[0] = "describe"; dbatbl.ops[5].usage = "describe [options] what [values]"; dbatbl.ops[5].desc = "Invoke the formatter to describe the given values"; dbatbl.ops[5].longdesc = "Supported so far are: \"level ltype l1 l2\", \"trange pind p1 p2\""; dbatbl.ops[5].optable = dbatbl_describe_options; dbatbl.ops[6].func = NULL; dbatbl.ops[6].usage = NULL; dbatbl.ops[6].desc = NULL; dbatbl.ops[6].longdesc = NULL; dbatbl.ops[6].optable = NULL; }; static struct program_info proginfo = { "dbatbl", NULL, NULL, NULL }; int main (int argc, const char* argv[]) { int res; init(); res = dba_cmdline_dispatch_main(&proginfo, &dbatbl, argc, argv); return res; } /* vim:set ts=4 sw=4: */ dballe-5.18/tools/dbatbl_makeb0000755000175000017500000002231211422011702013256 00000000000000#!/usr/bin/python import struct import sys # Documentation for Entry fields ENTRYDOC = { "var": "The variable code (BXXYYY)", "desc": "The variable description (max 64 chars)", "unit": "The measurement unit of the variable (max 64 chars)", "scale": "The scale of the variable. When the variable is represented as an integer, it is multiplied by 10**scale", "ref": "The reference value for the variable. When the variable is represented as an integer, and after scaling, it is added this value", "len": "The length in digits of the integer representation of this variable (after scaling and changing reference value)", "bit_ref": "The reference value for bit-encoding. When the variable is encoded in a bit string, it is added this value", "bit_len": "The length in bits of the variable when encoded in a bit string (after scaling and changing reference value)", "bufr_unit": "The measurement unit of the variable when encoded in BUFR. (max 24 chars)", "bufr_scale": "The scale of the variable when encoded in BUFR.", } def unit_is_string(unit): # if unit.startswith("CODE TABLE"): return True return unit in ["CCITTIA5", "CHARACTER"] class Entry(object): "A B table entry" FIELDS=["var", "desc", "unit", "scale", "ref", "len", "bit_ref", "bit_len", "bufr_unit", "bufr_scale"] NUMFIELDS=["scale", "ref", "len", "bit_ref", "bit_len", "bufr_scale"] def __init__(self): self.var = "B00000" self.desc = "" self.unit = "" self.scale = 0 self.ref = -10 self.len = 0 self.bit_ref = -10 self.bit_len = 0 self.bufr_unit = "" self.bufr_scale = 0 ## Minimum unscaled value the field can have #self.imin ## Maximum unscaled value the field can have #int imax; ## Minimum scaled value the field can have #double dmin; ## Maximum scaled value the field can have #double dmax; BUFRFMT='x6sx64sx24sx3sx12sx3s' def read_bufr(self, s): "Read from the bufr part of the B table" self.var, self.desc, self.unit, self.scale, self.bit_ref, self.bit_len = struct.unpack(self.BUFRFMT, s[:118]) if self.var[0] == '0': self.var = 'B' + self.var[1:] self.scale = int(self.scale) self.bit_ref = int(self.bit_ref) self.bit_len = int(self.bit_len) self.desc = self.desc.strip() self.unit = self.unit.strip() self.bufr_unit = self.unit self.bufr_scale = self.scale # Compute character length from bit lenght if unit_is_string(self.unit): self.len = self.bit_len / 8 else: tlen = 1 << self.bit_len self.len = 0 while tlen != 0: tlen = tlen / 10 self.len += 1 CREXFMT='24sx2sx10s' def read_crex(self, s): self.unit, self.scale, self.len = struct.unpack(self.CREXFMT, s[:38]) self.unit = self.unit.strip() self.scale = int(self.scale) self.len = int(self.len) FMT=" %-6.6s %-64.64s %-24.24s %3.3s %12.12s %3.3s %-24.24s %2.2s %10.10s" def encode(self): var = self.var if var[0] == 'B': var = '0' + var[1:] args = map(str, (var, self.desc, self.unit, self.scale, self.bit_ref, self.bit_len, self.unit, self.scale, self.len)) return self.FMT % tuple(args) def dump(self): print "Var:", self.var print "Desc:", self.desc if self.unit == self.bufr_unit: print "Unit:", self.unit else: print "BUFR unit:", self.bufr_unit print "CREX unit:", self.unit if self.is_string(): print "Format: %d chars:" % self.len elif self.scale == 0: print "Format: %d digits" % self.len elif self.scale > 0: fmtdesc = "#" * min(self.len - self.scale, 99) fmtdesc += '.' fmtdesc += "#" * min(self.scale, 99) print "Format:", fmtdesc elif self.scale < 0: fmtdesc = "#" * min(self.len, 99) fmtdesc += "0" * min(-self.scale, 99) print "Format:", fmtdesc def is_string(self): "True if the variable is a string; false if it is a numeric value" return unit_is_string(self.unit) def check(self): "Consistency checks" if unit_is_string(self.bufr_unit) != unit_is_string(self.unit): return "CREX is_string (%s - %s) is different than BUFR is_string (%s - %s)" % ( self.unit, str(unit_is_string(self.unit)), self.bufr_unit, str(unit_is_string(self.bufr_unit))) return None # def irange(self): # "Range of int-converted values" # if self.is_string: # return 0, 0 # if self.len >= 10: # return -2**31, 2**31 # # def drange(self): # "Range of float, unconverted values" # if self.is_string: # return 0.0, 0.0 # # if (i->len >= 10) # { # i->imin = INT_MIN; # i->imax = INT_MAX; # } else { # /* # // We subtract 2 because 2^bit_len-1 is the # // BUFR missing value # int bufr_min = i->bit_ref; # int bufr_max = exp2(i->bit_len) + i->bit_ref - 2; # // We subtract 2 because 10^len-1 is the # // CREX missing value # int crex_min = -(int)(exp10(i->len) - 1.0); # int crex_max = (int)(exp10(i->len) - 2.0); # // Actually, we cannot subtract 2 because RADAR BUFR # // messages have 255 subsets, and the delayed # // replication field is 8 bits, so 255 is the missing # // value, and if we disallow it here we cannot import # // radars anymore. # */ # /* # * If the unit is the same between BUFR and CREX, take # * the most restrictive extremes. # * # * If the unit is different, take the most permissive # * extremes, to make sure to fit values in both units # */ # /* # if (strcmp(i->unit, i->bufr_unit) == 0) # { # i->imin = bufr_min > crex_min ? bufr_min : crex_min; # i->imax = bufr_max < crex_max ? bufr_max : crex_max; # } else { # i->imin = bufr_min < crex_min ? bufr_min : crex_min; # i->imax = bufr_max > crex_max ? bufr_max : crex_max; # } # */ # /* # i->imin = i->bit_ref; # i->imax = exp2(i->bit_len) + i->bit_ref - 2; # */ # i->imin = -(int)(exp10(i->len) - 1.0); # i->imax = (int)(exp10(i->len) - 1.0); # } # i->dmin = dba_var_decode_int(i->imin, i); # i->dmax = dba_var_decode_int(i->imax, i); def read_btable(fd): for idx, line in enumerate(fd): entry = Entry() entry.read_bufr(line) if len(line) >= 157: entry.read_crex(line[119:]) msg = entry.check() if msg is not None: print >>sys.stderr, "Line %d: %s" % (idx+1, msg) yield entry import readline class Completer(object): def __init__(self, func): self.func = func self.opts = [] def __call__(self, text, state): if state == 0: self.opts = list(self.func(text)) if state >= len(self.opts): return None return self.opts[state] class App(object): def __init__(self, tablefname): self.entries = list(read_btable(open(tablefname))) self.entry = None def get_entry(self, b): for e in self.entries: if e.var == b: return e return None def comp_field(self, text): for field in self.entry.FIELDS: if field.startswith(text): yield field def comp_val(self, text): res = set() for e in self.entries: val = str(getattr(e, self.field, "")) if val.startswith(text): res.add(val) return sorted(res) def main(self, var): readline.parse_and_bind("tab: complete") self.entry = self.get_entry(var) if self.entry is None: self.entry = Entry() self.entry.var = var while True: print "Current entry value:" self.entry.dump() readline.set_completer(Completer(self.comp_field)) self.field = raw_input("field to set (? for help, q to quit): ") if self.field == '?': print for f in self.entry.FIELDS: print "%s: %s" % (f, ENTRYDOC[f]) print continue elif self.field == 'q': break elif self.field == "": print continue elif self.field not in self.entry.FIELDS: print "Invalid field (try ? for help)." print continue else: readline.set_completer(Completer(self.comp_val)) print "%s: %s" % (self.field, ENTRYDOC[self.field]) print "current value:", getattr(self.entry, self.field) val = raw_input("value to set: ").strip() try: if self.field in self.entry.NUMFIELDS: val = int(val) setattr(self.entry, self.field, val) except Exception, e: print e print print self.entry.encode() app = App(sys.argv[1]) app.main(sys.argv[2]) dballe-5.18/tools/Makefile.in0000644000175000017500000005305311754230756013040 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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@ 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@ bin_PROGRAMS = dbatbl$(EXEEXT) dbamsg$(EXEEXT) $(am__EXEEXT_1) @DO_DBALLE_DB_TRUE@am__append_1 = dbadb subdir = tools DIST_COMMON = $(dist_bin_SCRIPTS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_flag.m4 \ $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/python.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @DO_DBALLE_DB_TRUE@am__EXEEXT_1 = dbadb$(EXEEXT) am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am__dbadb_SOURCES_DIST = dbadb.cc @DO_DBALLE_DB_TRUE@am_dbadb_OBJECTS = dbadb.$(OBJEXT) dbadb_OBJECTS = $(am_dbadb_OBJECTS) dbadb_LDADD = $(LDADD) dbadb_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ $(dbadb_LDFLAGS) $(LDFLAGS) -o $@ am_dbamsg_OBJECTS = dbamsg.$(OBJEXT) dbamsg_OBJECTS = $(am_dbamsg_OBJECTS) dbamsg_LDADD = $(LDADD) dbamsg_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ $(dbamsg_LDFLAGS) $(LDFLAGS) -o $@ am_dbatbl_OBJECTS = dbatbl.$(OBJEXT) dbatbl_OBJECTS = $(am_dbatbl_OBJECTS) dbatbl_LDADD = $(LDADD) dbatbl_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ $(dbatbl_LDFLAGS) $(LDFLAGS) -o $@ 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; }; \ } SCRIPTS = $(dist_bin_SCRIPTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(dbadb_SOURCES) $(dbamsg_SOURCES) $(dbatbl_SOURCES) DIST_SOURCES = $(am__dbadb_SOURCES_DIST) $(dbamsg_SOURCES) \ $(dbatbl_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FC = @FC@ FCFLAGS = @FCFLAGS@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBDBALLEF_VERSION_INFO = @LIBDBALLEF_VERSION_INFO@ LIBDBALLE_VERSION_INFO = @LIBDBALLE_VERSION_INFO@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LUA_CFLAGS = @LUA_CFLAGS@ LUA_LIBS = @LUA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ 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@ PKG_CONFIG = @PKG_CONFIG@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WIBBLE_CFLAGS = @WIBBLE_CFLAGS@ WIBBLE_LIBS = @WIBBLE_LIBS@ WREPORT_CFLAGS = @WREPORT_CFLAGS@ WREPORT_LIBS = @WREPORT_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ confdir = @confdir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ have_doxygen = @have_doxygen@ have_gperf = @have_gperf@ have_latex2html = @have_latex2html@ have_rst2html = @have_rst2html@ have_swig = @have_swig@ 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@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ tabledir = @tabledir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ DBALLELIBS = ../dballe/libdballe.la INCLUDES = -I$(top_srcdir) $(WREPORT_CFLAGS) $(LUA_CFLAGS) dist_bin_SCRIPTS = dbatbl_makeb dbatbl_SOURCES = dbatbl.cc dbatbl_LDFLAGS = $(DBALLELIBS) $(WREPORT_LIBS) -lpopt dbatbl_DEPENDENCIES = $(DBALLELIBS) dbamsg_SOURCES = dbamsg.cc dbamsg_LDFLAGS = $(DBALLELIBS) $(WREPORT_LIBS) -lpopt dbamsg_DEPENDENCIES = $(DBALLELIBS) @DO_DBALLE_DB_TRUE@dbadb_SOURCES = dbadb.cc @DO_DBALLE_DB_TRUE@dbadb_LDFLAGS = $(DBALLELIBS) $(WREPORT_LIBS) -lpopt @DO_DBALLE_DB_TRUE@dbadb_DEPENDENCIES = $(DBALLELIBS) all: all-am .SUFFIXES: .SUFFIXES: .cc .lo .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) --foreign tools/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign tools/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) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p || test -f $$p1; \ 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) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(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: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list dbadb$(EXEEXT): $(dbadb_OBJECTS) $(dbadb_DEPENDENCIES) $(EXTRA_dbadb_DEPENDENCIES) @rm -f dbadb$(EXEEXT) $(dbadb_LINK) $(dbadb_OBJECTS) $(dbadb_LDADD) $(LIBS) dbamsg$(EXEEXT): $(dbamsg_OBJECTS) $(dbamsg_DEPENDENCIES) $(EXTRA_dbamsg_DEPENDENCIES) @rm -f dbamsg$(EXEEXT) $(dbamsg_LINK) $(dbamsg_OBJECTS) $(dbamsg_LDADD) $(LIBS) dbatbl$(EXEEXT): $(dbatbl_OBJECTS) $(dbatbl_DEPENDENCIES) $(EXTRA_dbatbl_DEPENDENCIES) @rm -f dbatbl$(EXEEXT) $(dbatbl_LINK) $(dbatbl_OBJECTS) $(dbatbl_LDADD) $(LIBS) install-dist_binSCRIPTS: $(dist_bin_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(dist_bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ 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-dist_binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(dist_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) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbadb.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbamsg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbatbl.Po@am__quote@ .cc.o: @am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cc.obj: @am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cc.lo: @am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" 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: check-am all-am: Makefile $(PROGRAMS) $(SCRIPTS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(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: 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-binPROGRAMS clean-generic clean-libtool 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-dist_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 -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-dist_binSCRIPTS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic clean-libtool ctags distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-binPROGRAMS install-data install-data-am \ install-dist_binSCRIPTS 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-binPROGRAMS \ uninstall-dist_binSCRIPTS # 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: dballe-5.18/tools/dbadb.cc0000644000175000017500000003757311717006773012346 00000000000000/* * Copyright (C) 2005--2011 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace dballe; using namespace dballe::cmdline; using namespace wreport; using namespace std; // Command line parser variables struct cmdline::Reader reader; static const char* op_output_template = ""; const char* op_output_type = "bufr"; const char* op_report = ""; const char* op_dsn = ""; const char* op_user = ""; const char* op_pass = ""; int op_wipe_first = 0; int op_dump = 0; int op_overwrite = 0; int op_fast = 0; int op_no_attrs = 0; int op_full_pseudoana = 0; int op_verbose = 0; int op_precise_import = 0; struct poptOption grepTable[] = { { "category", 0, POPT_ARG_INT, &reader.filter.category, 0, "match messages with the given data category", "num" }, { "subcategory", 0, POPT_ARG_INT, &reader.filter.subcategory, 0, "match BUFR messages with the given data subcategory", "num" }, { "check-digit", 0, POPT_ARG_INT, &reader.filter.checkdigit, 0, "match CREX messages with check digit (if 1) or without check digit (if 0)", "num" }, { "unparsable", 0, 0, &reader.filter.unparsable, 0, "match only messages that cannot be parsed", 0 }, { "parsable", 0, 0, &reader.filter.parsable, 0, "match only messages that can be parsed", 0 }, { "index", 0, POPT_ARG_STRING, &reader.filter.index, 0, "match messages with the index in the given range (ex.: 1-5,9,22-30)", "expr" }, POPT_TABLEEND }; struct poptOption dbTable[] = { { "dsn", 0, POPT_ARG_STRING, &op_dsn, 0, "DSN, or URL-like database definition, to use for connecting to the DB-All.e database (can also be specified in the environment as DBA_DB)", "dsn" }, { "user", 0, POPT_ARG_STRING, &op_user, 0, "username to use for connecting to the DB-All.e database", "user" }, { "pass", 0, POPT_ARG_STRING, &op_pass, 0, "password to use for connecting to the DB-All.e database", "pass" }, { "wipe-first", 0, POPT_ARG_NONE, &op_wipe_first, 0, "wipe database before any other action" }, POPT_TABLEEND }; static void connect(DB& db) { const char* chosen_dsn; /* If dsn is missing, look in the environment */ if (op_dsn[0] == 0) { chosen_dsn = getenv("DBA_DB"); if (chosen_dsn == NULL) throw error_consistency("no database specified"); } else chosen_dsn = op_dsn; /* If dsn looks like a url, treat it accordingly */ if (DB::is_url(chosen_dsn)) db.connect_from_url(chosen_dsn); else db.connect(chosen_dsn, op_user, op_pass); // Wipe database if requested if (op_wipe_first) db.reset(); } // Command line parsing wrappers for Dbadb methods int do_dump(poptContext optCon) { /* Throw away the command name */ poptGetArg(optCon); /* Create the query */ Record query; dba_cmdline_get_query(optCon, query); DB db; connect(db); Dbadb dbadb(db); return dbadb.do_dump(query, stdout); } int do_stations(poptContext optCon) { /* Throw away the command name */ poptGetArg(optCon); /* Create the query */ Record query; dba_cmdline_get_query(optCon, query); DB db; connect(db); Dbadb dbadb(db); return dbadb.do_stations(query, stdout); } /// Create / empty the database int do_wipe(poptContext optCon) { /* Throw away the command name */ poptGetArg(optCon); /* Get the optional name of the repinfo file */ const char* fname = poptGetArg(optCon); DB db; connect(db); db.reset(fname); return 0; } /// Perform database cleanup maintenance int do_cleanup(poptContext optCon) { DB db; connect(db); db.remove_orphans(); return 0; } /// Update repinfo information in the database int do_repinfo(poptContext optCon) { /* Throw away the command name */ poptGetArg(optCon); DB db; connect(db); /* Get the optional name of the repinfo file. If missing, the default will be used */ const char* fname = poptGetArg(optCon); int added, deleted, updated; db.update_repinfo(fname, &added, &deleted, &updated); printf("Update completed: %d added, %d deleted, %d updated.\n", added, deleted, updated); return 0; } int do_import(poptContext optCon) { // Throw away the command name poptGetArg(optCon); // Configure the reader Record query; if (dba_cmdline_get_query(optCon, query) > 0) reader.filter.matcher_from_record(query); reader.import_opts.simplified = !op_precise_import; // Configure the importer int import_flags = 0; if (op_overwrite) import_flags |= DBA_IMPORT_OVERWRITE; if (op_fast) import_flags |= DBA_IMPORT_NO_TRANSACTIONS; if (!op_no_attrs) import_flags |= DBA_IMPORT_ATTRS; if (op_full_pseudoana) import_flags |= DBA_IMPORT_FULL_PSEUDOANA; DB db; connect(db); const char* forced_repmemo = dbadb::parse_op_report(db, op_report); Dbadb dbadb(db); return dbadb.do_import(get_filenames(optCon), reader, import_flags, forced_repmemo); } int do_export(poptContext optCon) { /* Throw away the command name */ poptGetArg(optCon); if (strcmp(op_output_template, "list") == 0) { list_templates(); return 0; } // Reat the query from command line Record query; dba_cmdline_get_query(optCon, query); DB db; connect(db); Dbadb dbadb(db); if (op_dump) { return dbadb.do_export_dump(query, stdout); } else { Encoding type = dba_cmdline_stringToMsgType(op_output_type); auto_ptr file = File::create(type, "(stdout)", "w"); return dbadb.do_export(query, *file, op_output_template, op_report); } } int do_delete(poptContext optCon) { /* Throw away the command name */ poptGetArg(optCon); if (poptPeekArg(optCon) == NULL) dba_cmdline_error(optCon, "you need to specify some query parameters"); /* Add the query data from commandline */ Record query; dba_cmdline_get_query(optCon, query); DB db; connect(db); // TODO: check that there is something db.remove(query); return 0; } struct poptOption dbadb_dump_options[] = { { "help", '?', 0, 0, 1, "print an help message", 0 }, { "verbose", 0, POPT_ARG_NONE, &op_verbose, 0, "verbose output", 0 }, { NULL, 0, POPT_ARG_INCLUDE_TABLE, &dbTable, 0, "Options used to connect to the database", 0 }, POPT_TABLEEND }; struct poptOption dbadb_wipe_options[] = { { "help", '?', 0, 0, 1, "print an help message", 0 }, { "verbose", 0, POPT_ARG_NONE, &op_verbose, 0, "verbose output", 0 }, { NULL, 0, POPT_ARG_INCLUDE_TABLE, &dbTable, 0, "Options used to connect to the database", 0 }, POPT_TABLEEND }; struct poptOption dbadb_import_options[] = { { "help", '?', 0, 0, 1, "print an help message", 0 }, { "verbose", 0, POPT_ARG_NONE, &op_verbose, 0, "verbose output", 0 }, { "type", 't', POPT_ARG_STRING, &reader.input_type, 0, "format of the input data ('bufr', 'crex', 'aof', 'csv')", "type" }, { "overwrite", 'f', POPT_ARG_NONE, &op_overwrite, 0, "overwrite existing data", 0 }, { "report", 'r', POPT_ARG_STRING, &op_report, 0, "force data to be of this type of report, specified with rep_cod or rep_memo values", "rep" }, { "fast", 0, POPT_ARG_NONE, &op_fast, 0, "Ignored. This option is left here for compatibility with old versions of dbadb.", 0 }, { "no-attrs", 0, POPT_ARG_NONE, &op_no_attrs, 0, "do not import data attributes", 0 }, { "full-pseudoana", 0, POPT_ARG_NONE, &op_full_pseudoana, 0, "merge pseudoana extra values with the ones already existing in the database", 0 }, { "precise", 0, 0, &op_precise_import, 0, "import messages using precise contexts instead of standard ones", 0 }, { NULL, 0, POPT_ARG_INCLUDE_TABLE, &dbTable, 0, "Options used to connect to the database", 0 }, { NULL, 0, POPT_ARG_INCLUDE_TABLE, &grepTable, 0, "Options used to filter messages", 0 }, POPT_TABLEEND }; struct poptOption dbadb_export_options[] = { { "help", '?', 0, 0, 1, "print an help message", 0 }, { "verbose", 0, POPT_ARG_NONE, &op_verbose, 0, "verbose output", 0 }, { "report", 'r', POPT_ARG_STRING, &op_report, 0, "force exported data to be of this type of report, specified with rep_cod or rep_memo values", "rep" }, { "dest", 'd', POPT_ARG_STRING, &op_output_type, 0, "format of the data in output ('bufr', 'crex', 'aof')", "type" }, { "template", 't', POPT_ARG_STRING, &op_output_template, 0, "template of the data in output (autoselect if not specified, 'list' gives a list)", "name" }, { "dump", 0, POPT_ARG_NONE, &op_dump, 0, "dump data to be encoded instead of encoding it", 0 }, { NULL, 0, POPT_ARG_INCLUDE_TABLE, &dbTable, 0, "Options used to connect to the database", 0 }, POPT_TABLEEND }; struct poptOption dbadb_repinfo_options[] = { { "help", '?', 0, 0, 1, "print an help message", 0 }, { "verbose", 0, POPT_ARG_NONE, &op_verbose, 0, "verbose output", 0 }, { NULL, 0, POPT_ARG_INCLUDE_TABLE, &dbTable, 0, "Options used to connect to the database", 0 }, POPT_TABLEEND }; struct poptOption dbadb_cleanup_options[] = { { "help", '?', 0, 0, 1, "print an help message", 0 }, { NULL, 0, POPT_ARG_INCLUDE_TABLE, &dbTable, 0, "Options used to connect to the database", 0 }, POPT_TABLEEND }; struct poptOption dbadb_stations_options[] = { { "help", '?', 0, 0, 1, "print an help message", 0 }, { NULL, 0, POPT_ARG_INCLUDE_TABLE, &dbTable, 0, "Options used to connect to the database", 0 }, POPT_TABLEEND }; struct poptOption dbadb_delete_options[] = { { "help", '?', 0, 0, 1, "print an help message", 0 }, { NULL, 0, POPT_ARG_INCLUDE_TABLE, &dbTable, 0, "Options used to connect to the database", 0 }, POPT_TABLEEND }; static struct tool_desc dbadb_tooldesc; static void init() { dbadb_tooldesc.desc = "Manage the DB-ALLe database"; dbadb_tooldesc.longdesc = "It allows to initialise the database, dump its contents and import and export data " "using BUFR, CREX or AOF encoding"; dbadb_tooldesc.ops = (struct op_dispatch_table*)calloc(9, sizeof(struct op_dispatch_table)); dbadb_tooldesc.ops[0].func = do_dump; dbadb_tooldesc.ops[0].aliases[0] = "dump"; dbadb_tooldesc.ops[0].usage = "dump [options] [queryparm1=val1 [queryparm2=val2 [...]]]"; dbadb_tooldesc.ops[0].desc = "Dump data from the database"; dbadb_tooldesc.ops[0].longdesc = "Query parameters are the same of the Fortran API. " "Please see the section \"Input and output parameters -- For data " "related action routines\" of the Fortran API documentation for a " "complete list."; dbadb_tooldesc.ops[0].optable = dbadb_dump_options; dbadb_tooldesc.ops[1].func = do_wipe; dbadb_tooldesc.ops[1].aliases[0] = "wipe"; dbadb_tooldesc.ops[1].usage = "wipe [options] [optional rep_memo description file]"; dbadb_tooldesc.ops[1].desc = "Reinitialise the database, removing all data"; dbadb_tooldesc.ops[1].longdesc = "Reinitialisation is done using the given report code description file. " "If no file is provided, a default version is used"; dbadb_tooldesc.ops[1].optable = dbadb_wipe_options; dbadb_tooldesc.ops[2].func = do_import; dbadb_tooldesc.ops[2].aliases[0] = "import"; dbadb_tooldesc.ops[2].usage = "import [options] [filter] filename [filename [ ... ] ]"; dbadb_tooldesc.ops[2].desc = "Import data into the database"; dbadb_tooldesc.ops[2].longdesc = NULL; dbadb_tooldesc.ops[2].optable = dbadb_import_options; dbadb_tooldesc.ops[3].func = do_export; dbadb_tooldesc.ops[3].aliases[0] = "export"; dbadb_tooldesc.ops[3].usage = "export [options] rep_memo [queryparm1=val1 [queryparm2=val2 [...]]]"; dbadb_tooldesc.ops[3].desc = "Export data from the database"; dbadb_tooldesc.ops[3].longdesc = "Query parameters are the same of the Fortran API. " "Please see the section \"Input and output parameters -- For data " "related action routines\" of the Fortran API documentation for a " "complete list."; dbadb_tooldesc.ops[3].optable = dbadb_export_options; dbadb_tooldesc.ops[4].func = do_repinfo; dbadb_tooldesc.ops[4].aliases[0] = "repinfo"; dbadb_tooldesc.ops[4].usage = "repinfo [options] [filename]"; dbadb_tooldesc.ops[4].desc = "Update the report information table"; dbadb_tooldesc.ops[4].longdesc = "Update the report information table with the data from the given " "report code description file. " "If no file is provided, a default version is used"; dbadb_tooldesc.ops[4].optable = dbadb_repinfo_options; dbadb_tooldesc.ops[5].func = do_cleanup; dbadb_tooldesc.ops[5].aliases[0] = "cleanup"; dbadb_tooldesc.ops[5].usage = "cleanup [options]"; dbadb_tooldesc.ops[5].desc = "Perform database cleanup operations"; dbadb_tooldesc.ops[5].longdesc = "The only operation currently performed by this command is " "deleting stations that have no values. If more will be added in " "the future, they will be documented here."; dbadb_tooldesc.ops[5].optable = dbadb_cleanup_options; dbadb_tooldesc.ops[6].func = do_stations; dbadb_tooldesc.ops[6].aliases[0] = "stations"; dbadb_tooldesc.ops[6].usage = "stations [options] [queryparm1=val1 [queryparm2=val2 [...]]]"; dbadb_tooldesc.ops[6].desc = "List the stations present in the database"; dbadb_tooldesc.ops[6].longdesc = "Query parameters are the same of the Fortran API. " "Please see the section \"Input and output parameters -- For data " "related action routines\" of the Fortran API documentation for a " "complete list."; dbadb_tooldesc.ops[6].optable = dbadb_stations_options; dbadb_tooldesc.ops[7].func = do_delete; dbadb_tooldesc.ops[7].aliases[0] = "delete"; dbadb_tooldesc.ops[7].usage = "delete [options] [queryparm1=val1 [queryparm2=val2 [...]]]"; dbadb_tooldesc.ops[7].desc = "Delete all the data matching the given query parameters"; dbadb_tooldesc.ops[7].longdesc = "Query parameters are the same of the Fortran API. " "Please see the section \"Input and output parameters -- For data " "related action routines\" of the Fortran API documentation for a " "complete list."; dbadb_tooldesc.ops[7].optable = dbadb_delete_options; dbadb_tooldesc.ops[8].func = NULL; dbadb_tooldesc.ops[8].usage = NULL; dbadb_tooldesc.ops[8].desc = NULL; dbadb_tooldesc.ops[8].longdesc = NULL; dbadb_tooldesc.ops[8].optable = NULL; }; static struct program_info proginfo = { "dbadb", NULL, NULL, NULL }; int main (int argc, const char* argv[]) { int res; init(); res = dba_cmdline_dispatch_main(&proginfo, &dbadb_tooldesc, argc, argv); return res; } /* vim:set ts=4 sw=4: */ dballe-5.18/tools/Makefile.am0000644000175000017500000000114511674655051013022 00000000000000## Process this file with automake to produce Makefile.in DBALLELIBS = ../dballe/libdballe.la INCLUDES = -I$(top_srcdir) $(WREPORT_CFLAGS) $(LUA_CFLAGS) bin_PROGRAMS = dbatbl dbamsg dist_bin_SCRIPTS = dbatbl_makeb dbatbl_SOURCES = dbatbl.cc dbatbl_LDFLAGS = $(DBALLELIBS) $(WREPORT_LIBS) -lpopt dbatbl_DEPENDENCIES = $(DBALLELIBS) dbamsg_SOURCES = dbamsg.cc dbamsg_LDFLAGS = $(DBALLELIBS) $(WREPORT_LIBS) -lpopt dbamsg_DEPENDENCIES = $(DBALLELIBS) if DO_DBALLE_DB bin_PROGRAMS += dbadb dbadb_SOURCES = dbadb.cc dbadb_LDFLAGS = $(DBALLELIBS) $(WREPORT_LIBS) -lpopt dbadb_DEPENDENCIES = $(DBALLELIBS) endif dballe-5.18/tools/dbamsg.cc0000644000175000017500000011651511717006772012540 00000000000000/* * Copyright (C) 2005--2011 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ /* For %zd */ #define _ISOC99_SOURCE #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace wreport; using namespace dballe; using namespace dballe::cmdline; using namespace std; static int op_dump_interpreted = 0; static int op_dump_text = 0; static int op_dump_csv = 0; static int op_dump_dds = 0; static int op_dump_structured = 0; static int op_precise_import = 0; static int op_recompute_categories = 0; static const char* op_output_type = "bufr"; static const char* op_output_template = ""; static const char* op_report = ""; static const char* op_bisect_cmd = NULL; int op_verbose = 0; struct cmdline::Reader reader; struct poptOption grepTable[] = { { "category", 0, POPT_ARG_INT, &reader.filter.category, 0, "match messages with the given data category", "num" }, { "subcategory", 0, POPT_ARG_INT, &reader.filter.subcategory, 0, "match BUFR messages with the given data subcategory", "num" }, { "check-digit", 0, POPT_ARG_INT, &reader.filter.checkdigit, 0, "match CREX messages with check digit (if 1) or without check digit (if 0)", "num" }, { "unparsable", 0, 0, &reader.filter.unparsable, 0, "match only messages that cannot be parsed", 0 }, { "parsable", 0, 0, &reader.filter.parsable, 0, "match only messages that can be parsed", 0 }, { "index", 0, POPT_ARG_STRING, &reader.filter.index, 0, "match messages with the index in the given range (ex.: 1-5,9,22-30)", "expr" }, POPT_TABLEEND }; volatile int flag_bisect_stop = 0; void stop_bisect(int sig) { /* The signal handler just clears the flag and re-enables itself. */ flag_bisect_stop = 1; signal(sig, stop_bisect); } static int count_nonnulls(const Subset& raw) { unsigned i, count = 0; for (i = 0; i < raw.size(); i++) if (raw[i].value() != NULL) count++; return count; } static void dump_bufr_header(const Rawmsg& rmsg, const BufrBulletin& braw) { printf("Message %d\n", rmsg.index); printf("Size: %zd\n", rmsg.size()); printf("Edition: %d\n", braw.edition); printf("Master table number: %d\n", braw.master_table_number); printf("Centre: %d:%d\n", braw.centre, braw.subcentre); printf("Category: %d:%d:%d\n", braw.type, braw.subtype, braw.localsubtype); printf("Datetime: %04d-%02d-%02d %02d:%02d:%02d\n", braw.rep_year, braw.rep_month, braw.rep_day, braw.rep_hour, braw.rep_minute, braw.rep_second); printf("Tables: %d:%d\n", braw.master_table, braw.local_table); printf("Table: %s\n", braw.btable ? braw.btable->id().c_str() : "(none)"); printf("Compression: %s\n", braw.compression ? "yes" : "no"); printf("Update sequence number: %d\n", braw.update_sequence_number); printf("Optional section length: %d\n", braw.optional_section_length); printf("Subsets: %zd\n\n", braw.subsets.size()); // Copy data descriptor section //for (bufrex_opcode i = orig->datadesc; i != NULL; i = i->next) //DBA_RUN_OR_GOTO(cleanup, bufrex_msg_append_datadesc(msg, i->val)); } static void dump_crex_header(const Rawmsg& rmsg, const CrexBulletin& braw) { printf("Message %d\n", rmsg.index); printf("Size: %zd\n", rmsg.size()); printf("Edition: %d\n", braw.edition); printf("Master table number: %d\n", braw.master_table_number); printf("Category: %d:%d:%d\n", braw.type, braw.subtype, braw.localsubtype); printf("Datetime: %04d-%02d-%02d %02d:%02d:%02d\n", braw.rep_year, braw.rep_month, braw.rep_day, braw.rep_hour, braw.rep_minute, braw.rep_second); printf("Table version: %d\n", braw.table); printf("Table: %s\n", braw.btable ? braw.btable->id().c_str() : "(none)"); printf("Check digit: %s\n\n", braw.has_check_digit ? "yes" : "no"); } static void dump_aof_header(const Rawmsg& rmsg) { int category, subcategory; msg::AOFImporter::get_category(rmsg, &category, &subcategory); /* DBA_RUN_OR_RETURN(bufrex_message_get_vars(msg, &vars, &count)); */ printf("Message %d\n", rmsg.index); printf("Size: %zd\n", rmsg.size()); printf("Category: %d:%d\n\n", category, subcategory); } static void print_bufr_header(const BufrBulletin& braw) { printf(", category %d:%d:%d, table %s, subsets %zd, values:", braw.type, braw.subtype, braw.localsubtype, braw.btable ? braw.btable->id().c_str() : "(none)", braw.subsets.size()); for (size_t i = 0; i < braw.subsets.size(); ++i) printf(" %d/%zd", count_nonnulls(braw.subsets[i]), braw.subsets[i].size()); } static void print_crex_header(const CrexBulletin& braw) { /* DBA_RUN_OR_RETURN(crex_message_has_check_digit(msg, &checkdigit)); */ #if 0 printf("#%d CREX message: %d bytes, category %d, subcategory %d, table %s, %scheck digit, %d/%d values", rmsg->index, size, braw->type, braw->subtype, table_id, /*checkdigit ? "" : "no "*/"? ", count_nonnulls(braw), braw->vars_count); #endif printf(", category %d, subcategory %d, table %s, subsets %zd, values:", braw.type, braw.subtype, braw.btable ? braw.btable->id().c_str() : "(none)", braw.subsets.size()); for (size_t i = 0; i < braw.subsets.size(); ++i) printf(" %d/%zd", count_nonnulls(braw.subsets[i]), braw.subsets[i].size()); } static void print_aof_header(const Rawmsg& rmsg) { int category, subcategory; msg::AOFImporter::get_category(rmsg, &category, &subcategory); printf(", category %d, subcategory %d", category, subcategory); } static void print_item_header(const Item& item) { printf("#%d", item.idx); if (item.rmsg) { printf(" %s message: %zd bytes", encoding_name(item.rmsg->encoding), item.rmsg->size()); switch (item.rmsg->encoding) { case BUFR: if (item.bulletin != NULL) print_bufr_header(*dynamic_cast(item.bulletin)); break; case CREX: if (item.bulletin != NULL) print_crex_header(*dynamic_cast(item.bulletin)); break; case AOF: print_aof_header(*item.rmsg); break; } } else if (item.msgs) { printf(" message: %zd subsets:", item.msgs->size()); string old_type; unsigned count = 0; for (Msgs::const_iterator i = item.msgs->begin(); i != item.msgs->end(); ++i) { Msg& m = **i; string new_type = msg_type_name(m.type); if (old_type.empty()) { old_type = new_type; count = 1; } else if (old_type != new_type) { printf(" %u %s", count, old_type.c_str()); old_type = new_type; count = 1; } else ++count; } printf(" %u %s", count, old_type.c_str()); } } struct Summarise : public cmdline::Action { virtual void operator()(const cmdline::Item& item) { print_item_header(item); puts("."); } }; struct Head : public cmdline::Action { virtual void operator()(const cmdline::Item& item) { if (!item.rmsg) return; switch (item.rmsg->encoding) { case BUFR: if (item.bulletin == NULL) return; dump_bufr_header(*item.rmsg, *dynamic_cast(item.bulletin)); puts("."); break; case CREX: if (item.bulletin == NULL) return; dump_crex_header(*item.rmsg, *dynamic_cast(item.bulletin)); puts("."); break; case AOF: dump_aof_header(*item.rmsg); break; } } }; static void dump_dba_vars(const Subset& msg) { for (size_t i = 0; i < msg.size(); ++i) msg[i].print(stdout); } /** * Print a bulletin in CSV format */ struct CSVBulletin : public cmdline::Action { bool first; CSVBulletin() : first(true) {} void print_var(const Var& var, const Var* parent=0) { char bcode[10]; if (parent) { format_code(parent->code(), bcode); cout << bcode << "."; } format_code(var.code(), bcode); cout << bcode << ","; csv_output_quoted_string(cout, var.format("")); cout << endl; } void print_subsets(const Bulletin& braw) { for (size_t i = 0; i < braw.subsets.size(); ++i) { const Subset& s = braw.subsets[i]; cout << "subset," << i + 1 << endl; for (size_t i = 0; i < s.size(); ++i) { print_var(s[i]); for (const Var* a = s[i].next_attr(); a != NULL; a = a->next_attr()) print_var(*a, &(s[i])); } } } virtual void operator()(const cmdline::Item& item) { if (!item.rmsg) return; if (first) { // Column titles cout << "Field,Value" << endl; first = false; } switch (item.rmsg->encoding) { case BUFR: case CREX: { if (item.bulletin == NULL) return; cout << "edition," << item.bulletin->edition << endl; cout << "master_table_number," << item.bulletin->master_table_number << endl; cout << "type," << item.bulletin->type << endl; cout << "subtype," << item.bulletin->subtype << endl; cout << "localsubtype," << item.bulletin->localsubtype << endl; cout << "date," << setfill('0') << setw(4) << item.bulletin->rep_year << "-" << setfill('0') << setw(2) << item.bulletin->rep_month << "-" << setfill('0') << setw(2) << item.bulletin->rep_day << " " << setfill('0') << setw(2) << item.bulletin->rep_hour << ":" << setfill('0') << setw(2) << item.bulletin->rep_minute << ":" << setfill('0') << setw(2) << item.bulletin->rep_second << "," << endl; if (const BufrBulletin* b = dynamic_cast(item.bulletin)) { cout << "centre," << b->centre << endl; cout << "subcentre," << b->subcentre << endl; cout << "master_table," << b->master_table << endl; cout << "local_table," << b->local_table << endl; cout << "compression," << b->compression << endl; cout << "update_sequence_number," << b->update_sequence_number << endl; cout << "optional_section_length," << b->optional_section_length << endl; // TODO: how to encode optional section? base64? } else if (const CrexBulletin* b = dynamic_cast(item.bulletin)) { cout << "table," << b->table << endl; cout << "has_check_digit," << b->has_check_digit << endl; } print_subsets(*item.bulletin); break; } default: throw error_consistency("encoding not supported for CSV dump"); } } }; /** * Print a Msgs in CSV format */ struct CSVMsgs : public cmdline::Action { bool first; CSVMsgs() : first(true) {} virtual void operator()(const cmdline::Item& item) { if (!item.msgs) return; if (first) { Msg::csv_header(cout); first = false; } for (Msgs::const_iterator mi = item.msgs->begin(); mi != item.msgs->end(); ++mi) { (*mi)->to_csv(cout); } } }; struct DumpMessage : public cmdline::Action { void print_subsets(const Bulletin& braw) { for (size_t i = 0; i < braw.subsets.size(); ++i) { printf("Subset %zd:\n", i); dump_dba_vars(braw.subsets[i]); } } virtual void operator()(const cmdline::Item& item) { print_item_header(item); if (!item.rmsg) { puts(": no low-level information available"); return; } puts(":"); switch (item.rmsg->encoding) { case BUFR: { if (item.bulletin == NULL) return; const BufrBulletin& b = *dynamic_cast(item.bulletin); printf(" Edition %d, mtn %d, origin %d/%d, master table %d, local table %d\n", b.edition, b.master_table_number, b.centre, b.subcentre, b.master_table, b.local_table); print_subsets(*item.bulletin); break; } case CREX: { if (item.bulletin == NULL) return; const CrexBulletin& b = *dynamic_cast(item.bulletin); printf(" Edition %d, mtn %d, table %d\n", b.edition, b.master_table_number, b.table); print_subsets(*item.bulletin); break; } case AOF: msg::AOFImporter::dump(*item.rmsg, stdout); break; } } }; struct DumpCooked : public cmdline::Action { virtual void operator()(const cmdline::Item& item) { if (item.msgs == NULL) return; for (size_t i = 0; i < item.msgs->size(); ++i) { printf("#%d[%zd] ", item.idx, i); (*item.msgs)[i]->print(stdout); } } }; static void print_var(const Var& var) { printf("B%02d%03d", WR_VAR_X(var.code()), WR_VAR_Y(var.code())); if (var.value() != NULL) { if (var.info()->is_string()) { printf(" %s\n", var.value()); } else { double value = var.enqd();; printf(" %.*f\n", var.info()->scale > 0 ? var.info()->scale : 0, value); } } else printf("\n"); } struct DumpText : public cmdline::Action { virtual void operator()(const cmdline::Item& item) { if (item.bulletin == NULL) throw error_consistency("source is not a BUFR or CREX message"); const BufrBulletin* b = dynamic_cast(item.bulletin); if (!b) throw error_consistency("source is not BUFR"); printf("Edition: %d\n", b->edition); printf("Type: %d\n", b->type); printf("Subtype: %d\n", b->subtype); printf("Localsubtype: %d\n", b->localsubtype); printf("Centre: %d\n", b->centre); printf("Subcentre: %d\n", b->subcentre); printf("Mastertable: %d\n", b->master_table); printf("Localtable: %d\n", b->local_table); printf("Compression: %d\n", b->compression); printf("Reftime: %04d-%02d-%02d %02d:%02d:%02d\n", b->rep_year, b->rep_month, b->rep_day, b->rep_hour, b->rep_minute, b->rep_second); printf("Descriptors:"); for (vector::const_iterator i = b->datadesc.begin(); i != b->datadesc.end(); ++i) { char type; switch (WR_VAR_F(*i)) { case 0: type = 'B'; break; case 1: type = 'R'; break; case 2: type = 'C'; break; case 3: type = 'D'; break; default: type = '?'; break; } printf(" %c%02d%03d", type, WR_VAR_X(*i), WR_VAR_Y(*i)); } printf("\n"); for (size_t i = 0; i < b->subsets.size(); ++i) { const Subset& subset = b->subsets[i]; printf("Data:\n"); for (size_t j = 0; j < subset.size(); ++j) { const Var& var = subset[j]; printf(" "); print_var(var); for (const Var* attr = var.next_attr(); attr; attr = attr->next_attr()) { printf(" *"); print_var(*attr); } } } } }; struct DumpStructured : public cmdline::Action { virtual void operator()(const cmdline::Item& item) { print_item_header(item); if (!item.rmsg) { puts(": no low-level information available"); return; } if (!item.bulletin) { puts(": no bulletin information available"); return; } puts(":"); item.bulletin->print_structured(stdout); } }; struct DumpDDS : public cmdline::Action { virtual void operator()(const cmdline::Item& item) { print_item_header(item); if (!item.rmsg) { puts(": no low-level information available"); return; } if (!item.bulletin) { puts(": no bulletin information available"); return; } puts(":"); item.bulletin->print_datadesc(stdout); } }; struct WriteRaw : public cmdline::Action { File* file; WriteRaw() : file(0) {} ~WriteRaw() { if (file) delete file; } virtual void operator()(const cmdline::Item& item) { if (!item.rmsg) return; if (!file) file = File::create(item.rmsg->encoding, "(stdout)", "w").release(); file->write(*item.rmsg); } }; int do_scan(poptContext optCon) { /* Throw away the command name */ poptGetArg(optCon); Record query; if (dba_cmdline_get_query(optCon, query) > 0) reader.filter.matcher_from_record(query); Summarise s; reader.read(get_filenames(optCon), s); return 0; } int do_head(poptContext optCon) { /* Throw away the command name */ poptGetArg(optCon); Record query; if (dba_cmdline_get_query(optCon, query) > 0) reader.filter.matcher_from_record(query); Head head; reader.read(get_filenames(optCon), head); return 0; } int do_dump(poptContext optCon) { auto_ptr action; if (op_dump_csv) { if (op_dump_interpreted) action.reset(new CSVMsgs); else action.reset(new CSVBulletin); } else if (op_dump_interpreted) action.reset(new DumpCooked); else if (op_dump_text) action.reset(new DumpText); else if (op_dump_structured) action.reset(new DumpStructured); else if (op_dump_dds) action.reset(new DumpDDS); else action.reset(new DumpMessage); /* Throw away the command name */ poptGetArg(optCon); if (op_precise_import) reader.import_opts.simplified = false; Record query; if (dba_cmdline_get_query(optCon, query) > 0) reader.filter.matcher_from_record(query); reader.read(get_filenames(optCon), *action); return 0; } int do_cat(poptContext optCon) { /* Throw away the command name */ poptGetArg(optCon); Record query; if (dba_cmdline_get_query(optCon, query) > 0) reader.filter.matcher_from_record(query); /*DBA_RUN_OR_RETURN(aof_file_write_header(file, 0, 0)); */ WriteRaw wraw; reader.read(get_filenames(optCon), wraw); return 0; } struct StoreMessages : public cmdline::Action, public vector { virtual void operator()(const Rawmsg& rmsg, const wreport::Bulletin*, const Msgs*) { push_back(rmsg); } }; #if 0 static dba_err bisect_test(struct message_vector* vec, size_t first, size_t last, int* fails) { FILE* out = popen(op_bisect_cmd, "w"); int res; for (; first < last; ++first) { dba_rawmsg msg = vec->messages[first]; if (fwrite(msg->buf, msg->len, 1, out) == 0) return dba_error_system("writing message %d to test script", msg->index); } res = pclose(out); if (res == -1) return dba_error_system("running test script", first); *fails = (res != 0); return dba_error_ok(); } struct bisect_candidate { size_t first; size_t last; }; static dba_err bisect( struct bisect_candidate* cand, struct message_vector* vec, size_t first, size_t last) { int fails = 0; /* If we already narrowed it down to 1 messages, there is no need to test * further */ if (flag_bisect_stop || cand->last == cand->first + 1) return dba_error_ok(); if (op_verbose) fprintf(stderr, "Trying messages %zd-%zd (%zd selected, kill -HUP %d to stop)... ", first, last, cand->last - cand->first, getpid()); DBA_RUN_OR_RETURN(bisect_test(vec, first, last, &fails)); if (op_verbose) fprintf(stderr, fails ? "fail.\n" : "ok.\n"); if (fails) { size_t mid = (first + last) / 2; if (last-first < cand->last - cand->first) { cand->last = last; cand->first = first; } if (first < mid && mid != last) DBA_RUN_OR_RETURN(bisect(cand, vec, first, mid)); if (mid < last && mid != first) DBA_RUN_OR_RETURN(bisect(cand, vec, mid, last)); } return dba_error_ok(); } #endif int do_bisect(poptContext optCon) { #if 0 struct message_vector vec = { 0, 0, 0 }; struct bisect_candidate candidate; int old_op_verbose = op_verbose; size_t i; /* Throw away the command name */ poptGetArg(optCon); if (op_bisect_cmd == NULL) return dba_error_consistency("you need to use --test=command"); /* Read all input messages a vector of dba_rawmsg */ op_verbose = 0; DBA_RUN_OR_RETURN(process_all(optCon, dba_cmdline_stringToMsgType(reader.input_type, optCon), &reader.filter, store_messages, &vec)); op_verbose = old_op_verbose; /* Establish a handler for SIGHUP signals. */ signal(SIGHUP, stop_bisect); /* Bisect working on the vector */ candidate.first = 0; candidate.last = vec.len; DBA_RUN_OR_RETURN(bisect(&candidate, &vec, candidate.first, candidate.last)); if (op_verbose) { if (flag_bisect_stop) fprintf(stderr, "Stopped by SIGHUP.\n"); fprintf(stderr, "Selected messages %zd-%zd.\n", candidate.first, candidate.last); } /* Output the candidate messages */ for (; candidate.first < candidate.last; ++candidate.first) { dba_rawmsg msg = vec.messages[candidate.first]; if (fwrite(msg->buf, msg->len, 1, stdout) == 0) return dba_error_system("writing message %d to standard output", msg->index); } for (i = 0; i < vec.len; ++i) dba_rawmsg_delete(vec.messages[i]); free(vec.messages); return dba_error_ok(); #endif throw error_unimplemented("bisect is currently not implemented"); } int do_convert(poptContext optCon) { msg::Exporter::Options opts; cmdline::Converter conv; /* Throw away the command name */ poptGetArg(optCon); if (strcmp(op_output_template, "list") == 0) { list_templates(); return 0; } Record query; if (dba_cmdline_get_query(optCon, query) > 0) reader.filter.matcher_from_record(query); if (op_precise_import) reader.import_opts.simplified = false; Encoding outtype = dba_cmdline_stringToMsgType(op_output_type); if (op_report[0] != 0) conv.dest_rep_memo = op_report; else conv.dest_rep_memo = NULL; if (op_output_template[0] != 0) { conv.dest_template = op_output_template; opts.template_name = op_output_template; } conv.recompute_categories = op_recompute_categories != 0; conv.file = File::create(outtype, "(stdout)", "w").release(); conv.exporter = msg::Exporter::create(outtype, opts).release(); reader.read(get_filenames(optCon), conv); return 0; } int do_compare(poptContext optCon) { /* Throw away the command name */ poptGetArg(optCon); /* Read the file names */ const char* file1_name = poptGetArg(optCon); if (file1_name == NULL) dba_cmdline_error(optCon, "input file needs to be specified"); const char* file2_name = poptGetArg(optCon); if (file2_name == NULL) file2_name = "(stdin)"; Encoding in_type = dba_cmdline_stringToMsgType(reader.input_type); Encoding out_type = dba_cmdline_stringToMsgType(op_output_type); File* file1 = File::create(in_type, file1_name, "r").release(); File* file2 = File::create(out_type, file2_name, "r").release(); std::auto_ptr importer = msg::Importer::create(in_type); std::auto_ptr exporter = msg::Exporter::create(out_type); size_t idx = 0; for ( ; ; ++idx) { ++idx; Rawmsg msg1; Rawmsg msg2; bool found1 = file1->read(msg1); bool found2 = file2->read(msg2); if (found1 != found2) throw error_consistency("The files contain a different number of messages"); if (!found1 && !found2) break; Msgs msgs1; Msgs msgs2; importer->from_rawmsg(msg1, msgs1); importer->from_rawmsg(msg2, msgs2); notes::Collect c(cerr); int diffs = msgs1.diff(msgs2); if (diffs > 0) error_consistency::throwf("Messages #%zd contain %d differences", idx, diffs); } if (idx == 0) throw error_consistency("The files do not contain messages"); return 0; } int do_fixaof(poptContext optCon) { /* Throw away the command name */ poptGetArg(optCon); int count = 0; while (const char* filename = poptGetArg(optCon)) { auto_ptr file = File::create(AOF, filename, "rb+"); AofFile* aoffile = dynamic_cast(file.get()); aoffile->fix_header(); ++count; } if (count == 0) dba_cmdline_error(optCon, "at least one input file needs to be specified"); return 0; } #if 0 static dba_err readfield(FILE* in, char** name, char** value) { static char line[1000]; char* s; if (fgets(line, 1000, in) == NULL) { *name = *value = NULL; return dba_error_ok(); } s = strchr(line, ':'); if (s == NULL) { *name = NULL; *value = line; } else { *s = 0; *name = line; *value = s + 1; } if (*value) { int len; /* Trim value */ while (**value && isspace(**value)) ++*value; len = strlen(*value); while (len > 0 && isspace((*value)[len-1])) { --len; (*value)[len] = 0; } } return dba_error_ok(); } #endif #if 0 static dba_err parsetextgrib(FILE* in, bufrex_msg msg, int* found) { dba_err err = DBA_OK; bufrex_subset subset = NULL; char* name; char* value; dba_var var = NULL; *found = 0; bufrex_msg_reset(msg); while (1) { DBA_RUN_OR_GOTO(cleanup, readfield(in, &name, &value)); /* fprintf(stderr, "GOT NAME %s VALUE \"%s\"\n", name, value); */ if (name != NULL) { if (strcasecmp(name, "edition") == 0) { msg->edition = strtoul(value, 0, 10); } else if (strcasecmp(name, "type") == 0) { msg->type = strtoul(value, 0, 10); } else if (strcasecmp(name, "subtype") == 0) { msg->subtype = strtoul(value, 0, 10); } else if (strcasecmp(name, "localsubtype") == 0) { msg->localsubtype = strtoul(value, 0, 10); } else if (strcasecmp(name, "centre") == 0) { msg->opt.bufr.centre = strtoul(value, 0, 10); } else if (strcasecmp(name, "subcentre") == 0) { msg->opt.bufr.subcentre = strtoul(value, 0, 10); } else if (strcasecmp(name, "mastertable") == 0) { msg->opt.bufr.master_table = strtoul(value, 0, 10); } else if (strcasecmp(name, "localtable") == 0) { msg->opt.bufr.local_table = strtoul(value, 0, 10); } else if (strcasecmp(name, "compression") == 0) { msg->opt.bufr.compression = strtoul(value, 0, 10); } else if (strcasecmp(name, "reftime") == 0) { if (sscanf(value, "%04d-%02d-%02d %02d:%02d:%02d", &msg->rep_year, &msg->rep_month, &msg->rep_day, &msg->rep_hour, &msg->rep_minute, &msg->rep_second) != 6) return dba_error_consistency("Reference time \"%s\" cannot be parsed", value); } else if (strcasecmp(name, "descriptors") == 0) { const char* s = value; DBA_RUN_OR_GOTO(cleanup, bufrex_msg_load_tables(msg)); while (1) { size_t size = strcspn(s, " \t"); s += size; size = strspn(s, "BCDR0123456789"); if (size == 0) break; else DBA_RUN_OR_GOTO(cleanup, bufrex_msg_append_datadesc(msg, dba_descriptor_code(s))); } } else if (strcasecmp(name, "data") == 0) { /* Start a new subset */ DBA_RUN_OR_GOTO(cleanup, bufrex_msg_get_subset(msg, msg->subsets_count, &subset)); *found = 1; } } else if (value != NULL) { dba_varinfo info; int isattr = 0; dba_varcode code; if (value[0] == 0) /* End of one message */ break; /* Read a Bsomething (value or attribute) and append it to the subset */ if (value[0] == '*') { isattr = 1; ++value; } code = dba_descriptor_code(value); DBA_RUN_OR_GOTO(cleanup, bufrex_msg_query_btable(msg, code, &info)); while (*value && !isspace(*value)) ++value; while (*value && isspace(*value)) ++value; if (*value == 0) { /* Undef */ DBA_RUN_OR_GOTO(cleanup, dba_var_create(info, &var)); } else { if (VARINFO_IS_STRING(info)) { DBA_RUN_OR_GOTO(cleanup, dba_var_createc(info, value, &var)); } else { DBA_RUN_OR_GOTO(cleanup, dba_var_created(info, strtod(value, NULL), &var)); } } if (isattr) { DBA_RUN_OR_GOTO(cleanup, bufrex_subset_add_attr(subset, var)); dba_var_delete(var); } else { DBA_RUN_OR_GOTO(cleanup, bufrex_subset_store_variable(subset, var)); } var = NULL; } else { /* End of input */ break; } } cleanup: if (var) dba_var_delete(var); return err == DBA_OK ? dba_error_ok() : err; } #endif int do_makebufr(poptContext optCon) { throw error_unimplemented("makebufr not implemented"); #if 0 dba_err err = DBA_OK; bufrex_msg msg = NULL; dba_rawmsg rmsg = NULL; dba_file outfile = NULL; const char* filename; FILE* in = NULL; int count = 0; DBA_RUN_OR_RETURN(bufrex_msg_create(BUFREX_BUFR, &msg)); DBA_RUN_OR_GOTO(cleanup, dba_file_create(BUFR, "(stdout)", "w", &outfile)); /* Throw away the command name */ poptGetArg(optCon); while ((filename = poptGetArg(optCon)) != NULL) { int found; in = fopen(filename, "r"); if (in == NULL) { err = dba_error_system("opening file %s", filename); goto cleanup; } while (1) { DBA_RUN_OR_GOTO(cleanup, parsetextgrib(in, msg, &found)); if (found) { DBA_RUN_OR_GOTO(cleanup, bufrex_msg_encode(msg, &rmsg)); DBA_RUN_OR_GOTO(cleanup, dba_file_write(outfile, rmsg)); dba_rawmsg_delete(rmsg); rmsg = NULL; } else break; } fclose(in); in = NULL; ++count; } if (count == 0) dba_cmdline_error(optCon, "at least one input file needs to be specified"); cleanup: if (in != NULL) fclose(in); if (msg) bufrex_msg_delete(msg); if (rmsg) dba_rawmsg_delete(rmsg); if (outfile) dba_file_delete(outfile); return err == DBA_OK ? dba_error_ok() : err; #endif return 0; } static struct tool_desc dbamsg; struct poptOption dbamsg_scan_options[] = { { "help", '?', 0, 0, 1, "print an help message", 0 }, { "verbose", 0, POPT_ARG_NONE, &op_verbose, 0, "verbose output", 0 }, { "type", 't', POPT_ARG_STRING, &reader.input_type, 0, "format of the input data ('bufr', 'crex', 'aof')", "type" }, { NULL, 0, POPT_ARG_INCLUDE_TABLE, &grepTable, 0, "Options used to filter messages", 0 }, POPT_TABLEEND }; struct poptOption dbamsg_dump_options[] = { { "help", '?', 0, 0, 1, "print an help message", 0 }, { "verbose", 0, POPT_ARG_NONE, &op_verbose, 0, "verbose output", 0 }, { "type", 't', POPT_ARG_STRING, &reader.input_type, 0, "format of the unput data ('bufr', 'crex', 'aof')", "type" }, { "interpreted", 0, 0, &op_dump_interpreted, 0, "dump the message as understood by the importer", 0 }, { "precise", 0, 0, &op_precise_import, 0, "import messages using precise contexts instead of standard ones", 0 }, { "text", 0, 0, &op_dump_text, 0, "dump as text that can be processed by dbamsg makebufr", 0 }, { "csv", 0, 0, &op_dump_csv, 0, "dump in machine readable CSV format", 0 }, { "dds", 0, 0, &op_dump_dds, 0, "dump structure of data description section", 0 }, { "structured", 0, 0, &op_dump_structured, 0, "structured dump of the message contents", 0 }, { NULL, 0, POPT_ARG_INCLUDE_TABLE, &grepTable, 0, "Options used to filter messages", 0 }, POPT_TABLEEND }; struct poptOption dbamsg_cat_options[] = { { "help", '?', 0, 0, 1, "print an help message", 0 }, { "verbose", 0, POPT_ARG_NONE, &op_verbose, 0, "verbose output", 0 }, { "type", 't', POPT_ARG_STRING, &reader.input_type, 0, "format of the input data ('bufr', 'crex', 'aof')", "type" }, { NULL, 0, POPT_ARG_INCLUDE_TABLE, &grepTable, 0, "Options used to filter messages", 0 }, POPT_TABLEEND }; struct poptOption dbamsg_convert_options[] = { { "help", '?', 0, 0, 1, "print an help message", 0 }, { "verbose", 0, POPT_ARG_NONE, &op_verbose, 0, "verbose output", 0 }, { "type", 't', POPT_ARG_STRING, &reader.input_type, 0, "format of the input data ('bufr', 'crex', 'aof', 'csv')", "type" }, { "dest", 'd', POPT_ARG_STRING, &op_output_type, 0, "format of the data in output ('bufr', 'crex', 'aof')", "type" }, { "template", 0, POPT_ARG_STRING, &op_output_template, 0, "template of the data in output (autoselect if not specified, 'list' gives a list)", "name" }, { "report", 'r', POPT_ARG_STRING, &op_report, 0, "force output data to be of this type of report", "rep_memo" }, { "precise", 0, 0, &op_precise_import, 0, "import messages using precise contexts instead of standard ones", 0 }, { "recompute-categories", 0, 0, &op_recompute_categories, 0, "recompute data categories and subcategories according to message contents", 0 }, { NULL, 0, POPT_ARG_INCLUDE_TABLE, &grepTable, 0, "Options used to filter messages", 0 }, POPT_TABLEEND }; struct poptOption dbamsg_compare_options[] = { { "help", '?', 0, 0, 1, "print an help message", 0 }, { "verbose", 0, POPT_ARG_NONE, &op_verbose, 0, "verbose output", 0 }, { "type1", 't', POPT_ARG_STRING, &reader.input_type, 0, "format of the first file to compare ('bufr', 'crex', 'aof')", "type" }, { "type2", 'd', POPT_ARG_STRING, &op_output_type, 0, "format of the second file to compare ('bufr', 'crex', 'aof')", "type" }, { NULL, 0, POPT_ARG_INCLUDE_TABLE, &grepTable, 0, "Options used to filter messages", 0 }, POPT_TABLEEND }; struct poptOption dbamsg_fixaof_options[] = { { "help", '?', 0, 0, 1, "print an help message", 0 }, { "verbose", 0, POPT_ARG_NONE, &op_verbose, 0, "verbose output", 0 }, POPT_TABLEEND }; struct poptOption dbamsg_makebufr_options[] = { { "help", '?', 0, 0, 1, "print an help message", 0 }, { "verbose", 0, POPT_ARG_NONE, &op_verbose, 0, "verbose output", 0 }, POPT_TABLEEND }; struct poptOption dbamsg_bisect_options[] = { { "help", '?', 0, 0, 1, "print an help message", 0 }, { "verbose", 0, POPT_ARG_NONE, &op_verbose, 0, "verbose output", 0 }, { "test", 0, POPT_ARG_STRING, &op_bisect_cmd, 0, "command to run to test a message group", "cmd" }, { "type", 't', POPT_ARG_STRING, &reader.input_type, 0, "format of the input data ('bufr', 'crex', 'aof')", "type" }, { NULL, 0, POPT_ARG_INCLUDE_TABLE, &grepTable, 0, "Options used to filter messages", 0 }, POPT_TABLEEND }; static void init() { dbamsg.desc = "Work with encoded meteorological data"; dbamsg.longdesc = "Examine, dump and convert files containing meteorological data. " "It supports observations encoded in BUFR, CREX and AOF formats"; dbamsg.ops = (struct op_dispatch_table*)calloc(11, sizeof(struct op_dispatch_table)); dbamsg.ops[0].func = do_scan; dbamsg.ops[0].aliases[0] = "scan"; dbamsg.ops[0].usage = "scan [options] [filter] filename [filename [...]]"; dbamsg.ops[0].desc = "Summarise the contents of a file with meteorological data"; dbamsg.ops[0].longdesc = NULL; dbamsg.ops[0].optable = dbamsg_scan_options; dbamsg.ops[1].func = do_dump; dbamsg.ops[1].aliases[0] = "dump"; dbamsg.ops[1].usage = "dump [options] [filter] filename [filename [...]]"; dbamsg.ops[1].desc = "Dump the contents of a file with meteorological data"; dbamsg.ops[1].longdesc = NULL; dbamsg.ops[1].optable = dbamsg_dump_options; dbamsg.ops[2].func = do_cat; dbamsg.ops[2].aliases[0] = "cat"; dbamsg.ops[2].usage = "cat [options] [filter] filename [filename [...]]"; dbamsg.ops[2].desc = "Dump the raw data of a file with meteorological data"; dbamsg.ops[2].longdesc = NULL; dbamsg.ops[2].optable = dbamsg_cat_options; dbamsg.ops[3].func = do_convert; dbamsg.ops[3].aliases[0] = "convert"; dbamsg.ops[3].aliases[1] = "conv"; dbamsg.ops[3].usage = "convert [options] [filter] filename [filename [...]]"; dbamsg.ops[3].desc = "Convert meteorological data between different formats"; dbamsg.ops[3].longdesc = NULL; dbamsg.ops[3].optable = dbamsg_convert_options; dbamsg.ops[4].func = do_compare; dbamsg.ops[4].aliases[0] = "compare"; dbamsg.ops[4].aliases[1] = "cmp"; dbamsg.ops[4].usage = "compare [options] filename1 [filename2]"; dbamsg.ops[4].desc = "Compare two files with meteorological data"; dbamsg.ops[4].longdesc = NULL; dbamsg.ops[4].optable = dbamsg_compare_options; dbamsg.ops[5].func = do_fixaof; dbamsg.ops[5].aliases[0] = "fixaof"; dbamsg.ops[5].usage = "fixaof [options] filename [filename1 [...]]]"; dbamsg.ops[5].desc = "Recomputes the start and end of observation period in the headers of the given AOF files"; dbamsg.ops[5].longdesc = NULL; dbamsg.ops[5].optable = dbamsg_fixaof_options; dbamsg.ops[6].func = do_makebufr; dbamsg.ops[6].aliases[0] = "makebufr"; dbamsg.ops[6].aliases[1] = "mkbufr"; dbamsg.ops[6].usage = "makebufr [options] filename [filename1 [...]]]"; dbamsg.ops[6].desc = "Read a simple description of a BUFR file and output the BUFR file."; dbamsg.ops[6].longdesc = "Read a simple description of a BUFR file and output the BUFR file. This only works for simple BUFR messages without attributes encoded with data present bitmaps"; dbamsg.ops[6].optable = dbamsg_makebufr_options; dbamsg.ops[7].func = do_bisect; dbamsg.ops[7].aliases[0] = "bisect"; dbamsg.ops[7].usage = "bisect [options] --test=testscript filename"; dbamsg.ops[7].desc = "Bisect filename and output the minimum subsequence found for which testscript fails."; dbamsg.ops[7].longdesc = "Run testscript passing parts of filename on its stdin and checking the return code. Then divide the input in half and try on each half. Keep going until testscript does not fail in any portion of the file. Output to stdout the smallest portion for which testscript fails. This is useful to isolate the few messages in a file that cause problems"; dbamsg.ops[7].optable = dbamsg_bisect_options; dbamsg.ops[8].func = do_head; dbamsg.ops[8].aliases[0] = "head"; dbamsg.ops[8].usage = "head [options] [filter] filename [filename [...]]"; dbamsg.ops[8].desc = "Dump the contents of the header of a file with meteorological data"; dbamsg.ops[8].longdesc = NULL; dbamsg.ops[8].optable = dbamsg_scan_options; dbamsg.ops[9].func = NULL; dbamsg.ops[9].usage = NULL; dbamsg.ops[9].desc = NULL; dbamsg.ops[9].longdesc = NULL; dbamsg.ops[9].optable = NULL; }; static struct program_info proginfo = { "dbamsg", "Here are some example invocations of \\fBdbamsg\\fP:\n" ".P\n" ".nf\n" " # Convert an AOF message to BUFR\n" " dbamsg convert file.aof > file.bufr\n" "\n" " # Convert a BUFR message to CREX\n" " dbamsg convert file.bufr -d crex > file.crex\n" "\n" " # Convert BUFR messages to CREX, but skip all those not in january 2010\n" " dbamsg convert year=2010 month=1 file.bufr -d crex > file.crex\n" "\n" " # Dump the content of a message, as they are in the message\n" " dbamsg dump file.bufr\n" "\n" " # Dump the content of a message, interpreted as physical quantities\n" " dbamsg dump --interpreted file.bufr\n" ".fi\n" , NULL, NULL }; int main (int argc, const char* argv[]) { int res; init(); res = dba_cmdline_dispatch_main(&proginfo, &dbamsg, argc, argv); return res; } /* vim:set ts=4 sw=4: */ dballe-5.18/UPGRADE-5.x0000644000175000017500000000713611634672332011253 00000000000000This is a summary of changes from DB-All.e 4.x that might require porting of Fortran code, or scripts using the command line tools, even if the Fortran API and the command line interfaces did not change. Changes in tables: * Tables are now in /usr/share/wreport * Table location can be customized with two environment variables: WREPORT_TABLES=(colon separated list of directories) The primary location(s) of tables. It has a compiled in default if it is not set. WREPORT_EXTRA_TABLES=(colon separated list of directories) Extra location(s) of tables. It is ignored if not set. The reason for having two variables is in their use: if you want to override the compiled in default, set WREPORT_TABLES. If you want to add tables to the compiled-in default, set WREPORT_EXTRA_TABLES. * Generic BUFR messages now use table B000000002001400.txt instead of B000000002001200.txt Local B table changes to follow the new WMO templates: * B12001 is replaced by B12101 * B12003 is replaced by B12103 * B10061 is replaced by B10060 * B10003 is replaced by B10008 Added to local B table: * B02003 TYPE OF MEASURING EQUIPMENT USED * B02004 TYPE OF INSTRUMENTATION FOR EVAPORATION MEASUREMENT OR TYPE OF C * B02013 SOLAR AND INFRARED RADIATION CORRECTION * B02014 TRACKING TECHNIQUE/STATUS OF SYSTEM USED * B04086 LONG TIME PERIOD OR DISPLACEMENT * B05015 LATITUDE DISPLACEMENT (HIGH ACCURACY) * B06015 LONGITUDE DISPLACEMENT (HIGH ACCURACY) * B07007 HEIGHT * B08002 VERTICAL SIGNIFICANCE (SURFACE OBSERVATIONS) * B08042 EXTENDED VERTICAL SOUNDING SIGNIFICANCE * B11043 MAXIMUM WIND GUST DIRECTION * B11061 ABSOLUTE WIND SHEAR IN 1 KM LAYER BELOW * B11062 ABSOLUTE WIND SHEAR IN 1 KM LAYER ABOVE * B12121 GROUND MINIMUM TEMPERATURE * B13033 EVAPORATION/EVAPOTRANSPIRATION * B14031 TOTAL SUNSHINE * B20017 CLOUD TOP DESCRIPTION Changes in levels and time ranges: * Meaningless level or timerange components now have a proper missing value instead of 0. The station level, for example, is now level 257,-,-,- and time range -,-,- * All cloud levels have been reorganised. For clouds levels, leveltype1 is always 256 and l1 is always missing. The cloud level is identified by leveltype2 and l2, as follows: Leveltype2 Description 258 Cloud Data group, L2 = 1 low clouds, 2 middle clouds, 3 high clouds, 0 others 259 Individual cloud groups, L2 = group number 260 Cloud drift, L2 = group number 261 Cloud elevation, L2 = group number 262 Direction and elevation of clouds, L2 is ignored Command line tools changes: * dbamsg dump does not show attributes trailing at the end of the message dump, but it only shows them attached to their variables. * dbamsg dump now also shows data present bitmaps as a Cxxyyy variable with a string value of '-' when the bitmap has 'missing' and '+' when the bitmap has a value. Miscellaneous changes: * bound checking of variable values now uses the most restrictive range between BUFR and CREX (it used to use the least restrictive) * The minimal MySQL versione should be 5.1, or one that supports subqueries, to adapt to newer MySQLs dropping the old custom semanthics of GROUP BY … HAVING … * vertical significance of synop clouds is now imported as a measured value * importing messages with a sensor, barometer or anemometer height indicators will now by default import the values in the appropriate vertical level. An option will be soon provided for 'simplified' imports, whereby data are imported in standard levels with the correct height added as an attribute. dballe-5.18/fortran/0000755000175000017500000000000011754670141011354 500000000000000dballe-5.18/fortran/check_fdballe.f900000644000175000017500000001660511446645317014357 00000000000000 program check_fdballe ! ***************************************** ! * Test suite for DBALLE Fortran bindings ! ***************************************** use dbtest include "dballef.h" integer :: dbahandle, handle,i,i1,i2,i3,i4,i5,i6,ival,saved_id real :: rval double precision :: dval character (len=10) :: param character (len=255) :: cval external :: testcb ! call fdba_error_set_callback(0, testcb, 2, i) ! Database login call dbinit(dbahandle) ! Open a session call idba_preparati(dbahandle, handle, "write", "write", "write") call ensure_no_error("preparati") ! Clear the database call idba_scopa(handle, "") call ensure_no_error("scopa") ! Insert some data call idba_setd(handle, "lat", 30D00) call ensure_no_error("setd 0") call idba_setr(handle, "lon", 10.0) call ensure_no_error("setr 1") call idba_setc(handle, "mobile", "0") call ensure_no_error("setc 2") ! { "year_ident", "2003" }, ! { "month_ident", "3" }, ! { "day_ident", "23" }, ! { "hour_ident", "12" }, ! { "min_ident", "30" }, ! { "height", "42" }, ! { "heightbaro", "234" }, ! { "block", "1" }, ! { "station", "52" }, ! { "name", "Cippo Lippo" }, call idba_seti(handle, "year", 2006) call ensure_no_error("seti 3") call idba_seti(handle, "month", 1) call ensure_no_error("seti 4") call idba_seti(handle, "day", 2) call ensure_no_error("seti 5") call idba_seti(handle, "hour", 3) call ensure_no_error("seti 6") call idba_seti(handle, "min", 4) call ensure_no_error("seti 7") call idba_setc(handle, "leveltype1", "1") call ensure_no_error("setc 8") call idba_seti(handle, "l1", 1) call ensure_no_error("seti 9") call idba_setc(handle, "leveltype2", "1") call ensure_no_error("seti 10") call idba_seti(handle, "l2", 1) call ensure_no_error("seti 11") call idba_seti(handle, "pindicator", 20) call ensure_no_error("seti 12") call idba_seti(handle, "p1", 1) call ensure_no_error("seti 13") call idba_seti(handle, "p2", 1) call ensure_no_error("seti 14") call idba_seti(handle, "rep_cod", 1) call ensure_no_error("seti 15") call idba_setc(handle, "B01011", "DB-All.e!") call ensure_no_error("setc 16") ! Perform the insert call idba_prendilo(handle) call ensure_no_error("first prendilo") ! Try to read the id of the pseudoana data just inserted call idba_enqi(handle, "ana_id", i) call ensure_no_error("enqi ana_id") ! Try to read the context id of the data just inserted call idba_enqi(handle, "context_id", i) call ensure_no_error("enqi context_id") ! Insert some QC flags call idba_setc(handle, "*B33002", "1") call ensure_no_error("critica setc 0") call idba_setc(handle, "*B33003", "t") call ensure_no_error("critica setc 1") call idba_setc(handle, "*var", "B01011") call idba_critica(handle) ! call idba_critica(handle, "B01011") call ensure_no_error("prima critica") ! Query back the data ! call idba_ricominciamo(handle) call idba_unsetall(handle) call ensure_no_error("ricominciamo") call idba_setr(handle, "latmin", 20.0) call ensure_no_error("query setf 0") call idba_setr(handle, "latmax", 50.0) call ensure_no_error("query setf 1") call idba_setr(handle, "lonmin", 5.0) call ensure_no_error("query setf 2") call idba_setr(handle, "lonmax", 20.0) call ensure_no_error("query setf 3") call idba_voglioquesto(handle, i) call ensure_no_error("voglioquesto") call ensure("voglioquesto result", i.eq.1) ! Read the results of the query ! TODO: make a for loop instead do while (i.gt.0) call idba_dammelo(handle, param) call ensure_no_error("dammelo") call idba_enqc(handle, param, cval) call ensure_no_error("dammelo enqc 0") call idba_enqi(handle, "year", ival) call ensure_no_error("dammelo enqi 1") call idba_enqr(handle, "lat", rval) call ensure_no_error("dammelo enqr 2") call idba_enqd(handle, "lon", dval) call ensure_no_error("dammelo enqd 3") call idba_enqc(handle, "lon", cval) call ensure_no_error("dammelo enqc 4") call idba_enqdate(handle, i1, i2, i3, i4, i5, i6) call ensure_no_error("dammelo enqdate") call ensure("enqdate i1", i1.eq.2006) call ensure("enqdate i2", i2.eq.1) call ensure("enqdate i3", i3.eq.2) call ensure("enqdate i4", i4.eq.3) call ensure("enqdate i5", i5.eq.4) call ensure("enqdate i6", i6.eq.0) call idba_enqlevel(handle, i1, i2, i3, i4) call ensure_no_error("dammelo enqlevel") call ensure("enqlevel i1", i1.eq.1) call ensure("enqlevel i2", i2.eq.1) call ensure("enqlevel i3", i3.eq.1) call ensure("enqlevel i4", i4.eq.1) call idba_enqtimerange(handle, i1, i2, i3) call ensure_no_error("dammelo enqtimerange") call ensure("enqdate i1", i1.eq.20) call ensure("enqdate i2", i2.eq.1) call ensure("enqdate i3", i3.eq.1) call idba_enqi(handle, "ana_id", ival) call ensure_no_error("dammelo enqi ana_id") call ensure("ana_id", ival.eq.1) call idba_enqi(handle, "context_id", ival) call ensure_no_error("dammelo enqi context_id") ! Save the id for reusing it later saved_id = ival call idba_voglioancora(handle, i1) call ensure_no_error("voglioancora") do while (i1.gt.0) call idba_ancora(handle, param) call ensure_no_error("ancora") call idba_enqc(handle, param, cval) call ensure_no_error("ancora enqc") i1 = i1 - 1 enddo ! Perform some useless scusa just to test the parser call idba_setc(handle, "*varlist", "*B12345"); call ensure_no_error("scusa setc 1") call idba_scusa(handle); call ensure_no_error("scusa 1") call idba_setc(handle, "*varlist", "*B12345,*B54321"); call ensure_no_error("scusa setc 2") call idba_scusa(handle); call ensure_no_error("scusa 2") i = i - 1 enddo ! Remove the QC data for saved_data call idba_seti(handle, "*context_id", saved_id); call ensure_no_error("scusa seti 3") call idba_setc(handle, "*var", "*B01011") call ensure_no_error("scusa setc 3") call idba_scusa(handle); call ensure_no_error("scusa 3") call idba_unsetall(handle) call ensure_no_error("unsetall quantesono 1") call idba_quantesono(handle, i) call ensure_no_error("quantesono 1") call ensure("quantesono 1", i.eq.1) call idba_setd(handle, "latmax", 20D00) call ensure_no_error("seti quantesono 2") call idba_quantesono(handle, i) call ensure_no_error("quantesono 2") call ensure("quantesono 1", i.eq.0) call idba_fatto(handle) call ensure_no_error("fatto") call idba_arrivederci(dbahandle) call ensure_no_error("arrivederci") ! If we made it so far, exit with no error print*,"check_fdballe: all tests succeed." call exit (0) end program include "check-utils.h" dballe-5.18/fortran/mkmsg.f900000644000175000017500000000612711240576034012734 00000000000000 program mkmsg ! **************************** ! * Create a test message file ! **************************** integer handle, nstaz, ndata, nattr integer i, i1, i2, tmp integer id,height,codrete character fname*256,encoding*10,cname*20,rete*20,value*255 character btable*10,starbtable*10 real*8 dlat,dlon external errorrep call idba_error_set_callback(0, errorrep, 2, i) ! Open a session call getarg(1,fname) call getarg(2,encoding) call idba_messaggi(handle, fname, "w", encoding) call idba_setd(handle, "lat", 44.D0) call idba_setd(handle, "lon", 11.D0) call idba_setlevel(handle, 102, 2000, 0, 0) call idba_settimerange(handle, 254, 0, 0) call idba_setdate(handle, 2008, 7, 6, 5, 4, 3) ! One without setting 'query' call idba_seti(handle, "B12001", 2731+120) call idba_prendilo(handle) call idba_seti(handle, "*B33192", 74) call idba_seti(handle, "*B33193", 81) call idba_seti(handle, "*B33194", 59) call idba_critica(handle) call idba_seti(handle, "B12003", 2731+100) call idba_prendilo(handle) ! One setting 'query' to subset call idba_setc(handle, "query", "subset") call idba_seti(handle, "B12001", 2731+110) call idba_prendilo(handle) call idba_seti(handle, "*B33192", 47) call idba_seti(handle, "*B33193", 18) call idba_seti(handle, "*B33194", 95) call idba_critica(handle) call idba_seti(handle, "B12003", 2731+100) call idba_prendilo(handle) ! One setting 'query' to message, and making a synop call idba_setc(handle, "query", "message") call idba_seti(handle, "rep_cod", 1) call idba_seti(handle, "B12001", 2731+90) call idba_prendilo(handle) call idba_seti(handle, "*B33007", 81) call idba_critica(handle) call idba_seti(handle, "B12003", 2731+80) call idba_seti(handle, "B13003", 80) call idba_prendilo(handle) ! One setting 'query' to message, and making a synop call idba_setc(handle, "query", "message synop") call idba_seti(handle, "rep_cod", 1) call idba_seti(handle, "B12001", 2731+90) call idba_prendilo(handle) call idba_fatto(handle) call exit (0) end ! ******************** ! * Utility functions ! ******************** ! Compute the length of a string integer function istrlen(string) character string*(*) istrlen = len(string) do while ((string(istrlen:istrlen).eq." " .or. & string(istrlen:istrlen).eq."").and. & istrlen.gt.0) istrlen = istrlen - 1 enddo return end subroutine errorrep(val) integer val character buf*1000 ier = idba_error_code() if (ier.ne.0) then print *,ier," error in ",val call idba_error_message(buf) print *,buf(:istrlen(buf)) call idba_error_context(buf) print *,buf(:istrlen(buf)) call idba_error_details(buf) print *,buf(:istrlen(buf)) call exit (1) end if return end dballe-5.18/fortran/msgapi.cc0000644000175000017500000003011411625142743013061 00000000000000/* * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "msgapi.h" #include #include #include #include #include #include #include #include using namespace wreport; using namespace std; namespace dballe { namespace fortran { MsgAPI::MsgAPI(const char* fname, const char* mode, const char* type) : file(0), state(0), importer(0), exporter(0), msgs(0), wmsg(0), curmsgidx(0), iter_ctx(-1), iter_var(-1), cached_cat(0), cached_subcat(0), cached_lcat(0) { if (strchr(mode, 'r') != NULL) { set_permissions("read", "read", "read"); } else if (strchr(mode, 'w') != NULL || strchr(mode, 'a') != NULL) { set_permissions("write", "add", "add"); } Encoding etype = (Encoding)-1; if (strcasecmp(type, "BUFR") == 0) etype = BUFR; else if (strcasecmp(type, "CREX") == 0) etype = CREX; else if (strcasecmp(type, "AOF") == 0) etype = AOF; else if (strcasecmp(type, "AUTO") == 0) etype = (Encoding)-1; else error_consistency::throwf("\"%s\" is not one of the supported message types", type); file = File::create(etype, fname, mode).release(); if (strchr(mode, 'r') != NULL) { importer = msg::Importer::create(etype).release(); readNextMessage(); } } MsgAPI::~MsgAPI() { if (perms & (PERM_DATA_WRITE | PERM_DATA_ADD)) { if (wmsg) flushSubset(); if (msgs) flushMessage(); } else { if (wmsg) delete wmsg; if (msgs) delete msgs; } if (file) delete file; if (importer) delete importer; if (exporter) delete exporter; for (vector::iterator i = vars.begin(); i != vars.end(); ++i) delete *i; } Msg* MsgAPI::curmsg() { if (msgs && curmsgidx < msgs->size()) return (*msgs)[curmsgidx]; else return NULL; } bool MsgAPI::readNextMessage() { if (state & STATE_EOF) return false; if (msgs && curmsgidx < msgs->size() - 1) { ++curmsgidx; return true; } state = 0; curmsgidx = 0; if (msgs) { delete msgs; msgs = 0; } Rawmsg raw; if (file->read(raw)) { msgs = new Msgs; importer->from_rawmsg(raw, *msgs); return true; } state |= STATE_EOF; return false; } void MsgAPI::scopa(const char* repinfofile) { if (!(perms & PERM_DATA_WRITE)) throw error_consistency( "scopa must be run with the database open in data write mode"); // FIXME: In theory, nothing to do // FIXME: In practice, we could reset all buffered data and ftruncate the file } int MsgAPI::quantesono() { if (state & STATE_QUANTESONO) readNextMessage(); if (state & STATE_EOF) return 0; state |= STATE_QUANTESONO; return 1; } void MsgAPI::elencamele() { if ((state & STATE_QUANTESONO) == 0) throw error_consistency("elencamele called without a previous quantesono"); output.clear(); Msg* msg = curmsg(); if (!msg) return; const msg::Context* ctx = msg->find_context(Level(257), Trange()); if (!ctx) return; output.set_ana_context(); output.set(DBA_KEY_MOBILE, 0); output.set(DBA_KEY_REP_MEMO, Msg::repmemo_from_type(msg->type)); for (size_t l = 0; l < ctx->data.size(); ++l) { const Var& var = *(ctx->data[l]); switch (var.code()) { case WR_VAR(0, 5, 1): output.set(DBA_KEY_LAT, var); break; case WR_VAR(0, 6, 1): output.set(DBA_KEY_LON, var); break; case WR_VAR(0, 1, 11): output.set(DBA_KEY_IDENT, var); output.set(DBA_KEY_MOBILE, 1); break; case WR_VAR(0, 1, 192): output.set(DBA_KEY_ANA_ID, var); break; case WR_VAR(0, 1, 194): output.set(DBA_KEY_REP_MEMO, var); break; default: output.set(var); break; } } } bool MsgAPI::incrementMsgIters() { if (iter_ctx < 0) { iter_ctx = 0; iter_var = -1; } Msg* msg = curmsg(); if ((unsigned)iter_ctx >= msg->data.size()) return false; const msg::Context* ctx = msg->data[iter_ctx]; if (iter_var < (int)ctx->data.size() - 1) { ++iter_var; } else { ++iter_ctx; iter_var = 0; } // No not skip the pseudoana layer // if (level->ltype1 == 257) // { // ++iter_l; // iter_d = 0; // } if ((unsigned)iter_ctx >= msg->data.size()) return false; return true; } int MsgAPI::voglioquesto() { if (state & STATE_VOGLIOQUESTO) readNextMessage(); if (state & STATE_EOF) return 0; state |= STATE_VOGLIOQUESTO; iter_ctx = iter_var = -1; Msg* msg = curmsg(); if (!msg) return 0; int count = 0; for (size_t l = 0; l < msg->data.size(); ++l) { const msg::Context* ctx = msg->data[l]; //if (level->ltype1 == 257) continue; count += ctx->data.size(); } return count; } const char* MsgAPI::dammelo() { if ((state & STATE_VOGLIOQUESTO) == 0) throw error_consistency("dammelo called without a previous voglioquesto"); output.clear(); Msg* msg = curmsg(); if (!msg) return 0; if (!incrementMsgIters()) return 0; // Set metainfo from msg ana layer if (const msg::Context* ctx = msg->find_context(Level(257), Trange())) { output.set(DBA_KEY_MOBILE, 0); output.set(DBA_KEY_REP_MEMO, Msg::repmemo_from_type(msg->type)); for (size_t l = 0; l < ctx->data.size(); ++l) { const Var& var = *(ctx->data[l]); switch (var.code()) { case WR_VAR(0, 5, 1): output.set(DBA_KEY_LAT, var); break; case WR_VAR(0, 6, 1): output.set(DBA_KEY_LON, var); break; case WR_VAR(0, 4, 1): output.set(DBA_KEY_YEAR, var); break; case WR_VAR(0, 4, 2): output.set(DBA_KEY_MONTH, var); break; case WR_VAR(0, 4, 3): output.set(DBA_KEY_DAY, var); break; case WR_VAR(0, 4, 4): output.set(DBA_KEY_HOUR, var); break; case WR_VAR(0, 4, 5): output.set(DBA_KEY_MIN, var); break; case WR_VAR(0, 4, 6): output.set(DBA_KEY_SEC, var); break; case WR_VAR(0, 1, 11): output.set(DBA_KEY_IDENT, var); output.set(DBA_KEY_MOBILE, 1); break; case WR_VAR(0, 1, 192): output.set(DBA_KEY_ANA_ID, var); break; case WR_VAR(0, 1, 194): output.set(DBA_KEY_REP_MEMO, var); break; default: output.set(var); break; } } } msg::Context* ctx = msg->data[iter_ctx]; output.set(DBA_KEY_LEVELTYPE1, ctx->level.ltype1); output.set(DBA_KEY_L1, ctx->level.l1); output.set(DBA_KEY_LEVELTYPE2, ctx->level.ltype2); output.set(DBA_KEY_L2, ctx->level.l2); output.set(DBA_KEY_PINDICATOR, ctx->trange.pind); output.set(DBA_KEY_P1, ctx->trange.p1); output.set(DBA_KEY_P2, ctx->trange.p2); const Var& var = *ctx->data[iter_var]; char vname[10]; Varcode code = var.code(); snprintf(vname, 10, "B%02d%03d", WR_VAR_X(code), WR_VAR_Y(code)); output.set(DBA_KEY_VAR, vname); output.set(var); // Return the pointer to the copy inside the output record. We cannot // return vname as it is in the local stack return output.key_peek_value(DBA_KEY_VAR); } void MsgAPI::flushVars() { // Acquire the variables still around from the last prendilo while (!vars.empty()) { // Pop a variable from the vector and take ownership of // its memory management auto_ptr var(vars.back()); vars.pop_back(); wmsg->set(var, vars_level, vars_trange); } } void MsgAPI::flushSubset() { if (wmsg) { flushVars(); auto_ptr awmsg(wmsg); wmsg = 0; msgs->acquire(awmsg); } } void MsgAPI::flushMessage() { if (msgs) { flushSubset(); Rawmsg raw; if (exporter == 0) { msg::Exporter::Options opts; opts.template_name = exporter_template; exporter = msg::Exporter::create(file->type(), opts).release(); } exporter->to_rawmsg(*msgs, raw); file->write(raw); delete msgs; msgs = 0; } } void MsgAPI::prendilo() { if (perms & PERM_DATA_RO) error_consistency("prendilo cannot be called with the file open in read mode"); if (!msgs) msgs = new Msgs; if (!wmsg) wmsg = new Msg; // Store record metainfo if (const char* sval = input.key_peek_value(DBA_KEY_REP_MEMO)) { wmsg->set_rep_memo(sval); wmsg->type = Msg::type_from_repmemo(sval); } if (const Var* var = input.key_peek(DBA_KEY_ANA_ID)) wmsg->seti(WR_VAR(0, 1, 192), var->enqi(), -1, Level(257), Trange()); if (const Var* var = input.key_peek(DBA_KEY_IDENT)) wmsg->set_ident(var->enqc()); if (const Var* var = input.key_peek(DBA_KEY_LAT)) wmsg->set_latitude(var->enqd()); if (const Var* var = input.key_peek(DBA_KEY_LON)) wmsg->set_longitude(var->enqd()); if (const Var* var = input.key_peek(DBA_KEY_YEAR)) wmsg->set_year(var->enqi()); if (const Var* var = input.key_peek(DBA_KEY_MONTH)) wmsg->set_month(var->enqi()); if (const Var* var = input.key_peek(DBA_KEY_DAY)) wmsg->set_day(var->enqi()); if (const Var* var = input.key_peek(DBA_KEY_HOUR)) wmsg->set_hour(var->enqi()); if (const Var* var = input.key_peek(DBA_KEY_MIN)) wmsg->set_minute(var->enqi()); if (const Var* var = input.key_peek(DBA_KEY_SEC)) wmsg->set_second(var->enqi()); const vector& in_vars = input.vars(); flushVars(); assert(vars.empty()); vars_level.ltype1 = input.get(DBA_KEY_LEVELTYPE1, MISSING_INT); vars_level.l1 = input.get(DBA_KEY_L1, MISSING_INT); vars_level.ltype2 = input.get(DBA_KEY_LEVELTYPE2, MISSING_INT); vars_level.l2 = input.get(DBA_KEY_L2, MISSING_INT); vars_trange.pind = input.get(DBA_KEY_PINDICATOR, MISSING_INT); vars_trange.p1 = input.get(DBA_KEY_P1, MISSING_INT); vars_trange.p2 = input.get(DBA_KEY_P2, MISSING_INT); for (vector::const_iterator v = in_vars.begin(); v != in_vars.end(); ++v) vars.push_back(new Var(**v)); input.clear_vars(); if (const char* query = input.key_peek_value(DBA_KEY_QUERY)) { if (strcasecmp(query, "subset") == 0) { flushSubset(); } else if (strncasecmp(query, "message", 7) == 0) { // Check that message is followed by spaces or end of string const char* s = query + 7; if (*s != 0 && !isblank(*s)) error_consistency::throwf("Query type \"%s\" is not among the supported values", query); // Skip the spaces after message while (*s != 0 && isblank(*s)) ++s; // Set or reset the exporter template if (exporter_template != s) { // If it has changed, we need to recreate the exporter delete exporter; exporter = 0; exporter_template = s; } flushMessage(); } else error_consistency::throwf("Query type \"%s\" is not among the supported values", query); // Uset query after using it: it needs to be explicitly set every time input.unset(DBA_KEY_QUERY); } } void MsgAPI::dimenticami() { throw error_consistency("dimenticami does not make sense when writing messages"); } int MsgAPI::voglioancora() { Msg* msg = curmsg(); if (msg == 0 || iter_ctx < 0 || iter_var < 0) throw error_consistency("voglioancora called before dammelo"); if ((unsigned)iter_ctx >= msg->data.size()) return 0; const msg::Context& ctx = *(msg->data[iter_ctx]); if ((unsigned)iter_var >= ctx.data.size()) return 0; const Var& var = *(ctx.data[iter_var]); qcoutput.clear(); int count = 0; for (const Var* attr = var.next_attr(); attr; attr = attr->next_attr()) { qcoutput.set(*attr); ++count; } qc_iter = 0; return count; } void MsgAPI::critica() { if (perms & PERM_ATTR_RO) throw error_consistency( "critica cannot be called with the database open in attribute readonly mode"); if (vars.empty()) throw error_consistency("critica has been called without a previous prendilo"); if (vars.size() > 1) throw error_consistency("critica has been called after setting many variables with a single prendilo, so I do not know which one should get the attributes"); const vector& avars = qcinput.vars(); for (vector::const_iterator i = avars.begin(); i != avars.end(); ++i) vars[0]->seta(**i); qcinput.clear(); } void MsgAPI::scusa() { throw error_consistency("scusa does not make sense when writing messages"); } } } /* vim:set ts=4 sw=4: */ dballe-5.18/fortran/fortran.dox0000644000175000017500000000071711173330007013455 00000000000000/** @defgroup fortran Dballe fortran bindings Fortran bindings of Dballe. The bindings offer two different interfaces: a simplified interface and a full interface. The simplified interface allows for writing code quickly, while the full interface exports every part of Dballe, making it possible to write more complex programs, such as programs that run run more queries at the same time, or that perform queries while getting the results of other queries. */ dballe-5.18/fortran/handles.h0000644000175000017500000000641511450574446013075 00000000000000/* * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #ifndef FDBA_HANDLES_H #define FDBA_HANDLES_H #include #include namespace dballe { struct DB; namespace fortran { struct API; #if 0 #define FDBA_HANDLE_END_DECL(name) }; \ extern struct fdba_handle_##name _##name[]; \ void fdba_handle_init_##name(); \ dba_err fdba_handle_alloc_##name(int* res); \ void fdba_handle_release_##name(int hnd); #define FDBA_HANDLE_BODY(name, size, desc) \ struct fdba_handle_##name _##name[size]; \ static int _##name##_last = 0; \ /* Initialize the handle storage */ \ void fdba_handle_init_##name() { \ int i; \ for (i = 0; i < size; i++) \ _##name[i].used = 0; \ } \ /* Allocate a new handle */ \ dba_err fdba_handle_alloc_##name(int* res) { \ if (_##name##_last < size) { \ *res = _##name##_last++; \ } else { \ int i, found = 0; \ for (i = 0; i < size && !found; i++) \ if (_##name[i].used == 0) { \ *res = i; \ found = 1; \ } \ if (!found) \ return dba_error_handles("No more handles for " desc ". The maximum limit is %d: to increase it, recompile dballe setting " #size " to a higher value", size); \ } \ /* Setup the new handle */ \ _##name[*res].used = 1; \ return dba_error_ok(); \ } \ /* Release a handle */ \ void fdba_handle_release_##name(int hnd) { \ assert(hnd < size); \ assert(_##name[hnd].used == 1); \ _##name[hnd].used = 0; \ if (hnd == _##name##_last - 1) \ _##name##_last--; \ } #define FDBA_HANDLE(name, hnd) (_##name[hnd]) #endif struct HBase { bool used; HBase() : used(false) {} void start() { used = true; } void stop() { used = false; } }; template struct Handler { T* records; int next; const char* name; const char* def; size_t in_use; void init(const char* name, const char* def) { this->name = name; this->def = def; records = new T[MAX]; next = 0; in_use = 0; } T& get(int id) { assert(records[id].used); return records[id]; } int request() { for (int i = 0; i < MAX && (records[next].used); ++i) next = (next + 1) % MAX; if (records[next].used) wreport::error_handles::throwf("No more handles for %s. The maximum limit is %d: to increase it, recompile DB-All.e setting %s to a higher value", name, MAX, def); /* Setup the new handle */ records[next].start(); ++in_use; return next; } void release(int h) { assert(in_use); assert(records[h].used); if (records[h].used) { records[h].stop(); --in_use; } } }; /// Initialise error handlers void error_init(); } } #endif dballe-5.18/fortran/Makefile.in0000644000175000017500000014610711754230756013356 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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@ 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@ @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@am__append_1 = \ @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@ dbapi.cc @DO_DBALLEF_TRUE@check_PROGRAMS = check_missing_msg$(EXEEXT) \ @DO_DBALLEF_TRUE@ tut_test$(EXEEXT) $(am__EXEEXT_1) @DO_DBALLEF_TRUE@am__append_2 = -O0 @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@am__append_3 = check_real0 check_range check_fdballe check_attrs check_missing check_cached_anaid @DO_DBALLEF_TRUE@noinst_PROGRAMS = dumpmsg_dballe$(EXEEXT) \ @DO_DBALLEF_TRUE@ mkmsg$(EXEEXT) mkmsg-sca$(EXEEXT) \ @DO_DBALLEF_TRUE@ genattr$(EXEEXT) $(am__EXEEXT_2) @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@am__append_4 = dump_dballe subdir = fortran DIST_COMMON = $(am__dist_dballeinclude_HEADERS_DIST) \ $(am__dist_noinst_HEADERS_DIST) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_flag.m4 \ $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/python.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h 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)$(libdir)" \ "$(DESTDIR)$(dballeincludedir)" LTLIBRARIES = $(lib_LTLIBRARIES) @DO_DBALLEF_TRUE@libdballef_la_DEPENDENCIES = ../dballe/libdballe.la am__libdballef_la_SOURCES_DIST = error.cc simple.cc commonapi.cc \ msgapi.cc binding.cc dbapi.cc @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@am__objects_1 = dbapi.lo @DO_DBALLEF_TRUE@am_libdballef_la_OBJECTS = error.lo simple.lo \ @DO_DBALLEF_TRUE@ commonapi.lo msgapi.lo binding.lo \ @DO_DBALLEF_TRUE@ $(am__objects_1) libdballef_la_OBJECTS = $(am_libdballef_la_OBJECTS) libdballef_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(libdballef_la_LDFLAGS) $(LDFLAGS) -o $@ @DO_DBALLEF_TRUE@am_libdballef_la_rpath = -rpath $(libdir) @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@am__EXEEXT_1 = \ @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@ check_real0$(EXEEXT) \ @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@ check_range$(EXEEXT) \ @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@ check_fdballe$(EXEEXT) \ @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@ check_attrs$(EXEEXT) \ @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@ check_missing$(EXEEXT) \ @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@ check_cached_anaid$(EXEEXT) @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@am__EXEEXT_2 = \ @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@ dump_dballe$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) am__check_attrs_SOURCES_DIST = dbtest.f90 test.f90 check_attrs.f90 @DO_DBALLEF_TRUE@am__objects_2 = check_attrs-test.$(OBJEXT) @DO_DBALLEF_TRUE@am__objects_3 = check_attrs-dbtest.$(OBJEXT) \ @DO_DBALLEF_TRUE@ $(am__objects_2) @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@am_check_attrs_OBJECTS = \ @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@ $(am__objects_3) \ @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@ check_attrs-check_attrs.$(OBJEXT) check_attrs_OBJECTS = $(am_check_attrs_OBJECTS) @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@check_attrs_DEPENDENCIES = \ @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@ ./libdballef.la check_attrs_LINK = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(FCLD) $(check_attrs_FCFLAGS) \ $(FCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ am__check_cached_anaid_SOURCES_DIST = dbtest.f90 test.f90 \ check_cached_anaid.f90 @DO_DBALLEF_TRUE@am__objects_4 = check_cached_anaid-test.$(OBJEXT) @DO_DBALLEF_TRUE@am__objects_5 = check_cached_anaid-dbtest.$(OBJEXT) \ @DO_DBALLEF_TRUE@ $(am__objects_4) @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@am_check_cached_anaid_OBJECTS = \ @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@ $(am__objects_5) \ @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@ check_cached_anaid-check_cached_anaid.$(OBJEXT) check_cached_anaid_OBJECTS = $(am_check_cached_anaid_OBJECTS) @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@check_cached_anaid_DEPENDENCIES = \ @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@ ./libdballef.la check_cached_anaid_LINK = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(FCLD) \ $(check_cached_anaid_FCFLAGS) $(FCFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ am__check_fdballe_SOURCES_DIST = dbtest.f90 test.f90 check_fdballe.f90 @DO_DBALLEF_TRUE@am__objects_6 = check_fdballe-test.$(OBJEXT) @DO_DBALLEF_TRUE@am__objects_7 = check_fdballe-dbtest.$(OBJEXT) \ @DO_DBALLEF_TRUE@ $(am__objects_6) @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@am_check_fdballe_OBJECTS = \ @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@ $(am__objects_7) \ @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@ check_fdballe-check_fdballe.$(OBJEXT) check_fdballe_OBJECTS = $(am_check_fdballe_OBJECTS) @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@check_fdballe_DEPENDENCIES = \ @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@ ./libdballef.la check_fdballe_LINK = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(FCLD) $(check_fdballe_FCFLAGS) \ $(FCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ am__check_missing_SOURCES_DIST = dbtest.f90 test.f90 check_missing.f90 @DO_DBALLEF_TRUE@am__objects_8 = check_missing-test.$(OBJEXT) @DO_DBALLEF_TRUE@am__objects_9 = check_missing-dbtest.$(OBJEXT) \ @DO_DBALLEF_TRUE@ $(am__objects_8) @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@am_check_missing_OBJECTS = \ @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@ $(am__objects_9) \ @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@ check_missing-check_missing.$(OBJEXT) check_missing_OBJECTS = $(am_check_missing_OBJECTS) @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@check_missing_DEPENDENCIES = \ @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@ ./libdballef.la check_missing_LINK = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(FCLD) $(check_missing_FCFLAGS) \ $(FCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ am__check_missing_msg_SOURCES_DIST = test.f90 check_missing_msg.f90 @DO_DBALLEF_TRUE@am__objects_10 = check_missing_msg-test.$(OBJEXT) @DO_DBALLEF_TRUE@am_check_missing_msg_OBJECTS = $(am__objects_10) \ @DO_DBALLEF_TRUE@ check_missing_msg-check_missing_msg.$(OBJEXT) check_missing_msg_OBJECTS = $(am_check_missing_msg_OBJECTS) @DO_DBALLEF_TRUE@check_missing_msg_DEPENDENCIES = ./libdballef.la check_missing_msg_LINK = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(FCLD) \ $(check_missing_msg_FCFLAGS) $(FCFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ am__check_range_SOURCES_DIST = dbtest.f90 test.f90 check_range.f90 @DO_DBALLEF_TRUE@am__objects_11 = check_range-test.$(OBJEXT) @DO_DBALLEF_TRUE@am__objects_12 = check_range-dbtest.$(OBJEXT) \ @DO_DBALLEF_TRUE@ $(am__objects_11) @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@am_check_range_OBJECTS = \ @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@ $(am__objects_12) \ @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@ check_range-check_range.$(OBJEXT) check_range_OBJECTS = $(am_check_range_OBJECTS) @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@check_range_DEPENDENCIES = \ @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@ ./libdballef.la check_range_LINK = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(FCLD) $(check_range_FCFLAGS) \ $(FCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ am__check_real0_SOURCES_DIST = dbtest.f90 test.f90 check_real0.f90 @DO_DBALLEF_TRUE@am__objects_13 = check_real0-test.$(OBJEXT) @DO_DBALLEF_TRUE@am__objects_14 = check_real0-dbtest.$(OBJEXT) \ @DO_DBALLEF_TRUE@ $(am__objects_13) @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@am_check_real0_OBJECTS = \ @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@ $(am__objects_14) \ @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@ check_real0-check_real0.$(OBJEXT) check_real0_OBJECTS = $(am_check_real0_OBJECTS) @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@check_real0_DEPENDENCIES = \ @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@ ./libdballef.la check_real0_LINK = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(FCLD) $(check_real0_FCFLAGS) \ $(FCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ am__dump_dballe_SOURCES_DIST = dump_dballe.f90 @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@am_dump_dballe_OBJECTS = dump_dballe-dump_dballe.$(OBJEXT) dump_dballe_OBJECTS = $(am_dump_dballe_OBJECTS) @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@dump_dballe_DEPENDENCIES = \ @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@ ../fortran/libdballef.la dump_dballe_LINK = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(FCLD) $(dump_dballe_FCFLAGS) \ $(FCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ am__dumpmsg_dballe_SOURCES_DIST = dumpmsg_dballe.f90 @DO_DBALLEF_TRUE@am_dumpmsg_dballe_OBJECTS = \ @DO_DBALLEF_TRUE@ dumpmsg_dballe-dumpmsg_dballe.$(OBJEXT) dumpmsg_dballe_OBJECTS = $(am_dumpmsg_dballe_OBJECTS) @DO_DBALLEF_TRUE@dumpmsg_dballe_DEPENDENCIES = \ @DO_DBALLEF_TRUE@ ../fortran/libdballef.la dumpmsg_dballe_LINK = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(FCLD) $(dumpmsg_dballe_FCFLAGS) \ $(FCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ am__genattr_SOURCES_DIST = genattr.f90 @DO_DBALLEF_TRUE@am_genattr_OBJECTS = genattr-genattr.$(OBJEXT) genattr_OBJECTS = $(am_genattr_OBJECTS) @DO_DBALLEF_TRUE@genattr_DEPENDENCIES = ../fortran/libdballef.la genattr_LINK = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(FCLD) $(genattr_FCFLAGS) $(FCFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ am__mkmsg_SOURCES_DIST = mkmsg.f90 @DO_DBALLEF_TRUE@am_mkmsg_OBJECTS = mkmsg-mkmsg.$(OBJEXT) mkmsg_OBJECTS = $(am_mkmsg_OBJECTS) @DO_DBALLEF_TRUE@mkmsg_DEPENDENCIES = ../fortran/libdballef.la mkmsg_LINK = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(FCLD) $(mkmsg_FCFLAGS) $(FCFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ am__mkmsg_sca_SOURCES_DIST = mkmsg-sca.f90 @DO_DBALLEF_TRUE@am_mkmsg_sca_OBJECTS = mkmsg_sca-mkmsg-sca.$(OBJEXT) mkmsg_sca_OBJECTS = $(am_mkmsg_sca_OBJECTS) @DO_DBALLEF_TRUE@mkmsg_sca_DEPENDENCIES = ../fortran/libdballef.la mkmsg_sca_LINK = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(FCLD) $(mkmsg_sca_FCFLAGS) \ $(FCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ am__tut_test_SOURCES_DIST = msgapi-tut.cc test-utils-core.cc \ tut-main.cpp @DO_DBALLEF_TRUE@am_tut_test_OBJECTS = msgapi-tut.$(OBJEXT) \ @DO_DBALLEF_TRUE@ test-utils-core.$(OBJEXT) tut-main.$(OBJEXT) tut_test_OBJECTS = $(am_tut_test_OBJECTS) am__DEPENDENCIES_1 = @DO_DBALLEF_TRUE@tut_test_DEPENDENCIES = libdballef.la \ @DO_DBALLEF_TRUE@ ../dballe/libdballe.la $(am__DEPENDENCIES_1) \ @DO_DBALLEF_TRUE@ $(am__DEPENDENCIES_1) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ FCCOMPILE = $(FC) $(AM_FCFLAGS) $(FCFLAGS) LTFCCOMPILE = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(FC) $(AM_FCFLAGS) $(FCFLAGS) FCLD = $(FC) FCLINK = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libdballef_la_SOURCES) $(check_attrs_SOURCES) \ $(check_cached_anaid_SOURCES) $(check_fdballe_SOURCES) \ $(check_missing_SOURCES) $(check_missing_msg_SOURCES) \ $(check_range_SOURCES) $(check_real0_SOURCES) \ $(dump_dballe_SOURCES) $(dumpmsg_dballe_SOURCES) \ $(genattr_SOURCES) $(mkmsg_SOURCES) $(mkmsg_sca_SOURCES) \ $(tut_test_SOURCES) DIST_SOURCES = $(am__libdballef_la_SOURCES_DIST) \ $(am__check_attrs_SOURCES_DIST) \ $(am__check_cached_anaid_SOURCES_DIST) \ $(am__check_fdballe_SOURCES_DIST) \ $(am__check_missing_SOURCES_DIST) \ $(am__check_missing_msg_SOURCES_DIST) \ $(am__check_range_SOURCES_DIST) \ $(am__check_real0_SOURCES_DIST) \ $(am__dump_dballe_SOURCES_DIST) \ $(am__dumpmsg_dballe_SOURCES_DIST) $(am__genattr_SOURCES_DIST) \ $(am__mkmsg_SOURCES_DIST) $(am__mkmsg_sca_SOURCES_DIST) \ $(am__tut_test_SOURCES_DIST) am__dist_dballeinclude_HEADERS_DIST = dballef.h am__dist_noinst_HEADERS_DIST = simple.h commonapi.h dbapi.h msgapi.h \ handles.h HEADERS = $(dist_dballeinclude_HEADERS) $(dist_noinst_HEADERS) ETAGS = etags CTAGS = ctags am__tty_colors = \ red=; grn=; lgn=; blu=; std= DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ $(am__append_2) CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FC = @FC@ FCFLAGS = @FCFLAGS@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBDBALLEF_VERSION_INFO = @LIBDBALLEF_VERSION_INFO@ LIBDBALLE_VERSION_INFO = @LIBDBALLE_VERSION_INFO@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LUA_CFLAGS = @LUA_CFLAGS@ LUA_LIBS = @LUA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ 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@ PKG_CONFIG = @PKG_CONFIG@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WIBBLE_CFLAGS = @WIBBLE_CFLAGS@ WIBBLE_LIBS = @WIBBLE_LIBS@ WREPORT_CFLAGS = @WREPORT_CFLAGS@ WREPORT_LIBS = @WREPORT_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ confdir = @confdir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ have_doxygen = @have_doxygen@ have_gperf = @have_gperf@ have_latex2html = @have_latex2html@ have_rst2html = @have_rst2html@ have_swig = @have_swig@ 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@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ tabledir = @tabledir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @DO_DBALLEF_TRUE@INCLUDES = -I$(top_srcdir) $(WREPORT_CFLAGS) # libdballef @DO_DBALLEF_TRUE@dballeincludedir = $(includedir)/dballe # Include the F90 interface file as well @DO_DBALLEF_TRUE@dist_dballeinclude_HEADERS = dballef.h @DO_DBALLEF_TRUE@dist_noinst_HEADERS = simple.h commonapi.h dbapi.h msgapi.h handles.h @DO_DBALLEF_TRUE@lib_LTLIBRARIES = libdballef.la @DO_DBALLEF_TRUE@libdballef_la_SOURCES = error.cc simple.cc \ @DO_DBALLEF_TRUE@ commonapi.cc msgapi.cc binding.cc \ @DO_DBALLEF_TRUE@ $(am__append_1) @DO_DBALLEF_TRUE@libdballef_la_LIBADD = ../dballe/libdballe.la -lcnf @DO_DBALLEF_TRUE@libdballef_la_LDFLAGS = -version-info @LIBDBALLEF_VERSION_INFO@ # # Unit testing # @DO_DBALLEF_TRUE@TESTS_ENVIRONMENT = $(top_srcdir)/extra/runtest @DO_DBALLEF_TRUE@TESTS = $(check_PROGRAMS) @DO_DBALLEF_TRUE@testlib = test.f90 @DO_DBALLEF_TRUE@dbtestlib = dbtest.f90 $(testlib) @DO_DBALLEF_TRUE@tut_test_SOURCES = \ @DO_DBALLEF_TRUE@ msgapi-tut.cc \ @DO_DBALLEF_TRUE@ test-utils-core.cc \ @DO_DBALLEF_TRUE@ tut-main.cpp @DO_DBALLEF_TRUE@tut_test_LDADD = \ @DO_DBALLEF_TRUE@ libdballef.la \ @DO_DBALLEF_TRUE@ ../dballe/libdballe.la \ @DO_DBALLEF_TRUE@ $(WREPORT_LIBS) \ @DO_DBALLEF_TRUE@ $(WIBBLE_LIBS) @DO_DBALLEF_TRUE@check_missing_msg_SOURCES = $(testlib) check_missing_msg.f90 @DO_DBALLEF_TRUE@check_missing_msg_LDADD = ./libdballef.la -lcnf -lpopt @DO_DBALLEF_TRUE@check_missing_msg_FCFLAGS = -g @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@check_real0_SOURCES = $(dbtestlib) check_real0.f90 @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@check_real0_LDADD = ./libdballef.la -lcnf -lpopt @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@check_real0_FCFLAGS = -g @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@check_range_SOURCES = $(dbtestlib) check_range.f90 @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@check_range_LDADD = ./libdballef.la -lcnf -lpopt @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@check_range_FCFLAGS = -g @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@check_fdballe_SOURCES = $(dbtestlib) check_fdballe.f90 @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@check_fdballe_LDADD = ./libdballef.la -lcnf -lpopt @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@check_fdballe_FCFLAGS = -g @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@check_attrs_SOURCES = $(dbtestlib) check_attrs.f90 @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@check_attrs_LDADD = ./libdballef.la -lcnf -lpopt @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@check_attrs_FCFLAGS = -g @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@check_missing_SOURCES = $(dbtestlib) check_missing.f90 @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@check_missing_LDADD = ./libdballef.la -lcnf -lpopt @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@check_missing_FCFLAGS = -g @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@check_cached_anaid_SOURCES = $(dbtestlib) check_cached_anaid.f90 @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@check_cached_anaid_LDADD = ./libdballef.la -lcnf -lpopt @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@check_cached_anaid_FCFLAGS = -g @DO_DBALLEF_TRUE@dumpmsg_dballe_SOURCES = dumpmsg_dballe.f90 @DO_DBALLEF_TRUE@dumpmsg_dballe_LDADD = ../fortran/libdballef.la -lcnf -lpopt @DO_DBALLEF_TRUE@dumpmsg_dballe_FCFLAGS = -g @DO_DBALLEF_TRUE@mkmsg_SOURCES = mkmsg.f90 @DO_DBALLEF_TRUE@mkmsg_LDADD = ../fortran/libdballef.la -lcnf -lpopt @DO_DBALLEF_TRUE@mkmsg_FCFLAGS = -g @DO_DBALLEF_TRUE@mkmsg_sca_SOURCES = mkmsg-sca.f90 @DO_DBALLEF_TRUE@mkmsg_sca_LDADD = ../fortran/libdballef.la -lcnf -lpopt @DO_DBALLEF_TRUE@mkmsg_sca_FCFLAGS = -g @DO_DBALLEF_TRUE@genattr_SOURCES = genattr.f90 @DO_DBALLEF_TRUE@genattr_LDADD = ../fortran/libdballef.la -lcnf -lpopt @DO_DBALLEF_TRUE@genattr_FCFLAGS = -g @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@dump_dballe_SOURCES = dump_dballe.f90 @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@dump_dballe_LDADD = ../fortran/libdballef.la -lcnf -lpopt @DO_DBALLEF_TRUE@@DO_DBALLE_DB_TRUE@dump_dballe_FCFLAGS = -g @DO_DBALLEF_TRUE@EXTRA_DIST = fortran.dox check-utils.h error.h @DO_DBALLEF_TRUE@CLEANFILES = test.mod dbtest.mod all: all-am .SUFFIXES: .SUFFIXES: .cc .cpp .f90 .lo .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) --foreign fortran/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign fortran/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-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libdballef.la: $(libdballef_la_OBJECTS) $(libdballef_la_DEPENDENCIES) $(EXTRA_libdballef_la_DEPENDENCIES) $(libdballef_la_LINK) $(am_libdballef_la_rpath) $(libdballef_la_OBJECTS) $(libdballef_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list check_attrs$(EXEEXT): $(check_attrs_OBJECTS) $(check_attrs_DEPENDENCIES) $(EXTRA_check_attrs_DEPENDENCIES) @rm -f check_attrs$(EXEEXT) $(check_attrs_LINK) $(check_attrs_OBJECTS) $(check_attrs_LDADD) $(LIBS) check_cached_anaid$(EXEEXT): $(check_cached_anaid_OBJECTS) $(check_cached_anaid_DEPENDENCIES) $(EXTRA_check_cached_anaid_DEPENDENCIES) @rm -f check_cached_anaid$(EXEEXT) $(check_cached_anaid_LINK) $(check_cached_anaid_OBJECTS) $(check_cached_anaid_LDADD) $(LIBS) check_fdballe$(EXEEXT): $(check_fdballe_OBJECTS) $(check_fdballe_DEPENDENCIES) $(EXTRA_check_fdballe_DEPENDENCIES) @rm -f check_fdballe$(EXEEXT) $(check_fdballe_LINK) $(check_fdballe_OBJECTS) $(check_fdballe_LDADD) $(LIBS) check_missing$(EXEEXT): $(check_missing_OBJECTS) $(check_missing_DEPENDENCIES) $(EXTRA_check_missing_DEPENDENCIES) @rm -f check_missing$(EXEEXT) $(check_missing_LINK) $(check_missing_OBJECTS) $(check_missing_LDADD) $(LIBS) check_missing_msg$(EXEEXT): $(check_missing_msg_OBJECTS) $(check_missing_msg_DEPENDENCIES) $(EXTRA_check_missing_msg_DEPENDENCIES) @rm -f check_missing_msg$(EXEEXT) $(check_missing_msg_LINK) $(check_missing_msg_OBJECTS) $(check_missing_msg_LDADD) $(LIBS) check_range$(EXEEXT): $(check_range_OBJECTS) $(check_range_DEPENDENCIES) $(EXTRA_check_range_DEPENDENCIES) @rm -f check_range$(EXEEXT) $(check_range_LINK) $(check_range_OBJECTS) $(check_range_LDADD) $(LIBS) check_real0$(EXEEXT): $(check_real0_OBJECTS) $(check_real0_DEPENDENCIES) $(EXTRA_check_real0_DEPENDENCIES) @rm -f check_real0$(EXEEXT) $(check_real0_LINK) $(check_real0_OBJECTS) $(check_real0_LDADD) $(LIBS) dump_dballe$(EXEEXT): $(dump_dballe_OBJECTS) $(dump_dballe_DEPENDENCIES) $(EXTRA_dump_dballe_DEPENDENCIES) @rm -f dump_dballe$(EXEEXT) $(dump_dballe_LINK) $(dump_dballe_OBJECTS) $(dump_dballe_LDADD) $(LIBS) dumpmsg_dballe$(EXEEXT): $(dumpmsg_dballe_OBJECTS) $(dumpmsg_dballe_DEPENDENCIES) $(EXTRA_dumpmsg_dballe_DEPENDENCIES) @rm -f dumpmsg_dballe$(EXEEXT) $(dumpmsg_dballe_LINK) $(dumpmsg_dballe_OBJECTS) $(dumpmsg_dballe_LDADD) $(LIBS) genattr$(EXEEXT): $(genattr_OBJECTS) $(genattr_DEPENDENCIES) $(EXTRA_genattr_DEPENDENCIES) @rm -f genattr$(EXEEXT) $(genattr_LINK) $(genattr_OBJECTS) $(genattr_LDADD) $(LIBS) mkmsg$(EXEEXT): $(mkmsg_OBJECTS) $(mkmsg_DEPENDENCIES) $(EXTRA_mkmsg_DEPENDENCIES) @rm -f mkmsg$(EXEEXT) $(mkmsg_LINK) $(mkmsg_OBJECTS) $(mkmsg_LDADD) $(LIBS) mkmsg-sca$(EXEEXT): $(mkmsg_sca_OBJECTS) $(mkmsg_sca_DEPENDENCIES) $(EXTRA_mkmsg_sca_DEPENDENCIES) @rm -f mkmsg-sca$(EXEEXT) $(mkmsg_sca_LINK) $(mkmsg_sca_OBJECTS) $(mkmsg_sca_LDADD) $(LIBS) tut_test$(EXEEXT): $(tut_test_OBJECTS) $(tut_test_DEPENDENCIES) $(EXTRA_tut_test_DEPENDENCIES) @rm -f tut_test$(EXEEXT) $(CXXLINK) $(tut_test_OBJECTS) $(tut_test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/binding.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/commonapi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbapi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/error.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msgapi-tut.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msgapi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simple.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-utils-core.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tut-main.Po@am__quote@ .cc.o: @am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cc.obj: @am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cc.lo: @am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< .cpp.o: @am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< .f90.o: $(FCCOMPILE) -c -o $@ $< .f90.obj: $(FCCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .f90.lo: $(LTFCCOMPILE) -c -o $@ $< check_attrs-dbtest.o: dbtest.f90 $(FC) $(check_attrs_FCFLAGS) $(FCFLAGS) -c -o check_attrs-dbtest.o `test -f 'dbtest.f90' || echo '$(srcdir)/'`dbtest.f90 check_attrs-dbtest.obj: dbtest.f90 $(FC) $(check_attrs_FCFLAGS) $(FCFLAGS) -c -o check_attrs-dbtest.obj `if test -f 'dbtest.f90'; then $(CYGPATH_W) 'dbtest.f90'; else $(CYGPATH_W) '$(srcdir)/dbtest.f90'; fi` check_attrs-test.o: test.f90 $(FC) $(check_attrs_FCFLAGS) $(FCFLAGS) -c -o check_attrs-test.o `test -f 'test.f90' || echo '$(srcdir)/'`test.f90 check_attrs-test.obj: test.f90 $(FC) $(check_attrs_FCFLAGS) $(FCFLAGS) -c -o check_attrs-test.obj `if test -f 'test.f90'; then $(CYGPATH_W) 'test.f90'; else $(CYGPATH_W) '$(srcdir)/test.f90'; fi` check_attrs-check_attrs.o: check_attrs.f90 $(FC) $(check_attrs_FCFLAGS) $(FCFLAGS) -c -o check_attrs-check_attrs.o `test -f 'check_attrs.f90' || echo '$(srcdir)/'`check_attrs.f90 check_attrs-check_attrs.obj: check_attrs.f90 $(FC) $(check_attrs_FCFLAGS) $(FCFLAGS) -c -o check_attrs-check_attrs.obj `if test -f 'check_attrs.f90'; then $(CYGPATH_W) 'check_attrs.f90'; else $(CYGPATH_W) '$(srcdir)/check_attrs.f90'; fi` check_cached_anaid-dbtest.o: dbtest.f90 $(FC) $(check_cached_anaid_FCFLAGS) $(FCFLAGS) -c -o check_cached_anaid-dbtest.o `test -f 'dbtest.f90' || echo '$(srcdir)/'`dbtest.f90 check_cached_anaid-dbtest.obj: dbtest.f90 $(FC) $(check_cached_anaid_FCFLAGS) $(FCFLAGS) -c -o check_cached_anaid-dbtest.obj `if test -f 'dbtest.f90'; then $(CYGPATH_W) 'dbtest.f90'; else $(CYGPATH_W) '$(srcdir)/dbtest.f90'; fi` check_cached_anaid-test.o: test.f90 $(FC) $(check_cached_anaid_FCFLAGS) $(FCFLAGS) -c -o check_cached_anaid-test.o `test -f 'test.f90' || echo '$(srcdir)/'`test.f90 check_cached_anaid-test.obj: test.f90 $(FC) $(check_cached_anaid_FCFLAGS) $(FCFLAGS) -c -o check_cached_anaid-test.obj `if test -f 'test.f90'; then $(CYGPATH_W) 'test.f90'; else $(CYGPATH_W) '$(srcdir)/test.f90'; fi` check_cached_anaid-check_cached_anaid.o: check_cached_anaid.f90 $(FC) $(check_cached_anaid_FCFLAGS) $(FCFLAGS) -c -o check_cached_anaid-check_cached_anaid.o `test -f 'check_cached_anaid.f90' || echo '$(srcdir)/'`check_cached_anaid.f90 check_cached_anaid-check_cached_anaid.obj: check_cached_anaid.f90 $(FC) $(check_cached_anaid_FCFLAGS) $(FCFLAGS) -c -o check_cached_anaid-check_cached_anaid.obj `if test -f 'check_cached_anaid.f90'; then $(CYGPATH_W) 'check_cached_anaid.f90'; else $(CYGPATH_W) '$(srcdir)/check_cached_anaid.f90'; fi` check_fdballe-dbtest.o: dbtest.f90 $(FC) $(check_fdballe_FCFLAGS) $(FCFLAGS) -c -o check_fdballe-dbtest.o `test -f 'dbtest.f90' || echo '$(srcdir)/'`dbtest.f90 check_fdballe-dbtest.obj: dbtest.f90 $(FC) $(check_fdballe_FCFLAGS) $(FCFLAGS) -c -o check_fdballe-dbtest.obj `if test -f 'dbtest.f90'; then $(CYGPATH_W) 'dbtest.f90'; else $(CYGPATH_W) '$(srcdir)/dbtest.f90'; fi` check_fdballe-test.o: test.f90 $(FC) $(check_fdballe_FCFLAGS) $(FCFLAGS) -c -o check_fdballe-test.o `test -f 'test.f90' || echo '$(srcdir)/'`test.f90 check_fdballe-test.obj: test.f90 $(FC) $(check_fdballe_FCFLAGS) $(FCFLAGS) -c -o check_fdballe-test.obj `if test -f 'test.f90'; then $(CYGPATH_W) 'test.f90'; else $(CYGPATH_W) '$(srcdir)/test.f90'; fi` check_fdballe-check_fdballe.o: check_fdballe.f90 $(FC) $(check_fdballe_FCFLAGS) $(FCFLAGS) -c -o check_fdballe-check_fdballe.o `test -f 'check_fdballe.f90' || echo '$(srcdir)/'`check_fdballe.f90 check_fdballe-check_fdballe.obj: check_fdballe.f90 $(FC) $(check_fdballe_FCFLAGS) $(FCFLAGS) -c -o check_fdballe-check_fdballe.obj `if test -f 'check_fdballe.f90'; then $(CYGPATH_W) 'check_fdballe.f90'; else $(CYGPATH_W) '$(srcdir)/check_fdballe.f90'; fi` check_missing-dbtest.o: dbtest.f90 $(FC) $(check_missing_FCFLAGS) $(FCFLAGS) -c -o check_missing-dbtest.o `test -f 'dbtest.f90' || echo '$(srcdir)/'`dbtest.f90 check_missing-dbtest.obj: dbtest.f90 $(FC) $(check_missing_FCFLAGS) $(FCFLAGS) -c -o check_missing-dbtest.obj `if test -f 'dbtest.f90'; then $(CYGPATH_W) 'dbtest.f90'; else $(CYGPATH_W) '$(srcdir)/dbtest.f90'; fi` check_missing-test.o: test.f90 $(FC) $(check_missing_FCFLAGS) $(FCFLAGS) -c -o check_missing-test.o `test -f 'test.f90' || echo '$(srcdir)/'`test.f90 check_missing-test.obj: test.f90 $(FC) $(check_missing_FCFLAGS) $(FCFLAGS) -c -o check_missing-test.obj `if test -f 'test.f90'; then $(CYGPATH_W) 'test.f90'; else $(CYGPATH_W) '$(srcdir)/test.f90'; fi` check_missing-check_missing.o: check_missing.f90 $(FC) $(check_missing_FCFLAGS) $(FCFLAGS) -c -o check_missing-check_missing.o `test -f 'check_missing.f90' || echo '$(srcdir)/'`check_missing.f90 check_missing-check_missing.obj: check_missing.f90 $(FC) $(check_missing_FCFLAGS) $(FCFLAGS) -c -o check_missing-check_missing.obj `if test -f 'check_missing.f90'; then $(CYGPATH_W) 'check_missing.f90'; else $(CYGPATH_W) '$(srcdir)/check_missing.f90'; fi` check_missing_msg-test.o: test.f90 $(FC) $(check_missing_msg_FCFLAGS) $(FCFLAGS) -c -o check_missing_msg-test.o `test -f 'test.f90' || echo '$(srcdir)/'`test.f90 check_missing_msg-test.obj: test.f90 $(FC) $(check_missing_msg_FCFLAGS) $(FCFLAGS) -c -o check_missing_msg-test.obj `if test -f 'test.f90'; then $(CYGPATH_W) 'test.f90'; else $(CYGPATH_W) '$(srcdir)/test.f90'; fi` check_missing_msg-check_missing_msg.o: check_missing_msg.f90 $(FC) $(check_missing_msg_FCFLAGS) $(FCFLAGS) -c -o check_missing_msg-check_missing_msg.o `test -f 'check_missing_msg.f90' || echo '$(srcdir)/'`check_missing_msg.f90 check_missing_msg-check_missing_msg.obj: check_missing_msg.f90 $(FC) $(check_missing_msg_FCFLAGS) $(FCFLAGS) -c -o check_missing_msg-check_missing_msg.obj `if test -f 'check_missing_msg.f90'; then $(CYGPATH_W) 'check_missing_msg.f90'; else $(CYGPATH_W) '$(srcdir)/check_missing_msg.f90'; fi` check_range-dbtest.o: dbtest.f90 $(FC) $(check_range_FCFLAGS) $(FCFLAGS) -c -o check_range-dbtest.o `test -f 'dbtest.f90' || echo '$(srcdir)/'`dbtest.f90 check_range-dbtest.obj: dbtest.f90 $(FC) $(check_range_FCFLAGS) $(FCFLAGS) -c -o check_range-dbtest.obj `if test -f 'dbtest.f90'; then $(CYGPATH_W) 'dbtest.f90'; else $(CYGPATH_W) '$(srcdir)/dbtest.f90'; fi` check_range-test.o: test.f90 $(FC) $(check_range_FCFLAGS) $(FCFLAGS) -c -o check_range-test.o `test -f 'test.f90' || echo '$(srcdir)/'`test.f90 check_range-test.obj: test.f90 $(FC) $(check_range_FCFLAGS) $(FCFLAGS) -c -o check_range-test.obj `if test -f 'test.f90'; then $(CYGPATH_W) 'test.f90'; else $(CYGPATH_W) '$(srcdir)/test.f90'; fi` check_range-check_range.o: check_range.f90 $(FC) $(check_range_FCFLAGS) $(FCFLAGS) -c -o check_range-check_range.o `test -f 'check_range.f90' || echo '$(srcdir)/'`check_range.f90 check_range-check_range.obj: check_range.f90 $(FC) $(check_range_FCFLAGS) $(FCFLAGS) -c -o check_range-check_range.obj `if test -f 'check_range.f90'; then $(CYGPATH_W) 'check_range.f90'; else $(CYGPATH_W) '$(srcdir)/check_range.f90'; fi` check_real0-dbtest.o: dbtest.f90 $(FC) $(check_real0_FCFLAGS) $(FCFLAGS) -c -o check_real0-dbtest.o `test -f 'dbtest.f90' || echo '$(srcdir)/'`dbtest.f90 check_real0-dbtest.obj: dbtest.f90 $(FC) $(check_real0_FCFLAGS) $(FCFLAGS) -c -o check_real0-dbtest.obj `if test -f 'dbtest.f90'; then $(CYGPATH_W) 'dbtest.f90'; else $(CYGPATH_W) '$(srcdir)/dbtest.f90'; fi` check_real0-test.o: test.f90 $(FC) $(check_real0_FCFLAGS) $(FCFLAGS) -c -o check_real0-test.o `test -f 'test.f90' || echo '$(srcdir)/'`test.f90 check_real0-test.obj: test.f90 $(FC) $(check_real0_FCFLAGS) $(FCFLAGS) -c -o check_real0-test.obj `if test -f 'test.f90'; then $(CYGPATH_W) 'test.f90'; else $(CYGPATH_W) '$(srcdir)/test.f90'; fi` check_real0-check_real0.o: check_real0.f90 $(FC) $(check_real0_FCFLAGS) $(FCFLAGS) -c -o check_real0-check_real0.o `test -f 'check_real0.f90' || echo '$(srcdir)/'`check_real0.f90 check_real0-check_real0.obj: check_real0.f90 $(FC) $(check_real0_FCFLAGS) $(FCFLAGS) -c -o check_real0-check_real0.obj `if test -f 'check_real0.f90'; then $(CYGPATH_W) 'check_real0.f90'; else $(CYGPATH_W) '$(srcdir)/check_real0.f90'; fi` dump_dballe-dump_dballe.o: dump_dballe.f90 $(FC) $(dump_dballe_FCFLAGS) $(FCFLAGS) -c -o dump_dballe-dump_dballe.o `test -f 'dump_dballe.f90' || echo '$(srcdir)/'`dump_dballe.f90 dump_dballe-dump_dballe.obj: dump_dballe.f90 $(FC) $(dump_dballe_FCFLAGS) $(FCFLAGS) -c -o dump_dballe-dump_dballe.obj `if test -f 'dump_dballe.f90'; then $(CYGPATH_W) 'dump_dballe.f90'; else $(CYGPATH_W) '$(srcdir)/dump_dballe.f90'; fi` dumpmsg_dballe-dumpmsg_dballe.o: dumpmsg_dballe.f90 $(FC) $(dumpmsg_dballe_FCFLAGS) $(FCFLAGS) -c -o dumpmsg_dballe-dumpmsg_dballe.o `test -f 'dumpmsg_dballe.f90' || echo '$(srcdir)/'`dumpmsg_dballe.f90 dumpmsg_dballe-dumpmsg_dballe.obj: dumpmsg_dballe.f90 $(FC) $(dumpmsg_dballe_FCFLAGS) $(FCFLAGS) -c -o dumpmsg_dballe-dumpmsg_dballe.obj `if test -f 'dumpmsg_dballe.f90'; then $(CYGPATH_W) 'dumpmsg_dballe.f90'; else $(CYGPATH_W) '$(srcdir)/dumpmsg_dballe.f90'; fi` genattr-genattr.o: genattr.f90 $(FC) $(genattr_FCFLAGS) $(FCFLAGS) -c -o genattr-genattr.o `test -f 'genattr.f90' || echo '$(srcdir)/'`genattr.f90 genattr-genattr.obj: genattr.f90 $(FC) $(genattr_FCFLAGS) $(FCFLAGS) -c -o genattr-genattr.obj `if test -f 'genattr.f90'; then $(CYGPATH_W) 'genattr.f90'; else $(CYGPATH_W) '$(srcdir)/genattr.f90'; fi` mkmsg-mkmsg.o: mkmsg.f90 $(FC) $(mkmsg_FCFLAGS) $(FCFLAGS) -c -o mkmsg-mkmsg.o `test -f 'mkmsg.f90' || echo '$(srcdir)/'`mkmsg.f90 mkmsg-mkmsg.obj: mkmsg.f90 $(FC) $(mkmsg_FCFLAGS) $(FCFLAGS) -c -o mkmsg-mkmsg.obj `if test -f 'mkmsg.f90'; then $(CYGPATH_W) 'mkmsg.f90'; else $(CYGPATH_W) '$(srcdir)/mkmsg.f90'; fi` mkmsg_sca-mkmsg-sca.o: mkmsg-sca.f90 $(FC) $(mkmsg_sca_FCFLAGS) $(FCFLAGS) -c -o mkmsg_sca-mkmsg-sca.o `test -f 'mkmsg-sca.f90' || echo '$(srcdir)/'`mkmsg-sca.f90 mkmsg_sca-mkmsg-sca.obj: mkmsg-sca.f90 $(FC) $(mkmsg_sca_FCFLAGS) $(FCFLAGS) -c -o mkmsg_sca-mkmsg-sca.obj `if test -f 'mkmsg-sca.f90'; then $(CYGPATH_W) 'mkmsg-sca.f90'; else $(CYGPATH_W) '$(srcdir)/mkmsg-sca.f90'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-dist_dballeincludeHEADERS: $(dist_dballeinclude_HEADERS) @$(NORMAL_INSTALL) test -z "$(dballeincludedir)" || $(MKDIR_P) "$(DESTDIR)$(dballeincludedir)" @list='$(dist_dballeinclude_HEADERS)'; test -n "$(dballeincludedir)" || list=; \ 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_HEADER) $$files '$(DESTDIR)$(dballeincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(dballeincludedir)" || exit $$?; \ done uninstall-dist_dballeincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(dist_dballeinclude_HEADERS)'; test -n "$(dballeincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(dballeincludedir)'; $(am__uninstall_files_from_dir) ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list=' $(TESTS) '; \ $(am__tty_colors); \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ col=$$red; res=XPASS; \ ;; \ *) \ col=$$grn; res=PASS; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xfail=`expr $$xfail + 1`; \ col=$$lgn; res=XFAIL; \ ;; \ *) \ failed=`expr $$failed + 1`; \ col=$$red; res=FAIL; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ col=$$blu; res=SKIP; \ fi; \ echo "$${col}$$res$${std}: $$tst"; \ done; \ if test "$$all" -eq 1; then \ tests="test"; \ All=""; \ else \ tests="tests"; \ All="All "; \ fi; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="$$All$$all $$tests passed"; \ else \ if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all $$tests failed"; \ else \ if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ if test "$$skip" -eq 1; then \ skipped="($$skip test was not run)"; \ else \ skipped="($$skip tests were not run)"; \ fi; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ if test "$$failed" -eq 0; then \ col="$$grn"; \ else \ col="$$red"; \ fi; \ echo "$${col}$$dashes$${std}"; \ echo "$${col}$$banner$${std}"; \ test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \ test -z "$$report" || echo "$${col}$$report$${std}"; \ echo "$${col}$$dashes$${std}"; \ test "$$failed" -eq 0; \ else :; fi 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 $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(dballeincludedir)"; 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: -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." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \ clean-libtool clean-noinstPROGRAMS 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-dist_dballeincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES 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 \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-dist_dballeincludeHEADERS \ uninstall-libLTLIBRARIES .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \ clean-libtool clean-noinstPROGRAMS ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am \ install-dist_dballeincludeHEADERS install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-libLTLIBRARIES \ 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 \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-dist_dballeincludeHEADERS \ uninstall-libLTLIBRARIES # 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: dballe-5.18/fortran/simple.h0000644000175000017500000004163611446473047012754 00000000000000#ifndef FDBA_SIMPLE_H #define FDBA_SIMPLE_H /* * fortran/simple - Interface for Fortran API implementations * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ namespace dballe { namespace fortran { struct API { static const signed char missing_byte; static const int missing_int; static const float missing_float; static const double missing_double; virtual ~API() {} /** * Reset the database contents, loading default report informations from a file. * * It only works in rewrite mode. * * @param handle * Handle to a DBALLE session * @param repinfofile * CSV file with the default report informations. See dba_reset() * documentation for the format of the file. If it is NULL or "\0", the * system default is used. * @return * The error indicator for the function */ virtual void scopa(const char* repinfofile = 0) = 0; /**@name enq* * @anchor enq * Functions used to read the output values of the DBALLE action routines * @{ */ /** * Read one integer value from the output record * * @param handle * Handle to a DBALLE session * @param parameter * Parameter to query. It can be the code of a WMO variable prefixed by \c * "B" (such as \c "B01023"); the code of a QC value prefixed by \c "*B" * (such as \c "*B01023") or a keyword among the ones defined in \ref * dba_record_keywords * @param value * Where the value will be returned * @return * The error indicator for the function */ virtual int enqi(const char* param) = 0; /** * Read one byte value from the output record * * @param handle * Handle to a DBALLE session * @param parameter * Parameter to query. It can be the code of a WMO variable prefixed by \c * "B" (such as \c "B01023"); the code of a QC value prefixed by \c "*B" * (such as \c "*B01023") or a keyword among the ones defined in \ref * dba_record_keywords * @param value * Where the value will be returned * @return * The error indicator for the function */ virtual signed char enqb(const char* param) = 0; /** * Read one real value from the output record * * @param handle * Handle to a DBALLE session * @param parameter * Parameter to query. It can be the code of a WMO variable prefixed by \c * "B" (such as \c "B01023"); the code of a QC value prefixed by \c "*B" * (such as \c "*B01023") or a keyword among the ones defined in \ref * dba_record_keywords * @param value * Where the value will be returned * @return * The error indicator for the function */ virtual float enqr(const char* param) = 0; /** * Read one real*8 value from the output record * * @param handle * Handle to a DBALLE session * @param parameter * Parameter to query. It can be the code of a WMO variable prefixed by \c * "B" (such as \c "B01023"); the code of a QC value prefixed by \c "*B" * (such as \c "*B01023") or a keyword among the ones defined in \ref * dba_record_keywords * @param value * Where the value will be returned * @return * The error indicator for the function */ virtual double enqd(const char* param) = 0; /** * Read one character value from the output record * * @param handle * Handle to a DBALLE session * @param parameter * Parameter to query. It can be the code of a WMO variable prefixed by \c * "B" (such as \c "B01023"); the code of a QC value prefixed by \c "*B" * (such as \c "*B01023") or a keyword among the ones defined in \ref * dba_record_keywords * @param value * Where the value will be returned * @return * The error indicator for the function */ virtual const char* enqc(const char* param) = 0; /*@}*/ /**@name set* * @anchor set * Functions used to read the input values for the DBALLE action routines *@{*/ /** * Set one integer value into the input record * * @param handle * Handle to a DBALLE session * @param parameter * Parameter to set. It can be the code of a WMO variable prefixed by \c * "B" (such as \c "B01023"); the code of a QC value prefixed by \c "*B" * (such as \c "*B01023") or a keyword among the ones defined in \ref * dba_record_keywords * @param value * The value to assign to the parameter * @return * The error indicator for the function */ virtual void seti(const char* param, int value) = 0; /** * Set one byte value into the input record * * @param handle * Handle to a DBALLE session * @param parameter * Parameter to set. It can be the code of a WMO variable prefixed by \c * "B" (such as \c "B01023"); the code of a QC value prefixed by \c "*B" * (such as \c "*B01023") or a keyword among the ones defined in \ref * dba_record_keywords * @param value * The value to assign to the parameter * @return * The error indicator for the function */ virtual void setb(const char* param, signed char value) = 0; /** * Set one real value into the input record * * @param handle * Handle to a DBALLE session * @param parameter * Parameter to set. It can be the code of a WMO variable prefixed by \c * "B" (such as \c "B01023"); the code of a QC value prefixed by \c "*B" * (such as \c "*B01023") or a keyword among the ones defined in \ref * dba_record_keywords * @param value * The value to assign to the parameter * @return * The error indicator for the function */ virtual void setr(const char* param, float value) = 0; /** * Set one real*8 value into the input record * * @param handle * Handle to a DBALLE session * @param parameter * Parameter to set. It can be the code of a WMO variable prefixed by \c * "B" (such as \c "B01023"); the code of a QC value prefixed by \c "*B" * (such as \c "*B01023") or a keyword among the ones defined in \ref * dba_record_keywords * @param value * The value to assign to the parameter * @return * The error indicator for the function */ virtual void setd(const char* param, double value) = 0; /** * Set one character value into the input record * * @param handle * Handle to a DBALLE session * @param parameter * Parameter to set. It can be the code of a WMO variable prefixed by \c * "B" (such as \c "B01023"); the code of a QC value prefixed by \c "*B" * (such as \c "*B01023") or a keyword among the ones defined in \ref * dba_record_keywords * @param value * The value to assign to the parameter * @return * The error indicator for the function */ virtual void setc(const char* param, const char* value) = 0; /** * Shortcut function to set query parameters to the anagraphical context * * @param handle * Handle to a DBALLE session * @return * The error indicator for the function */ virtual void setcontextana() = 0; /** * Shortcut function to read level data. * * @param handle * Handle to a DBALLE session * @retval ltype * Level type from the output record * @retval l1 * L1 from the output record * @retval l2 * L2 from the output record * @return * The error indicator for the function */ virtual void enqlevel(int& ltype1, int& l1, int& ltype2, int& l2) = 0; /** * Shortcut function to set level data. * * @param handle * Handle to a DBALLE session * @param ltype * Level type to set in the input record * @param l1 * L1 to set in the input record * @param l2 * L2 to set in the input record * @return * The error indicator for the function */ virtual void setlevel(int ltype1, int l1, int ltype2, int l2) = 0; /** * Shortcut function to read time range data. * * @param handle * Handle to a DBALLE session * @retval ptype * P indicator from the output record * @retval p1 * P1 from the output record * @retval p2 * P2 from the output record * @return * The error indicator for the function */ virtual void enqtimerange(int& ptype, int& p1, int& p2) = 0; /** * Shortcut function to set time range data. * * @param handle * Handle to a DBALLE session * @param ptype * P indicator to set in the input record * @param p1 * P1 to set in the input record * @param p2 * P2 to set in the input record * @return * The error indicator for the function */ virtual void settimerange(int ptype, int p1, int p2) = 0; /** * Shortcut function to read date information. * * @param handle * Handle to a DBALLE session * @retval year * Year from the output record * @retval month * Month the output record * @retval day * Day the output record * @retval hour * Hour the output record * @retval min * Minute the output record * @retval sec * Second the output record * @return * The error indicator for the function */ virtual void enqdate(int& year, int& month, int& day, int& hour, int& min, int& sec) = 0; /** * Shortcut function to set date information. * * @param handle * Handle to a DBALLE session * @param year * Year to set in the input record * @param month * Month to set in the input * @param day * Day to set in the input * @param hour * Hour to set in the input * @param min * Minute to set in the input * @param sec * Second to set in the input * @return * The error indicator for the function */ virtual void setdate(int year, int month, int day, int hour, int min, int sec) = 0; /** * Shortcut function to set minimum date for a query. * * @param handle * Handle to a DBALLE session * @param year * Minimum year to set in the query * @param month * Minimum month to set in the query * @param day * Minimum day to set in the query * @param hour * Minimum hour to set in the query * @param min * Minimum minute to set in the query * @param sec * Minimum second to set in the query * @return * The error indicator for the function */ virtual void setdatemin(int year, int month, int day, int hour, int min, int sec) = 0; /** * Shortcut function to set maximum date for a query. * * @param handle * Handle to a DBALLE session * @param year * Maximum year to set in the query * @param month * Maximum month to set in the query * @param day * Maximum day to set in the query * @param hour * Maximum hour to set in the query * @param min * Maximum minute to set in the query * @param sec * Maximum second to set in the query * @return * The error indicator for the function */ virtual void setdatemax(int year, int month, int day, int hour, int min, int sec) = 0; /*@}*/ /** * Remove one parameter from the input record * * @param handle * Handle to a DBALLE session * @param parameter * Parameter to remove. It can be the code of a WMO variable prefixed by \c * "B" (such as \c "B01023"); the code of a QC value prefixed by \c "*B" * (such as \c "*B01023") or a keyword among the ones defined in \ref * dba_record_keywords * @return * The error indicator for the function */ virtual void unset(const char* param) = 0; /** * Remove all parameters from the input record * * @param handle * Handle to a DBALLE session */ virtual void unsetall() = 0; /** * Count the number of elements in the anagraphical storage, and start a new * anagraphical query. * * Resulting anagraphical data can be retrieved with elencamele() * * @param handle * Handle to a DBALLE session * @param count * The count of elements * @return * The error indicator for the function */ virtual int quantesono() = 0; /** * Iterate through the anagraphical data. * * Every invocation of this function will return a new anagraphical data, or * fill fail with code DBA_ERR_NOTFOUND when there are no more anagraphical * data available. * * @param handle * Handle to a DBALLE session * @return * The error indicator for the function */ virtual void elencamele() = 0; /** * Submit a query to the database. * * The query results can be accessed with calls to dammelo. * * @param handle * Handle to a DBALLE session * @retval count * Number of values returned by the function * @return * The error indicator for the function */ virtual int voglioquesto() = 0; /** * Iterate through the query results data. * * Every invocation of this function will return a new result, or fill fail * with code DBA_ERR_NOTFOUND when there are no more results available. * * @param handle * Handle to a DBALLE session * @retval parameter * Contains the ID of the parameter retrieved by this fetch * @return * The error indicator for the function */ virtual const char* dammelo() = 0; /** * Insert a new item in the database. * * This function will fail if the database is open in data readonly mode, and * it will refuse to overwrite existing values if the database is open in data * add mode. * * If the database is open in pseudoana reuse mode, the pseudoana values * provided on input will be used to create a pseudoana record if it is * missing, but will be ignored if it is already present. If it is open in * pseudoana rewrite mode instead, the pseudoana values on input will be used * to replace all the existing pseudoana values. * * @param handle * Handle to a DBALLE session * @return * The error indicator for the function */ virtual void prendilo() = 0; /** * Remove all selected items from the database. * * This function will fail unless the database is open in data rewrite mode. * * @param handle * Handle to a DBALLE session * @return * The error indicator for the function */ virtual void dimenticami() = 0; /**@name QC functions * @anchor qc * Functions used to manipulate QC data. * * All these functions require some context data about the variable, which is * automatically available when the variable just came as the result of an * dammelo() or has just been inserted with an prendilo(). *@{ */ virtual int voglioancora() = 0; /** * Retrieve QC informations from the last variable returned by dammelo(). * * @param handle * Handle to a DBALLE session * @retval parameter * Contains the ID of the parameter retrieved by this fetch * @return * The error indicator for the function */ virtual const char* ancora() = 0; /** * Insert new QC informations for a variable of the current record. * * QC informations inserted are all those set by the functions seti(), * setc(), setr(), setd(), using an asterisk in front of the * variable name. * * Contrarily to prendilo(), this function resets all the QC informations * (but only the QC informations) previously set in input, so the values to be * inserted need to be explicitly set every time. * * This function will fail if the database is open in QC readonly mode, and it * will refuse to overwrite existing values if the database is open in QC add * mode. * * The variable referred by the QC informations can be specified in three ways: * * \li by variable code, using ::setc(handle, "*var", "Bxxyyy") * \li by variable id, using ::seti(handle, "*data_id", id) * \li unspecified, will use the last variable returned by ::dammelo * * @param handle * Handle to a DBALLE session * @return * The error indicator for the function */ virtual void critica() = 0; /** * Remove QC informations for a variable of the current record. * * The QC informations to be removed are set with: * \code * setc(handle, "*varlist", "*B33021,*B33003"); * \endcode * * The variable referred by the QC informations can be specified in three ways: * * \li by variable code, using ::setc(handle, "*var", "Bxxyyy") * \li by variable id, using ::seti(handle, "*data_id", id) * \li unspecified, will use the last variable returned by ::dammelo * * @param handle * Handle to a DBALLE session * @return * The error indicator for the function */ virtual void scusa() = 0; /*@}*/ virtual const char* spiegal(int ltype1, int l1, int ltype2, int l2) = 0; virtual const char* spiegat(int ptype, int p1, int p2) = 0; virtual const char* spiegab(const char* varcode, const char* value) = 0; // Function used for test purposes only virtual void test_input_to_output() = 0; }; } } /* vim:set ts=4 sw=4: */ #endif dballe-5.18/fortran/check-utils.h0000644000175000017500000000101511173330007013642 00000000000000!!! ******************** !!! * Utility functions !!! ******************** subroutine testcb(val) integer :: val character (len=1000) :: buf ier = idba_error_code() if (ier.ne.0) then print *,ier," testcb in ",val call idba_error_message(buf) print *,trim(buf) call idba_error_context(buf) print *,trim(buf) call idba_error_details(buf) print *,trim(buf) call exit (1) end if return endsubroutine testcb dballe-5.18/fortran/genattr.f900000644000175000017500000000370111450630635013256 00000000000000program tmp implicit none INCLUDE "dballef.h" integer,parameter :: nvar=5 real :: field(nvar),obsinc(nvar) character(len=6) :: var(nvar) INTEGER :: handle,handle_err,ana_id,debug,i ! gestione degli errori call idba_error_set_callback(0,idba_default_error_handler,debug,handle_err) call idba_messaggi(handle, "tmp.bufr", "w", "BUFR") ! vital statistics data call idba_setcontextana (handle) call idba_set (handle,"rep_memo","generic") call idba_set (handle,"lat",44.5) call idba_set (handle,"lon",10.0) call idba_set (handle,"mobile",0) call idba_set (handle,"block",16) call idba_set (handle,"station",144) !!!! e' cosi' per compatibilita' db call idba_prendilo (handle) call idba_enqi (handle,"ana_id",ana_id) call idba_unsetall (handle) call idba_setc (handle,"rep_memo","generic") call idba_seti (handle,"ana_id",ana_id) !!!! call idba_settimerange (handle,254,0,0) call idba_setdate (handle,2010,04,11,12,0,0) call idba_setlevel (handle,100,50000,0,0) var(1)="B11003" var(2)="B11004" var(3)="B12101" var(4)="B13003" var(5)="B07004" field(1)=5.5 field(2)=6.6 field(3)=273.15 field(4)=50. field(5)=55000 obsinc(1)=.5 obsinc(2)=.6 obsinc(3)=10. obsinc(4)=5. obsinc(5)=100. call idba_set(handle,"B08001",1) call idba_prendilo(handle) !call idba_unset(handle,"B08001") print *,"-------------------" ! cicle on 5 variables to write original data and obsevation increments do i=1,nvar print *,var(i),field(i),obsinc(i) ! add or rewrite new data call idba_set(handle,var(i),field(i)) call idba_prendilo(handle) call idba_set(handle,"*B33198",obsinc(i)) call idba_critica(handle) call idba_unset(handle,"*B33198") call idba_unset(handle,var(i)) end do call idba_set(handle,'query',"message generic") call idba_prendilo (handle) ! end session and connection call idba_fatto(handle) end program tmp dballe-5.18/fortran/dballef.h0000644000175000017500000002215411636363557013053 00000000000000 ! ! Interface file for DB-ALLe ! ! Copyright (C) 2005,2006 ARPA-SIM ! ! This program is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2 of the License. ! ! This program is distributed in the hope that it will be useful, ! but WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ! ! Author: Enrico Zini ! ! TODO: function o subroutine? ! missing value INTEGER, PARAMETER :: & dba_int_b = SELECTED_INT_KIND(1), & ! Byte integer dba_int_s = SELECTED_INT_KIND(4), & ! Short integer dba_int_l = SELECTED_INT_KIND(8) ! Long integer INTEGER, PARAMETER :: & dba_fp_s = SELECTED_REAL_KIND(6), & ! Single precision dba_fp_d = SELECTED_REAL_KIND(15) ! Double precision REAL, PARAMETER :: DBA_MVR = HUGE(1.0) !REAL(dba_kind=dba_fp_s), PARAMETER :: = HUGE(1.0_dba_fp_s) REAL(kind=dba_fp_d), PARAMETER :: DBA_MVD = HUGE(1.0_dba_fp_d) !REAL(kind=dba_fp_d), PARAMETER :: DBA_MVD = 1.79769D308 INTEGER, PARAMETER :: DBA_MVI = HUGE(0) INTEGER(kind=dba_int_b), PARAMETER :: DBA_MVB = HUGE(0_dba_int_b) CHARACTER(len=1), PARAMETER :: DBA_MVC = char(0) ! Get/Set routines interface idba_enq subroutine idba_enqb(handle,param,value) integer, intent(in) :: handle integer (kind=1),intent(out) :: value character (len=*), intent(in) :: param end subroutine idba_enqb subroutine idba_enqi(handle,param,value) integer, intent(in) :: handle integer, intent(out) :: value character (len=*), intent(in) :: param end subroutine idba_enqi subroutine idba_enqr(handle,param,value) integer, intent(in) :: handle real, intent(out) :: value character (len=*), intent(in) :: param end subroutine idba_enqr subroutine idba_enqd(handle,param,value) integer, intent(in) :: handle double precision, intent(out) :: value character (len=*), intent(in) :: param end subroutine idba_enqd subroutine idba_enqc(handle,param,value) integer, intent(in) :: handle character (len=*), intent(in) :: param character (len=*), intent(out) :: value end subroutine idba_enqc end interface interface idba_set subroutine idba_setb(handle,param,value) integer, intent(in) :: handle integer (kind=1), intent(in) :: value character (len=*), intent(in) :: param end subroutine idba_setb subroutine idba_seti(handle,param,value) integer, intent(in) :: handle,value character (len=*), intent(in) :: param end subroutine idba_seti subroutine idba_setr(handle,param,value) integer, intent(in) :: handle real, intent(in) :: value character (len=*), intent(in) :: param end subroutine idba_setr subroutine idba_setd(handle,param,value) integer, intent(in) :: handle double precision, intent(in) :: value character (len=*), intent(in) :: param end subroutine idba_setd subroutine idba_setc(handle,param,value) integer, intent(in) :: handle character (len=*), intent(in) :: param,value end subroutine idba_setc end interface interface ! Error handling routines integer function idba_error_code() end function idba_error_code subroutine idba_error_message(message) character (len=*), intent(out) :: message end subroutine idba_error_message subroutine idba_error_context(message) character (len=*), intent(out) :: message end subroutine idba_error_context subroutine idba_error_details(message) character (len=*), intent(out) :: message end subroutine idba_error_details subroutine idba_error_set_callback(code,func,data,handle) integer, intent(in) :: code external :: func integer, intent(in) :: data integer, intent(out) :: handle end subroutine idba_error_set_callback subroutine idba_error_remove_callback(handle) integer, intent(in) :: handle end subroutine idba_error_remove_callback integer function idba_default_error_handler(debug) logical, intent(in) :: debug end function idba_default_error_handler integer function idba_error_handler_tolerating_overflows(debug) logical, intent(in) :: debug end function idba_error_handler_tolerating_overflows ! Init/Shutdown routines subroutine idba_presentati(dbahandle, dsn, user, password) integer, intent(out) :: dbahandle character (len=*), intent(in) :: dsn,user,password end subroutine idba_presentati subroutine idba_arrivederci(dbahandle) integer, intent(in) :: dbahandle end subroutine idba_arrivederci subroutine idba_preparati(dbahandle, handle, anaflag, dataflag, attrflag) integer, intent(in) :: dbahandle integer, intent(out) :: handle character (len=*), intent(in) :: anaflag,dataflag,attrflag end subroutine idba_preparati subroutine idba_messaggi(handle, filename, mode, type) integer, intent(out) :: handle character (len=*), intent(in) :: filename,mode,type end subroutine idba_messaggi subroutine idba_fatto(handle) integer, intent(in) :: handle end subroutine idba_fatto subroutine idba_unset(handle,param) integer, intent(in) :: handle character (len=*), intent(in) :: param end subroutine idba_unset subroutine idba_unsetall(handle) integer, intent(in) :: handle end subroutine idba_unsetall subroutine idba_setcontextana(handle) integer, intent(in) :: handle end subroutine idba_setcontextana subroutine idba_enqlevel(handle,ltype1,l1,ltype2,l2) integer, intent(in) :: handle integer, intent(out) :: ltype1,l1,ltype2,l2 end subroutine idba_enqlevel subroutine idba_setlevel(handle,ltype1,l1,ltype2,l2) integer, intent(in) :: handle,ltype1,l1,ltype2,l2 end subroutine idba_setlevel subroutine idba_enqtimerange(handle,ptype,p1,p2) integer, intent(in) :: handle integer, intent(out) :: ptype,p1,p2 end subroutine idba_enqtimerange subroutine idba_settimerange(handle,ptype,p1,p2) integer, intent(in) :: handle,ptype,p1,p2 end subroutine idba_settimerange subroutine idba_enqdate(handle,year,month,day,hour,min,sec) integer, intent(in) :: handle integer, intent(out) :: year,month,day,hour,min,sec end subroutine idba_enqdate subroutine idba_setdate(handle,year,month,day,hour,min,sec) integer, intent(in) :: handle,year,month,day,hour,min,sec end subroutine idba_setdate subroutine idba_setdatemin(handle,year,month,day,hour,min,sec) integer, intent(in) :: handle,year,month,day,hour,min,sec end subroutine idba_setdatemin subroutine idba_setdatemax(handle,year,month,day,hour,min,sec) integer, intent(in) :: handle,year,month,day,hour,min,sec end subroutine idba_setdatemax ! Action routines subroutine idba_scopa(handle, repinfofile) integer, intent(in) :: handle character (len=*), intent(in) :: repinfofile end subroutine idba_scopa subroutine idba_quantesono(handle, count) integer, intent(in) :: handle integer, intent(out) :: count end subroutine idba_quantesono subroutine idba_elencamele(handle) integer, intent(in) :: handle end subroutine idba_elencamele subroutine idba_voglioquesto(handle, count) integer, intent(in) :: handle integer, intent(out) :: count end subroutine idba_voglioquesto subroutine idba_dammelo(handle,param) integer, intent(in) :: handle character (len=*), intent(out) :: param end subroutine idba_dammelo subroutine idba_prendilo(handle) integer, intent(in) :: handle end subroutine idba_prendilo subroutine idba_dimenticami(handle) integer, intent(in) :: handle end subroutine idba_dimenticami subroutine idba_voglioancora(handle, count) integer, intent(in) :: handle integer, intent(out) :: count end subroutine idba_voglioancora subroutine idba_ancora(handle,param) integer, intent(in) :: handle character (len=*), intent(out) :: param end subroutine idba_ancora subroutine idba_critica(handle) integer, intent(in) :: handle end subroutine idba_critica subroutine idba_scusa(handle) integer, intent(in) :: handle end subroutine idba_scusa ! Pretty printing routines subroutine idba_spiegal(handle,ltype1,l1,ltype2,l2,result) integer, intent(in) :: handle,ltype1,l1,ltype2,l2 character (len=*), intent(out) :: result end subroutine idba_spiegal subroutine idba_spiegat(handle,ptype,p1,p2,result) integer, intent(in) :: handle,ptype,p1,p2 character (len=*), intent(out) :: result end subroutine idba_spiegat subroutine idba_spiegab(handle,varcode,var,result) integer, intent(in) :: handle character (len=*), intent(in) :: varcode,var character (len=*), intent(out) :: result end subroutine idba_spiegab end interface dballe-5.18/fortran/test-utils-core.cc0000644000175000017500000001611111641562125014643 00000000000000/* * core/test-utils-core - Test utility functions for the core module * * Copyright (C) 2005--2011 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "dballe/core/test-utils-core.h" #include #include #include using namespace wreport; using namespace std; namespace dballe { namespace tests { static std::string tag; /* static void _ensureRecordHas(const char* file, int line, dba_record rec, const char* key, int val) { int v; INNER_CHECKED(dba_enqi(rec, key, &v)); ensure_equals(v, val); } static void _ensureRecordHas(const char* file, int line, dba_record rec, const char* key, double val) { double v; INNER_CHECKED(dba_enqd(rec, key, &v)); ensure_equals(v, val); } static void _ensureRecordHas(const char* file, int line, dba_record rec, const char* key, const char* val) { const char* v; INNER_CHECKED(dba_enqc(rec, key, &v)); gen_ensure(strcmp(v, val) == 0); } #define ensureRecordHas(...) _ensureRecordHas(__FILE__, __LINE__, __VA_ARGS__) */ const static Varcode generator_varcodes[] = { WR_VAR(0, 1, 1), WR_VAR(0, 1, 2), WR_VAR(0, 1, 8), WR_VAR(0, 1, 11), WR_VAR(0, 1, 12), WR_VAR(0, 1, 13), WR_VAR(0, 2, 1), WR_VAR(0, 2, 2), WR_VAR(0, 2, 5), WR_VAR(0, 2, 11), WR_VAR(0, 2, 12), WR_VAR(0, 2, 61), WR_VAR(0, 2, 62), WR_VAR(0, 2, 63), WR_VAR(0, 2, 70), WR_VAR(0, 4, 1), WR_VAR(0, 4, 2), WR_VAR(0, 4, 3), WR_VAR(0, 4, 4), WR_VAR(0, 4, 5), WR_VAR(0, 5, 1), WR_VAR(0, 6, 1), WR_VAR(0, 7, 30), WR_VAR(0, 7, 2), WR_VAR(0, 7, 31), WR_VAR(0, 8, 1), WR_VAR(0, 8, 4), WR_VAR(0, 8, 21), WR_VAR(0, 10, 3), WR_VAR(0, 10, 4), WR_VAR(0, 10, 51), WR_VAR(0, 10, 61), WR_VAR(0, 10, 63), WR_VAR(0, 10, 197), WR_VAR(0, 11, 1), WR_VAR(0, 11, 2), WR_VAR(0, 11, 3), WR_VAR(0, 11, 4), }; #if 0 generator::~generator() { for (std::vector::iterator i = reused_pseudoana_fixed.begin(); i != reused_pseudoana_fixed.end(); i++) dba_record_delete(*i); for (std::vector::iterator i = reused_pseudoana_mobile.begin(); i != reused_pseudoana_mobile.end(); i++) dba_record_delete(*i); for (std::vector::iterator i = reused_context.begin(); i != reused_context.end(); i++) dba_record_delete(*i); } dba_err generator::fill_pseudoana(dba_record rec, bool mobile) { dba_record ana; if ((mobile && reused_pseudoana_mobile.empty()) || (!mobile && reused_pseudoana_fixed.empty()) || rnd(0.3)) { DBA_RUN_OR_RETURN(dba_record_create(&ana)); /* Pseudoana */ DBA_RUN_OR_RETURN(dba_record_key_setd(ana, DBA_KEY_LAT, rnd(-90, 90))); DBA_RUN_OR_RETURN(dba_record_key_setd(ana, DBA_KEY_LON, rnd(-180, 180))); if (mobile) { DBA_RUN_OR_RETURN(dba_record_key_setc(ana, DBA_KEY_IDENT, rnd(10).c_str())); DBA_RUN_OR_RETURN(dba_record_key_seti(ana, DBA_KEY_MOBILE, 1)); reused_pseudoana_mobile.push_back(ana); } else { //DBA_RUN_OR_RETURN(dba_record_key_seti(ana, DBA_KEY_BLOCK, rnd(0, 99))); //DBA_RUN_OR_RETURN(dba_record_key_seti(ana, DBA_KEY_STATION, rnd(0, 999))); DBA_RUN_OR_RETURN(dba_record_key_seti(ana, DBA_KEY_MOBILE, 0)); reused_pseudoana_fixed.push_back(ana); } } else { if (mobile) ana = reused_pseudoana_mobile[rnd(0, reused_pseudoana_mobile.size() - 1)]; else ana = reused_pseudoana_fixed[rnd(0, reused_pseudoana_fixed.size() - 1)]; } DBA_RUN_OR_RETURN(dba_record_add(rec, ana)); return dba_error_ok(); } dba_err generator::fill_context(dba_record rec) { dba_record ctx; if (reused_context.empty() || rnd(0.7)) { DBA_RUN_OR_RETURN(dba_record_create(&ctx)); /* Context */ DBA_RUN_OR_RETURN(dba_record_key_seti(ctx, DBA_KEY_YEAR, rnd(2002, 2005))); DBA_RUN_OR_RETURN(dba_record_key_seti(ctx, DBA_KEY_MONTH, rnd(1, 12))); DBA_RUN_OR_RETURN(dba_record_key_seti(ctx, DBA_KEY_DAY, rnd(1, 28))); DBA_RUN_OR_RETURN(dba_record_key_seti(ctx, DBA_KEY_HOUR, rnd(0, 23))); DBA_RUN_OR_RETURN(dba_record_key_seti(ctx, DBA_KEY_MIN, rnd(0, 59))); DBA_RUN_OR_RETURN(dba_record_key_seti(ctx, DBA_KEY_LEVELTYPE1, rnd(0, 300))); DBA_RUN_OR_RETURN(dba_record_key_seti(ctx, DBA_KEY_L1, rnd(0, 100000))); DBA_RUN_OR_RETURN(dba_record_key_seti(ctx, DBA_KEY_LEVELTYPE2, rnd(0, 300))); DBA_RUN_OR_RETURN(dba_record_key_seti(ctx, DBA_KEY_L2, rnd(0, 100000))); DBA_RUN_OR_RETURN(dba_record_key_seti(ctx, DBA_KEY_PINDICATOR, rnd(0, 300))); DBA_RUN_OR_RETURN(dba_record_key_seti(ctx, DBA_KEY_P1, rnd(0, 100000))); DBA_RUN_OR_RETURN(dba_record_key_seti(ctx, DBA_KEY_P2, rnd(0, 100000))); DBA_RUN_OR_RETURN(dba_record_key_seti(ctx, DBA_KEY_REP_COD, rnd(105, 149))); reused_context.push_back(ctx); } else { ctx = reused_context[rnd(0, reused_context.size() - 1)]; } DBA_RUN_OR_RETURN(dba_record_add(rec, ctx)); return dba_error_ok(); } dba_err generator::fill_record(dba_record rec) { DBA_RUN_OR_RETURN(fill_pseudoana(rec, rnd(0.8))); DBA_RUN_OR_RETURN(fill_context(rec)); DBA_RUN_OR_RETURN(dba_record_var_setc(rec, generator_varcodes[rnd(0, sizeof(generator_varcodes) / sizeof(dba_varcode))], "1")); return dba_error_ok(); } #endif #if 0 dba_err read_file(dba_encoding type, const std::string& name, dba_raw_consumer& cons) { dba_err err = DBA_OK; dba_file file = open_test_data(name.c_str(), type); dba_rawmsg raw = 0; int found; DBA_RUN_OR_GOTO(cleanup, dba_rawmsg_create(&raw)); DBA_RUN_OR_GOTO(cleanup, dba_file_read(file, raw, &found)); while (found) { DBA_RUN_OR_GOTO(cleanup, cons.consume(raw)); DBA_RUN_OR_GOTO(cleanup, dba_file_read(file, raw, &found)); } cleanup: if (file) dba_file_delete(file); if (raw) dba_rawmsg_delete(raw); return err == DBA_OK ? dba_error_ok() : err; } #endif std::string datafile(const std::string& fname) { const char* testdatadirenv = getenv("DBA_TESTDATA"); std::string testdatadir = testdatadirenv ? testdatadirenv : "."; return testdatadir + "/" + fname; } auto_ptr _open_test_data(const wibble::tests::Location& loc, const char* filename, Encoding type) { try { return auto_ptr(File::create(type, datafile(filename), "r")); } catch (wreport::error& e) { throw tut::failure(loc.msg(e.what())); } } auto_ptr _read_rawmsg(const wibble::tests::Location& loc, const char* filename, Encoding type) { try { auto_ptr f = _open_test_data(loc, filename, type); auto_ptr res(new Rawmsg); inner_ensure(f->read(*res)); return res; } catch (wreport::error& e) { throw tut::failure(loc.msg(e.what())); } } } } // vim:set ts=4 sw=4: dballe-5.18/fortran/error.cc0000644000175000017500000001472011450602637012736 00000000000000/* * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ /** @file * @ingroup fortranfull * Error inspection functions for Dballe. * * These funtions closely wrap the Dballe functions in dba_error.h */ #include "handles.h" #include #include #include #include extern "C" { #include } #define MAX_CALLBACKS 50 using namespace wreport; namespace { typedef void (*fdba_error_callback)(INTEGER(data)); struct HErrcb : public dballe::fortran::HBase { ErrorCode error; fdba_error_callback cb; int data; void start() { dballe::fortran::HBase::start(); } void stop() { dballe::fortran::HBase::stop(); } // Check if this callback should be triggered by this error code // If it should, invoke the callback void check_invoke(ErrorCode code) { if (error == 0 || error == code) cb(&data); } }; struct dballe::fortran::Handler herr; static ErrorCode last_err_code = WR_ERR_NONE; static char last_err_msg[1024]; } namespace dballe { namespace fortran { static int usage_refcount = 0; void error_init() { if (usage_refcount > 0) return; herr.init("Error Handling", "MAX_CALLBACKS"); ++usage_refcount; } int error(wreport::error& e) { last_err_code = e.code(); strncpy(last_err_msg, e.what(), 1024); size_t todo = herr.in_use; for (int i = 0; todo && i < MAX_CALLBACKS; ++i) if (herr.records[i].used) { herr.records[i].check_invoke(last_err_code); --todo; } return 1; } int success() { last_err_code = WR_ERR_NONE; last_err_msg[0] = 0; return 0; } } } using namespace dballe; extern "C" { // FDBA_HANDLE_BODY(errcb, MAX_CALLBACKS, "Error handling callbacks") /** * Return the error code for the last error that happened * * See @ref dba_error_code() * * @return * The error code. Please see the documentation of ::dba_err_code for the * possible values. */ F77_INTEGER_FUNCTION(idba_error_code)() { return last_err_code; } /** * Return the error message for the last error that happened. * * The error message is just a description of the error code. To see more * details of the specific condition that caused the error, use * fdba_error_context() and fdba_error_details() * * See @ref dba_error_message() * * @param message * The string holding the error messag. If the string is not long enough, it * will be truncated. */ F77_SUBROUTINE(idba_error_message)(CHARACTER(message) TRAIL(message)) { GENPTR_CHARACTER(message) cnfExprt(last_err_msg, message, message_length); } /** * Return a string describing the context in which the error happened. * * This string describes what the code that failed was trying to do. * * See @ref dba_error_context() * * @param message * The string holding the error context. If the string is not long enough, * it will be truncated. */ F77_SUBROUTINE(idba_error_context)(CHARACTER(message) TRAIL(message)) { GENPTR_CHARACTER(message) cnfExprt("", message, message_length); } /** * Return a string with additional details about the error. * * This string contains additional details about the error in case the code was * able to get extra informations about it, for example by querying the error * functions of an underlying module. * * See @ref dba_error_details() * * @param message * The string holding the error details. If the string is not long enough, * it will be truncated. */ F77_SUBROUTINE(idba_error_details)(CHARACTER(message) TRAIL(message)) { GENPTR_CHARACTER(message) cnfExprt("", message, message_length); } /** * Set a callback to be invoked when an error of a specific kind happens. * * @param code * The error code (See @ref ::dba_err_code) of the error that triggers this * callback. If DBA_ERR_NONE is used, then the callback is invoked on all * errors. * @param func * The function to be called. * @param data * An arbitrary integer data that is passed verbatim to the callback function * when invoked. * @retval handle * A handle that can be used to remove the callback * @return * The error indicator for the function */ F77_INTEGER_FUNCTION(idba_error_set_callback)( INTEGER(code), SUBROUTINE(func), INTEGER(data), INTEGER(handle)) { GENPTR_INTEGER(code) GENPTR_SUBROUTINE(func) GENPTR_INTEGER(data) GENPTR_INTEGER(handle) // Initialise the error library in case it has not been done yet fortran::error_init(); *handle = herr.request(); HErrcb& h = herr.get(*handle); h.error = (ErrorCode)*code; h.cb = (fdba_error_callback)func; h.data = *data; return fortran::success(); } /** * Remove a callback set previously. * * @param handle * The handle previously returned by idba_error_set_callback * @return * The error indicator for the function */ F77_INTEGER_FUNCTION(idba_error_remove_callback)(INTEGER(handle)) { GENPTR_INTEGER(handle) herr.release(*handle); return fortran::success(); } /** * Default callback that prints a message and exits. * * The message is printed only if a non-zero value is supplied as user data */ F77_INTEGER_FUNCTION(idba_default_error_handler)(INTEGER(debug)) { GENPTR_INTEGER(debug) if (*debug) fprintf(stderr, "DB-All.e error %d: %s\n", last_err_code, last_err_msg); exit(1); } F77_INTEGER_FUNCTION(idba_default_error_handle)(INTEGER(debug)) { GENPTR_INTEGER(debug) if (*debug) fprintf(stderr, "DB-All.e error %d: %s\n", last_err_code, last_err_msg); exit(1); } /** * Default callback that prints a message and exists, except in case of overflows. * * In case of overflows it prints a warning and continues execution */ F77_INTEGER_FUNCTION(idba_error_handle_tolerating_overflows)(INTEGER(debug)) { GENPTR_INTEGER(debug) if (last_err_code != WR_ERR_NOTFOUND) { if (*debug) fprintf(stderr, "DB-All.e error %d: %s\n", last_err_code, last_err_msg); exit(1); } return 0; } } dballe-5.18/fortran/msgapi.h0000644000175000017500000000622211450626735012732 00000000000000#ifndef FDBA_MSGAPI_H #define FDBA_MSGAPI_H /* * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "commonapi.h" #include namespace wreport { struct Var; } namespace dballe { struct File; struct Msgs; struct Msg; namespace msg { struct Importer; struct Exporter; } namespace fortran { class MsgAPI : public CommonAPIImplementation { protected: enum { STATE_QUANTESONO = 1, STATE_VOGLIOQUESTO = 2, STATE_EOF = 4, }; File* file; /** * State flag to track what actions have been performed in order to decide * what to do next */ unsigned int state; /// Importer (NULL if we export) msg::Importer* importer; /// Exporter (NULL if we import) msg::Exporter* exporter; /// Template selected for exporter (empty if auto detect) std::string exporter_template; /// Message being written Msgs* msgs; /// Message subset being written Msg* wmsg; /// Last variables written with prendilo std::vector vars; /// Level for vars Level vars_level; /// Time range for vars Trange vars_trange; size_t curmsgidx; int iter_ctx; int iter_var; /// Category set for the message that we are writing int cached_cat; /// Subcategory set for the message that we are writing int cached_subcat; /// Local category set for the message that we are writing int cached_lcat; /** * Read the next message * @returns * true if there was a next message, false if we reached end of file */ bool readNextMessage(); /** * Increment message iterators * @returns * true if it could move on, false if we are at the end */ bool incrementMsgIters(); /** * Get a pointer to the current message being read or written */ Msg* curmsg(); void flushVars(); void flushSubset(); void flushMessage(); public: /** * @param fname * the name of the file to open * @param mode * the fopen-style mode to use when opening the file * @param type * the encoding to use for the file. It can be "BUFR", "CREX", "AOF" * (read only) or "AUTO" (read only). */ MsgAPI(const char* fname, const char* mode, const char* type); virtual ~MsgAPI(); virtual void scopa(const char* repinfofile = 0); virtual int quantesono(); virtual void elencamele(); virtual int voglioquesto(); virtual const char* dammelo(); virtual void prendilo(); virtual void dimenticami(); virtual int voglioancora(); virtual void critica(); virtual void scusa(); }; } } /* vim:set ts=4 sw=4: */ #endif dballe-5.18/fortran/Makefile.am0000644000175000017500000000536411705552373013342 00000000000000if DO_DBALLEF INCLUDES = -I$(top_srcdir) $(WREPORT_CFLAGS) # libdballef dballeincludedir = $(includedir)/dballe # Include the F90 interface file as well dist_dballeinclude_HEADERS = dballef.h dist_noinst_HEADERS = simple.h commonapi.h dbapi.h msgapi.h handles.h lib_LTLIBRARIES = libdballef.la libdballef_la_SOURCES = \ error.cc \ simple.cc \ commonapi.cc \ msgapi.cc \ binding.cc libdballef_la_LIBADD = ../dballe/libdballe.la -lcnf libdballef_la_LDFLAGS = -version-info @LIBDBALLEF_VERSION_INFO@ if DO_DBALLE_DB libdballef_la_SOURCES += \ dbapi.cc endif # # Unit testing # TESTS_ENVIRONMENT = $(top_srcdir)/extra/runtest check_PROGRAMS = check_missing_msg tut_test TESTS = $(check_PROGRAMS) testlib = test.f90 dbtestlib = dbtest.f90 $(testlib) CXXFLAGS += -O0 tut_test_SOURCES = \ msgapi-tut.cc \ test-utils-core.cc \ tut-main.cpp tut_test_LDADD = \ libdballef.la \ ../dballe/libdballe.la \ $(WREPORT_LIBS) \ $(WIBBLE_LIBS) check_missing_msg_SOURCES = $(testlib) check_missing_msg.f90 check_missing_msg_LDADD = ./libdballef.la -lcnf -lpopt check_missing_msg_FCFLAGS = -g if DO_DBALLE_DB check_PROGRAMS += check_real0 check_range check_fdballe check_attrs check_missing check_cached_anaid check_real0_SOURCES = $(dbtestlib) check_real0.f90 check_real0_LDADD = ./libdballef.la -lcnf -lpopt check_real0_FCFLAGS = -g check_range_SOURCES = $(dbtestlib) check_range.f90 check_range_LDADD = ./libdballef.la -lcnf -lpopt check_range_FCFLAGS = -g check_fdballe_SOURCES = $(dbtestlib) check_fdballe.f90 check_fdballe_LDADD = ./libdballef.la -lcnf -lpopt check_fdballe_FCFLAGS = -g check_attrs_SOURCES = $(dbtestlib) check_attrs.f90 check_attrs_LDADD = ./libdballef.la -lcnf -lpopt check_attrs_FCFLAGS = -g check_missing_SOURCES = $(dbtestlib) check_missing.f90 check_missing_LDADD = ./libdballef.la -lcnf -lpopt check_missing_FCFLAGS = -g check_cached_anaid_SOURCES = $(dbtestlib) check_cached_anaid.f90 check_cached_anaid_LDADD = ./libdballef.la -lcnf -lpopt check_cached_anaid_FCFLAGS = -g endif noinst_PROGRAMS = dumpmsg_dballe mkmsg mkmsg-sca genattr dumpmsg_dballe_SOURCES = dumpmsg_dballe.f90 dumpmsg_dballe_LDADD = ../fortran/libdballef.la -lcnf -lpopt dumpmsg_dballe_FCFLAGS = -g mkmsg_SOURCES = mkmsg.f90 mkmsg_LDADD = ../fortran/libdballef.la -lcnf -lpopt mkmsg_FCFLAGS = -g mkmsg_sca_SOURCES = mkmsg-sca.f90 mkmsg_sca_LDADD = ../fortran/libdballef.la -lcnf -lpopt mkmsg_sca_FCFLAGS = -g genattr_SOURCES = genattr.f90 genattr_LDADD = ../fortran/libdballef.la -lcnf -lpopt genattr_FCFLAGS = -g if DO_DBALLE_DB noinst_PROGRAMS += dump_dballe dump_dballe_SOURCES = dump_dballe.f90 dump_dballe_LDADD = ../fortran/libdballef.la -lcnf -lpopt dump_dballe_FCFLAGS = -g endif EXTRA_DIST = fortran.dox check-utils.h error.h CLEANFILES = test.mod dbtest.mod endif dballe-5.18/fortran/mkmsg-sca.f900000644000175000017500000000370311466256035013503 00000000000000 program mkmsg ! **************************** ! * Create a test message file ! **************************** integer handle, nstaz, ndata, nattr integer i, i1, i2, tmp integer id,height,codrete character fname*256,encoding*10,cname*20,rete*20,value*255 character btable*10,starbtable*10 real*8 dlat,dlon external errorrep call idba_error_set_callback(0, errorrep, 2, i) ! Open a session call getarg(1,fname) call getarg(2,encoding) call idba_messaggi(handle, fname, "w", encoding) ! Write a measured value call idba_unsetall(handle) call idba_setlevel(handle, 1, 2, 3, 4) call idba_settimerange(handle, 5, 6, 7) call idba_seti(handle,"B12101",300) call idba_prendilo(handle) ! Write a station value call idba_unsetall(handle) call idba_setcontextana(handle) call idba_setc(handle,"rep_memo","temp") call idba_seti(handle,"block",1) call idba_setc(handle,'query',"message generic") call idba_prendilo(handle) ! Done call idba_fatto(handle) call exit (0) end ! ******************** ! * Utility functions ! ******************** ! Compute the length of a string integer function istrlen(string) character string*(*) istrlen = len(string) do while ((string(istrlen:istrlen).eq." " .or. & string(istrlen:istrlen).eq."").and. & istrlen.gt.0) istrlen = istrlen - 1 enddo return end subroutine errorrep(val) integer val character buf*1000 ier = idba_error_code() if (ier.ne.0) then print *,ier," error in ",val call idba_error_message(buf) print *,buf(:istrlen(buf)) call idba_error_context(buf) print *,buf(:istrlen(buf)) call idba_error_details(buf) print *,buf(:istrlen(buf)) call exit (1) end if return end dballe-5.18/fortran/dump_dballe.f900000644000175000017500000000617211240576034014066 00000000000000 program dump_dballe ! ***************************************** ! * Dump the contents of a dballe database ! ***************************************** integer dbahandle, handle, handle_ana, nstaz, ndata, nattr integer i, i1, i2, tmp integer id,height,codrete character cname*20,rete*20,value*255,avalue*255 character btable*10,starbtable*10 real dlat,dlon external errorrep call idba_error_set_callback(0, errorrep, 2, i) ! Database login call idba_presentati(dbahandle, "test", "enrico", "") ! Open a session call idba_preparati(dbahandle, handle_ana, "read", "read", "read") call idba_preparati(dbahandle, handle, "read", "read", "read") ! Query all the stations call idba_quantesono(handle_ana, nstaz) write (*,*) nstaz," stazioni:" do i=1, nstaz call idba_elencamele(handle_ana) call idba_enqc(handle_ana, "name", cname) call idba_enqi(handle_ana, "ana_id", id) call idba_enqr(handle_ana, "lat", dlat) call idba_enqr(handle_ana, "lon", dlon) call idba_enqi(handle_ana, "height", height) call idba_enqc(handle_ana,"rep_memo",rete) call idba_enqi(handle_ana,"rep_cod",codrete) write (*,*) "Staz ",id," (",dlat,",",dlon,") '", & cname(:istrlen(cname)),"' h:",height, & " ",rep_memo,":",rep_cod call idba_seti(handle,"ana_id",id) call idba_voglioquesto(handle,ndata) write (*,*) " ",ndata," dati:" do i1=1, ndata call idba_dammelo(handle,btable) call idba_enqc(handle,btable,value) write (*,*) ' var ',btable(:istrlen(btable)),": ", & value(:istrlen(btable)) call idba_enqi(handle,"!context_id",tmp) write (*,*) " CTX: ",tmp call idba_voglioancora (handle,nattr) write (*,*) " ",nattr," attributi:" do i2=1, nattr call idba_ancora(handle,starbtable) call idba_enqc(handle,starbtable,avalue) write(*,*) " attr ",starbtable(:istrlen(starbtable)), & ": ",avalue(:istrlen(avalue)) enddo enddo enddo call idba_fatto(handle_ana) call idba_fatto(handle) call idba_arrivederci(dbahandle) call exit (0) end ! ******************** ! * Utility functions ! ******************** ! Compute the length of a string integer function istrlen(string) character string*(*) istrlen = len(string) do while ((string(istrlen:istrlen).eq." " .or. & string(istrlen:istrlen).eq."").and. & istrlen.gt.0) istrlen = istrlen - 1 enddo return end subroutine errorrep(val) integer val character buf*1000 ier = idba_error_code() if (ier.ne.0) then print *,ier," error in ",val call idba_error_message(buf) print *,buf(:istrlen(buf)) call idba_error_context(buf) print *,buf(:istrlen(buf)) call idba_error_details(buf) print *,buf(:istrlen(buf)) call exit (1) end if return end dballe-5.18/fortran/check_cached_anaid.f900000644000175000017500000000357411705552255015326 00000000000000program check_fdballe ! ***************************************** ! * Test suite for DBALLE Fortran bindings ! ***************************************** include "dballef.h" integer :: dbahandle, handle,i,i1,i2,i3,i4,i5,i6,ival,saved_id integer :: debug,handle_err real :: rval double precision :: dval character (len=10) :: param character (len=255) :: cval character (len=160) :: dsn call getenv("DBA_DB", dsn) if (dsn=="") then dsn = "sqlite:tmp.sqlite" end if print *,dsn call idba_error_set_callback(0,idba_default_error_handler,1,handle_err) ! Open a session call idba_presentati(dbahandle, dsn, char(0), char(0)) call idba_preparati(dbahandle, handle, "write", "write", "write") ! Clear the database call idba_scopa(handle, "") ! Insert some data call idba_seti(handle, "rep_cod", 1) call idba_setd(handle, "lat", 30D00) call idba_setr(handle, "lon", 10.0) call idba_setc(handle, "mobile", "0") call idba_setcontextana(handle) call idba_prendilo(handle) ! Try to read the id of the pseudoana data just inserted call idba_enqi(handle, "ana_id", saved_id) call idba_unsetall(handle) call idba_seti(handle, "ana_id", saved_id) call idba_seti(handle, "year", 2006) call idba_seti(handle, "month", 1) call idba_seti(handle, "day", 2) call idba_seti(handle, "hour", 3) call idba_seti(handle, "min", 4) call idba_setc(handle, "leveltype1", "1") call idba_seti(handle, "l1", 1) call idba_setc(handle, "leveltype2", "1") call idba_seti(handle, "l2", 1) call idba_seti(handle, "pindicator", 20) call idba_seti(handle, "p1", 1) call idba_seti(handle, "p2", 1) call idba_seti(handle, "rep_cod", 1) call idba_setc(handle, "B01011", "DB-All.e!") ! Perform the insert call idba_prendilo(handle) call idba_unset(handle,"B01011") call idba_setc(handle, "B01011", "seconda") ! Perform the insert call idba_prendilo(handle) call exit (0) end program check_fdballe dballe-5.18/fortran/error.h0000644000175000017500000000222711446467363012611 00000000000000/* * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #ifndef FDBA_ERROR_H #define FDBA_ERROR_H #include namespace dballe { struct DB; namespace fortran { struct API; /// Initialise error handlers void error_init(); /// Digest an exception turning it into a fortran API result code int error(wreport::error& e); /// Return a success code, updating the error information accordingly int success(); } } #endif dballe-5.18/fortran/commonapi.cc0000644000175000017500000003106611526713066013574 00000000000000/* * fortran/commonapi - Common parts of all Fortran API implementations * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ //#define _GNU_SOURCE /* _GNU_SOURCE is defined to have asprintf */ #include "commonapi.h" #include #include #include // snprintf #include #include #include #include using namespace wreport; using namespace std; namespace dballe { namespace fortran { CommonAPIImplementation::CommonAPIImplementation() : perms(0), qc_iter(-1), qc_count(0) { } CommonAPIImplementation::~CommonAPIImplementation() { } void CommonAPIImplementation::set_permissions(const char* anaflag, const char* dataflag, const char* attrflag) { if (strcasecmp("read", anaflag) == 0) perms |= PERM_ANA_RO; if (strcasecmp("write", anaflag) == 0) perms |= PERM_ANA_WRITE; if (strcasecmp("read", dataflag) == 0) perms |= PERM_DATA_RO; if (strcasecmp("add", dataflag) == 0) perms |= PERM_DATA_ADD; if (strcasecmp("write", dataflag) == 0) perms |= PERM_DATA_WRITE; if (strcasecmp("read", attrflag) == 0) perms |= PERM_ATTR_RO; if (strcasecmp("add", attrflag) == 0) perms |= PERM_ATTR_ADD; if (strcasecmp("write", attrflag) == 0) perms |= PERM_ATTR_WRITE; if ((perms & (PERM_ANA_RO | PERM_ANA_WRITE)) == 0) throw error_consistency("pseudoana should be opened in either 'read' or 'write' mode"); if ((perms & (PERM_DATA_RO | PERM_DATA_ADD | PERM_DATA_WRITE)) == 0) throw error_consistency("data should be opened in one of 'read', 'add' or 'write' mode"); if ((perms & (PERM_ATTR_RO | PERM_ATTR_ADD | PERM_ATTR_WRITE)) == 0) throw error_consistency("attr should be opened in one of 'read', 'add' or 'write' mode"); if (perms & PERM_ANA_RO && perms & PERM_DATA_WRITE) throw error_consistency("when data is 'write' ana must also be set to 'write', because deleting data can potentially also delete pseudoana"); if (perms & PERM_ATTR_RO && perms & PERM_DATA_WRITE) throw error_consistency("when data is 'write' attr must also be set to 'write', because deleting data also delete its attributes"); } Record& CommonAPIImplementation::choose_input_record(const char*& param) { switch (param[0]) { case '*': param = param + 1; return qcinput; default: return input; } } Record& CommonAPIImplementation::choose_output_record(const char*& param) { switch (param[0]) { case '*': param = param + 1; return qcoutput; default: return output; } } void CommonAPIImplementation::test_input_to_output() { output = input; } int CommonAPIImplementation::enqi(const char* param) { Record& rec = choose_output_record(param); if (const Var* var = rec.peek(param)) { if (!var->isset()) return missing_int; return var->enqi(); } else return missing_int; } signed char CommonAPIImplementation::enqb(const char* param) { Record& rec = choose_output_record(param); if (const Var* var = rec.peek(param)) { if (!var->isset()) return missing_byte; int value = var->enqi(); if (value < numeric_limits::min() || value > numeric_limits::max()) error_consistency::throwf("value queried (%d) does not fit in a byte", value); return value; } else return missing_byte; } float CommonAPIImplementation::enqr(const char* param) { Record& rec = choose_output_record(param); if (const Var* var = rec.peek(param)) { if (!var->isset()) return missing_float; double value = var->enqd(); if (value < -numeric_limits::max() || value > numeric_limits::max()) error_consistency::throwf("value queried (%f) does not fit in a real", value); return value; } else return missing_float; } double CommonAPIImplementation::enqd(const char* param) { Record& rec = choose_output_record(param); if (const Var* var = rec.peek(param)) { if (!var->isset()) return missing_double; return var->enqd(); } else return missing_double; } const char* CommonAPIImplementation::enqc(const char* param) { Record& rec = choose_output_record(param); return rec.peek_value(param); } static Varcode checkvar(const char* param) { if (param[0] == 'B') return WR_STRING_TO_VAR(param + 1); return varcode_alias_resolve(param); } static dba_keyword prepare_key_change(Record& rec, const char* param) { dba_keyword key = Record::keyword_byname(param); switch (key) { case DBA_KEY_ERROR: error_notfound::throwf("looking for misspelled parameter \"%s\"", param); break; case DBA_KEY_LAT: case DBA_KEY_LON: rec.key_unset(DBA_KEY_ANA_ID); break; case DBA_KEY_ANA_ID: rec.key_unset(DBA_KEY_LAT); rec.key_unset(DBA_KEY_LON); break; default: break; } return key; } void CommonAPIImplementation::seti(const char* param, int value) { Record& rec = choose_input_record(param); Varcode code = checkvar(param); if (code) { rec.var(code).seti(value); } else { dba_keyword key = prepare_key_change(rec, param); rec.key(key).seti(value); } } void CommonAPIImplementation::setb(const char* param, signed char value) { return seti(param, value); } void CommonAPIImplementation::setr(const char* param, float value) { return setd(param, value); } void CommonAPIImplementation::setd(const char* param, double value) { Record& rec = choose_input_record(param); Varcode code = checkvar(param); if (code) { rec.var(code).setd(value); } else { dba_keyword key = prepare_key_change(rec, param); rec.key(key).setd(value); } } void CommonAPIImplementation::setc(const char* param, const char* value) { Record& rec = choose_input_record(param); Varcode code = checkvar(param); if (code) { rec.var(code).setc(value); } else { dba_keyword key = prepare_key_change(rec, param); rec.key(key).setc(value); } } void CommonAPIImplementation::setcontextana() { input.set_ana_context(); } static inline void enqi_or_missing(int& out, Record& rec, dba_keyword key) { if (const Var* var = rec.key_peek(key)) out = var->enqi(); else out = API::missing_int; } static inline void seti_or_missing(Record& rec, dba_keyword key, int val) { if (val == API::missing_int) rec.unset(key); else rec.set(key, val); } void CommonAPIImplementation::enqlevel(int& ltype1, int& l1, int& ltype2, int& l2) { enqi_or_missing(ltype1, output, DBA_KEY_LEVELTYPE1); enqi_or_missing(l1, output, DBA_KEY_L1); enqi_or_missing(ltype2, output, DBA_KEY_LEVELTYPE2); enqi_or_missing(l2, output, DBA_KEY_L2); } void CommonAPIImplementation::setlevel(int ltype1, int l1, int ltype2, int l2) { seti_or_missing(input, DBA_KEY_LEVELTYPE1, ltype1); seti_or_missing(input, DBA_KEY_L1, l1); seti_or_missing(input, DBA_KEY_LEVELTYPE2, ltype2); seti_or_missing(input, DBA_KEY_L2, l2); } void CommonAPIImplementation::enqtimerange(int& ptype, int& p1, int& p2) { enqi_or_missing(ptype, output, DBA_KEY_PINDICATOR); enqi_or_missing(p1, output, DBA_KEY_P1); enqi_or_missing(p2, output, DBA_KEY_P2); } void CommonAPIImplementation::settimerange(int ptype, int p1, int p2) { seti_or_missing(input, DBA_KEY_PINDICATOR, ptype); seti_or_missing(input, DBA_KEY_P1, p1); seti_or_missing(input, DBA_KEY_P2, p2); } void CommonAPIImplementation::enqdate(int& year, int& month, int& day, int& hour, int& min, int& sec) { enqi_or_missing(year, output, DBA_KEY_YEAR); enqi_or_missing(month, output, DBA_KEY_MONTH); enqi_or_missing(day, output, DBA_KEY_DAY); enqi_or_missing(hour, output, DBA_KEY_HOUR); enqi_or_missing(min, output, DBA_KEY_MIN); enqi_or_missing(sec, output, DBA_KEY_SEC); } void CommonAPIImplementation::setdate(int year, int month, int day, int hour, int min, int sec) { seti_or_missing(input, DBA_KEY_YEAR, year); seti_or_missing(input, DBA_KEY_MONTH, month); seti_or_missing(input, DBA_KEY_DAY, day); seti_or_missing(input, DBA_KEY_HOUR, hour); seti_or_missing(input, DBA_KEY_MIN, min); seti_or_missing(input, DBA_KEY_SEC, sec); } void CommonAPIImplementation::setdatemin(int year, int month, int day, int hour, int min, int sec) { input.set(DBA_KEY_YEARMIN, year); input.set(DBA_KEY_MONTHMIN, month); input.set(DBA_KEY_DAYMIN, day); input.set(DBA_KEY_HOURMIN, hour); input.set(DBA_KEY_MINUMIN, min); input.set(DBA_KEY_SECMIN, sec); } void CommonAPIImplementation::setdatemax(int year, int month, int day, int hour, int min, int sec) { input.set(DBA_KEY_YEARMAX, year); input.set(DBA_KEY_MONTHMAX, month); input.set(DBA_KEY_DAYMAX, day); input.set(DBA_KEY_HOURMAX, hour); input.set(DBA_KEY_MINUMAX, min); input.set(DBA_KEY_SECMAX, sec); } void CommonAPIImplementation::unset(const char* param) { Record& rec = choose_input_record(param); Varcode code = checkvar(param); if (code) { rec.var_unset(code); } else { dba_keyword key = prepare_key_change(rec, param); rec.key_unset(key); } } void CommonAPIImplementation::unsetall() { clear_qcinput(); input.clear(); } const char* CommonAPIImplementation::spiegal(int ltype1, int l1, int ltype2, int l2) { cached_spiega = Level(ltype1, l1, ltype2, l2).describe(); return cached_spiega.c_str(); } const char* CommonAPIImplementation::spiegat(int ptype, int p1, int p2) { cached_spiega = Trange(ptype, p1, p2).describe(); return cached_spiega.c_str(); } const char* CommonAPIImplementation::spiegab(const char* varcode, const char* value) { Varinfo info = varinfo(WR_STRING_TO_VAR(varcode + 1)); Var var(info, value); char buf[1024]; if (info->is_string()) snprintf(buf, 1023, "%s (%s) %s", var.enqc(), info->unit, info->desc); else snprintf(buf, 1023, "%.*f (%s) %s", info->scale > 0 ? info->scale : 0, var.enqd(), info->unit, info->desc); cached_spiega = buf; return cached_spiega.c_str(); } const char* CommonAPIImplementation::ancora() { static char parm[10]; if (qc_iter < 0 || (unsigned)qc_iter >= qcoutput.vars().size()) throw error_notfound("reading a QC item"); Varcode var = qcoutput.vars()[qc_iter]->code(); snprintf(parm, 10, "*B%02d%03d", WR_VAR_X(var), WR_VAR_Y(var)); /* Get next value from qc */ ++qc_iter; return parm; } void CommonAPIImplementation::get_referred_data_id(int* id_context, Varcode* id_var) const { /* Read context ID */ if (const Var* var = qcinput.key_peek(DBA_KEY_CONTEXT_ID)) *id_context = var->enqi(); else throw error_notfound("looking for variable context id"); /* Read variable ID */ if (const char* val = qcinput.key_peek_value(DBA_KEY_VAR_RELATED)) *id_var = WR_STRING_TO_VAR(val + 1); else throw error_consistency("finding out which variabile to add attributes to, *var is not set"); } void CommonAPIImplementation::read_qc_list(vector& res_arr) const { res_arr.clear(); if (const char* val = qcinput.key_peek_value(DBA_KEY_VAR)) { /* Get only the QC values in *varlist */ if (*val != '*') throw error_consistency("QC values must start with '*'"); res_arr.push_back(WR_STRING_TO_VAR(val + 2)); } else if (const char* val = qcinput.key_peek_value(DBA_KEY_VARLIST)) { /* Get only the QC values in *varlist */ size_t pos; size_t len; int i; for (pos = 0, i = 0; (len = strcspn(val + pos, ",")) > 0; pos += len + 1) { if (*(val+pos) != '*') throw error_consistency("QC value names must start with '*'"); res_arr.push_back(WR_STRING_TO_VAR(val + pos + 2)); } } } void CommonAPIImplementation::clear_qcinput() { int saved_context_id = -1; char saved_varname[8]; // Save the values to be preserved if (const char* val = qcinput.key_peek_value(DBA_KEY_CONTEXT_ID)) saved_context_id = strtol(val, NULL, 10); if (const char* val = qcinput.key_peek_value(DBA_KEY_VAR_RELATED)) { strncpy(saved_varname, val, 7); saved_varname[6] = 0; } else saved_varname[0] = 0; // Clear the qcinput record qcinput.clear(); // Restore the saved values if (saved_context_id != -1) qcinput.set(DBA_KEY_CONTEXT_ID, saved_context_id); if (saved_varname[0] != 0) qcinput.set(DBA_KEY_VAR_RELATED, saved_varname); } } } /* vim:set ts=4 sw=4: */ dballe-5.18/fortran/dumpmsg_dballe.f900000644000175000017500000000644611636363772014615 00000000000000! Copyright (C) 2011 ARP1-SIM ! ! This program is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2 of the License. ! ! This program is distributed in the hope that it will be useful, ! but WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ! ! Author: Paolo Patruno program dump_dballe ! **************************************************** ! * Dump the contents of a weather messages in a file ! **************************************************** implicit none integer :: handle, nstaz, ndata, nattr integer :: i, i1, i2, type1, l1, type2, l2 integer :: height, rep_cod, year, month, day, hour, minute, second character(len=255) :: fname,prettyvalue character(len=20) :: cname, rep_memo,value, avalue character(len=10) :: btable, starbtable doubleprecision ::dlat,dlon include "dballef.h" external errorrep call getarg(1,fname) call idba_error_set_callback(0, errorrep, 0, i) ! Open a session call idba_messaggi(handle, fname, "r", "BUFR") ! Query all the stations do while (.true.) call idba_quantesono(handle, nstaz) if (nstaz .eq. 0) exit call idba_elencamele(handle) call idba_enq(handle, "name", cname) call idba_enq(handle, "lat", dlat) call idba_enq(handle, "lon", dlon) call idba_enq(handle, "height", height) call idba_enq(handle,"rep_memo",rep_memo) write (*,*) "Staz: ",trim(cname)," (",dlat,",",dlon,")"," h:",height," network: ",rep_memo !call idba_set(handle,"varlist","B12101,B11002") ! only on DB is valid call idba_voglioquesto(handle,ndata) !write (*,*) " ",ndata," dati:" ! only on DB is valid do i1=1, ndata call idba_dammelo(handle,btable) if (btable /= "B12101" .and. btable /= "B11002") cycle call idba_enqdate(handle, year, month, day, hour, minute, second) call idba_enqlevel(handle, type1, l1, type2, l2) call idba_enq(handle,btable,value) print*,"----" write (*,*) "date time: ",year, month, day, hour, minute call idba_spiegal(handle,type1,l1,type2,l2,prettyvalue) write (*,*) trim(prettyvalue) call idba_spiegab(handle,btable,value,prettyvalue) write (*,*) trim(prettyvalue) call idba_voglioancora (handle,nattr) if (nattr > 0) then write (*,*) " ",nattr," attributi:" do i2=1, nattr call idba_ancora(handle,starbtable) call idba_enq(handle,starbtable,avalue) write(*,*) " attr ",trim(starbtable),": ",avalue enddo end if enddo enddo call idba_fatto(handle) call exit (0) end program dump_dballe subroutine errorrep(val) integer :: val character(len=1000) :: buf ier = idba_error_code() if (ier.ne.0) then print *,ier," error in ",val call idba_error_message(buf) print *,trim(buf) call idba_error_context(buf) print *,trim(buf) call idba_error_details(buf) print *,trim(buf) call exit (1) end if return end subroutine errorrep dballe-5.18/fortran/test.f900000644000175000017500000000171011634657433012600 00000000000000 module test contains ! Continue execution only if there was no error subroutine ensure_no_error(message) character (len=*) :: message integer :: idba_error_code, ier character (len=1000) :: buf ! print *,"siamo a ",message ier = idba_error_code() if (ier.ne.0) then print *,ier," in ",message call idba_error_message(buf) print *,trim(buf) call idba_error_context(buf) print *,trim(buf) call idba_error_details(buf) print *,trim(buf) call exit (1) end if return endsubroutine ensure_no_error ! Print an error if the given logical value is false subroutine ensure(message, value) character (len=*) :: message logical :: value if (.not.value) then print *,"Check failed in ",message call exit (1) end if return endsubroutine ensure endmodule test dballe-5.18/fortran/check_range.f900000644000175000017500000000270711450603066014046 00000000000000program check_range ! ***************************************** ! * Test suite for DBALLE Fortran bindings ! ***************************************** use dbtest include "dballef.h" integer :: handle,idbhandle,handle_err, errcode real :: rval !data var/ "B22070", "B22074", "B22001", "B22071", "B22042"/ integer debug data debug/1/ !call idba_error_set_callback(0,idba_default_error_handler,debug,handle_err) ! Database login call dbinit(idbhandle) ! Open a session call idba_preparati(idbhandle,handle,"write","write","write") call ensure_no_error("preparati") ! Check that NaN values are trapped rval = 0. rval = log(rval) / log(rval) call idba_set(handle, "B12103", log(rval)) errcode = idba_error_code() call ensure("set to NaN", errcode == 13) ! Check that negative reals can be read call idba_set(handle, "lon", -12.3456) call ensure_no_error("set lon negative") call idba_test_input_to_output(handle) call ensure_no_error("input to output") call idba_enqr(handle, "lon", rval) call ensure_no_error("enq lon negative") call ensure("read negative real", rval == -12.3456) call idba_fatto(handle) call ensure_no_error("fatto") call idba_arrivederci(idbhandle) call ensure_no_error("arrivederci") call exit (0) end program check_range include "check-utils.h" dballe-5.18/fortran/commonapi.h0000644000175000017500000001012511450626066013426 00000000000000/* * fortran/commonapi - Common parts of all Fortran API implementations * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #ifndef FDBA_COMMONAPI_H #define FDBA_COMMONAPI_H #include "simple.h" #include namespace dballe { namespace fortran { /** * Common implementation of the set* and enq* machinery using input and output * records. */ class CommonAPIImplementation : public API { protected: enum { PERM_ANA_RO = (1 << 0), PERM_ANA_WRITE = (1 << 1), PERM_DATA_RO = (1 << 2), PERM_DATA_ADD = (1 << 3), PERM_DATA_WRITE = (1 << 4), PERM_ATTR_RO = (1 << 5), PERM_ATTR_ADD = (1 << 6), PERM_ATTR_WRITE = (1 << 7) }; int perms; Record input; Record output; Record qcinput; Record qcoutput; int qc_iter; int qc_count; // Last string returned by one of the spiega* functions, held here so // that we can deallocate it when needed. std::string cached_spiega; /** * Set the permission bits, parsing the flags and doing consistency checks */ void set_permissions(const char* anaflag, const char* dataflag, const char* attrflag); /** * Choose the input record to use for param. Also, adjust param to remove * a leading '*' if present. */ Record& choose_input_record(const char*& param); /** * Choose the output record to use for param. Also, adjust param to remove * a leading '*' if present. */ Record& choose_output_record(const char*& param); /** * Look for the ID of the data which a critica or scusa operation are * supposed to operate on. */ void get_referred_data_id(int* id_context, wreport::Varcode* id_var) const; /// Reads the list of QC values to operate on, for dba_voglioancora and dba_scusa void read_qc_list(std::vector& res_arr) const; /** * Clear the qcinput record preserving DBA_KEY_CONTEXT_ID and * DBA_KEY_VAR_RELATED */ void clear_qcinput(); public: CommonAPIImplementation(); virtual ~CommonAPIImplementation(); virtual void test_input_to_output(); virtual int enqi(const char* param); virtual signed char enqb(const char* param); virtual float enqr(const char* param); virtual double enqd(const char* param); virtual const char* enqc(const char* param); virtual void seti(const char* param, int value); virtual void setb(const char* param, signed char value); virtual void setr(const char* param, float value); virtual void setd(const char* param, double value); virtual void setc(const char* param, const char* value); virtual void setcontextana(); virtual void enqlevel(int& ltype1, int& l1, int& ltype2, int& l2); virtual void setlevel(int ltype1, int l1, int ltype2, int l2); virtual void enqtimerange(int& ptype, int& p1, int& p2); virtual void settimerange(int ptype, int p1, int p2); virtual void enqdate(int& year, int& month, int& day, int& hour, int& min, int& sec); virtual void setdate(int year, int month, int day, int hour, int min, int sec); virtual void setdatemin(int year, int month, int day, int hour, int min, int sec); virtual void setdatemax(int year, int month, int day, int hour, int min, int sec); virtual void unset(const char* param); virtual void unsetall(); virtual const char* spiegal(int ltype1, int l1, int ltype2, int l2); virtual const char* spiegat(int ptype, int p1, int p2); virtual const char* spiegab(const char* varcode, const char* value); virtual const char* ancora(); }; } } /* vim:set ts=4 sw=4: */ #endif dballe-5.18/fortran/check_missing_msg.f900000644000175000017500000001052611634664553015303 00000000000000 program check_missing ! ***************************************** ! * Test suite for DBALLE Fortran bindings ! ***************************************** use test include "dballef.h" integer handle, ival, ndata, n, i integer (kind=dba_int_b):: bval real rval real*8 dval character cval*255, btable*8 character(len=1024) :: fname external testcb ! call fdba_error_set_callback(0, testcb, 2, i) call getenv('DBA_TESTDATA', fname) fname = trim(fname) // "/bufr/temp-bad5.bufr" ! Open a session call idba_messaggi(handle, fname, "r", "BUFR") call ensure_no_error("messaggi") ! Try reading 'missing' values call idba_enqb(handle, "latmin", bval) call ensure_no_error("enq key byte") call ensure("enq empty key byte", bval.eq.DBA_MVB) call idba_enqc(handle, "latmin", cval) call ensure_no_error("enq key char") call ensure("enq empty key char", cval.eq.DBA_MVC) call idba_enqi(handle, "latmin", ival) call ensure_no_error("enq key int") call ensure("enq empty key int", ival.eq.DBA_MVI) call idba_enqr(handle, "latmin", rval) call ensure_no_error("enq key real") call ensure("enq empty key real", rval.eq.DBA_MVR) call idba_enqd(handle, "latmin", dval) call ensure_no_error("enq key double") call ensure("enq empty key double", dval.eq.DBA_MVD) call idba_enq(handle, "latmin", dval) call ensure_no_error("enq key auto double") call ensure("enq empty key auto double", dval.eq.DBA_MVD) call idba_enqb(handle, "B05002", bval) call ensure_no_error("enq var byte") call ensure("enq empty var byte", bval.eq.DBA_MVB) call idba_enqc(handle, "B05002", cval) call ensure_no_error("enq var char") call ensure("enq empty var char", cval.eq.DBA_MVC) call idba_enqi(handle, "B05002", ival) call ensure_no_error("enq var int") call ensure("enq empty var int", ival.eq.DBA_MVI) call idba_enqr(handle, "B05002", rval) call ensure_no_error("enq var real") call ensure("enq empty var real", rval.eq.DBA_MVR) call idba_enqd(handle, "B05002", dval) call ensure_no_error("enq var double") call ensure("enq empty var double", dval.eq.DBA_MVD) call idba_enq(handle, "B05002", dval) call ensure_no_error("enq var auto double") call ensure("enq empty var auto double", dval.eq.DBA_MVD) ! Try using the 'missing' values call idba_setb(handle, "lat", DBA_MVB) call ensure_no_error("unset key byte") call idba_setc(handle, "lat", DBA_MVC) call ensure_no_error("unset key char") call idba_seti(handle, "lat", DBA_MVI) call ensure_no_error("unset key int") call idba_setr(handle, "lat", DBA_MVR) call ensure_no_error("unset key real") call idba_setd(handle, "lat", DBA_MVD) call ensure_no_error("unset key double") call idba_setb(handle, "B12001", DBA_MVB) call ensure_no_error("unset var byte") call idba_setc(handle, "B12001", DBA_MVC) call ensure_no_error("unset var char") call idba_seti(handle, "B12001", DBA_MVI) call ensure_no_error("unset var int") call idba_setr(handle, "B12001", DBA_MVR) call ensure_no_error("unset var real") call idba_setd(handle, "B12001", DBA_MVD) call ensure_no_error("unset var double") call idba_unsetall(handle) call ensure_no_error("unsetall") n = 1 do while ( n > 0 ) call idba_voglioquesto (handle,n) call ensure_no_error("voglioquesto") do i = 1, n call idba_dammelo (handle,btable) call ensure_no_error("dammelo") call idba_enqd (handle,"B11001",dval) call ensure_no_error("enqd from msg") call idba_enqr (handle,"B11001",rval) call ensure_no_error("enqr from msg") call idba_enqi (handle,"B11001",ival) call ensure_no_error("enqi from msg") ! Value does not fit in a byte !call idba_enqb (handle,"B11001",bval) !call ensure_no_error("enqb from msg") end do end do call idba_fatto(handle) call ensure_no_error("fatto") ! If we made it so far, exit with no error print*,"check_missing: all tests succeed." call exit (0) end program include "check-utils.h" dballe-5.18/fortran/tut-main.cpp0000644000175000017500000000361111636652777013555 00000000000000#include #include #include #include namespace tut { test_runner_singleton runner; } using namespace wibble; void signal_to_exception(int) { throw std::runtime_error("killing signal catched"); } int main(int argc,const char* argv[]) { tut::reporter visi; signal(SIGSEGV,signal_to_exception); signal(SIGILL,signal_to_exception); if( (argc == 2 && (! strcmp ("help", argv[1]))) || argc > 3 ) { std::cout << "TUT example test application." << std::endl; std::cout << "Usage: example [regression] | [list] | [ group] [test]" << std::endl; std::cout << " List all groups: example list" << std::endl; std::cout << " Run all tests: example regression" << std::endl; std::cout << " Run one group: example std::auto_ptr" << std::endl; std::cout << " Run one test: example std::auto_ptr 3" << std::endl;; } // std::cout << "\nFAILURE and EXCEPTION in these tests are FAKE ;)\n\n"; tut::runner.get().set_callback(&visi); try { if( argc == 1 || (argc == 2 && std::string(argv[1]) == "regression") ) { tut::runner.get().run_tests(); } else if( argc == 2 && std::string(argv[1]) == "list" ) { std::cout << "registered test groups:" << std::endl; tut::groupnames gl = tut::runner.get().list_groups(); tut::groupnames::const_iterator i = gl.begin(); tut::groupnames::const_iterator e = gl.end(); while( i != e ) { std::cout << " " << *i << std::endl; ++i; } } else if( argc == 2 && std::string(argv[1]) != "regression" ) { tut::runner.get().run_tests(argv[1]); } else if( argc == 3 ) { tut::runner.get().run_test(argv[1],::atoi(argv[2])); } } catch( const std::exception& ex ) { std::cerr << "tut raised exception: " << ex.what() << std::endl; } return 0; } dballe-5.18/fortran/check_real0.f900000644000175000017500000000341711636363023013756 00000000000000 program check_real0 ! ***************************************** ! * Test suite for DBALLE Fortran bindings ! ***************************************** use dbtest include "dballef.h" integer :: handle,idbhandle,handle_err !data var/ "B22070", "B22074", "B22001", "B22071", "B22042"/ !integer debug !data debug/1/ !call idba_error_set_callback(0,idba_default_error_handler,debug,handle_err) ! Database login call dbinit(idbhandle) ! Open a session call idba_preparati(idbhandle,handle,"write","write","write") call ensure_no_error("preparati") ! Clear the database call idba_scopa(handle, "") call ensure_no_error("scopa") ! Insert some data with a 0.0D0 value call idba_unsetall (handle) call idba_set (handle,"lat",44.2) call ensure_no_error("set lat") call idba_set (handle,"lon",11.5) call ensure_no_error("set lon") call idba_set (handle,"mobile",0) call ensure_no_error("set mobile") call idba_set (handle,"rep_memo","synop") call ensure_no_error("set rep_memo") call idba_setlevel (handle,1,0,0,0) call ensure_no_error("set level") call idba_settimerange (handle,0,0,0) call ensure_no_error("set timerange") call idba_setdate (handle,2007,12,11,12,30,00) call ensure_no_error("set date") call idba_set(handle,"B22070",0.0D0) call ensure_no_error("set B22070 to 0.0D0") call idba_prendilo (handle) call ensure_no_error("prendilo") call idba_fatto(handle) call ensure_no_error("fatto") call idba_arrivederci(idbhandle) call ensure_no_error("arrivederci") call exit (0) end program check_real0 include "check-utils.h" dballe-5.18/fortran/check_attrs.f900000644000175000017500000000715711433314513014110 00000000000000 program check_attrs use dbtest include "dballef.h" ! ***************************************** ! * Dump the contents of a dballe database ! ***************************************** integer dbahandle, handle, handleinit, nstaz, ndata, nattr integer i, i1, i2, tmp integer id,height,codrete character cname*20,rete*20,value*255,avalue*255 character btable*10,starbtable*10 real dlat,dlon external errorrep ! call idba_error_set_callback(0, errorrep, 2, i) ! Database login call dbinit(dbahandle) ! Open a session call idba_preparati(dbahandle, handle, "read", "read", "read") call ensure_no_error("preparati handle") call idba_preparati(dbahandle, handleinit, & "write", "write", "write") call ensure_no_error("preparati handleinit") call idba_scopa(handleinit, DBA_MVC) call ensure_no_error("scopa") ! Insert test data call idba_setd(handleinit, "lat", 12.345D00) call ensure_no_error("init 1") call idba_setd(handleinit, "lon", 12.345D00) call ensure_no_error("init 2") call idba_setlevel(handleinit, 1, 0, 0, 0) call ensure_no_error("init 3") call idba_settimerange(handleinit, 0, 0, 0) call ensure_no_error("init 4") call idba_setdate(handleinit, 2007, 06, 13, 0, 0, 0) call ensure_no_error("init 5") call idba_setd(handleinit, "B12101", 12.345D0) call ensure_no_error("init 6") call idba_setc(handleinit, "rep_memo", 'synop') call ensure_no_error("init 6b") call idba_prendilo(handleinit) call ensure_no_error("prendilo") call idba_enqi(handleinit, "context_id", i) call ensure_no_error("init 7") call idba_setr(handleinit, "*B33007", 75.0) call ensure_no_error("init 8") call idba_setc(handleinit, "*var_related", "B12101") call ensure_no_error("init 9") call idba_critica(handleinit) call ensure_no_error("critica 1") call idba_setr(handleinit, "*B33040", 80.0) call ensure_no_error("init 11") call idba_setc(handleinit, "*var_related", "B12101") call ensure_no_error("init 12") call idba_critica(handleinit) call ensure_no_error("critica 2") call idba_setr(handleinit, "*B33036", 90.0) call ensure_no_error("init 14") call idba_setc(handleinit, "*var_related", "B12101") call ensure_no_error("init 15") call idba_critica(handleinit) call ensure_no_error("critica 3") call idba_seti(handle, "*context_id", i) call ensure_no_error("query set 1") call idba_setc(handle, "*var_related", "B12101") call ensure_no_error("query set 2") call idba_voglioancora(handle, nattr) call ensure_no_error("query voglioancora 1") call ensure("I need 3 values", nattr.eq.3) call idba_setc(handle, "*var", "*B33040") call ensure_no_error("query set 3") call idba_voglioancora(handle, nattr) call ensure_no_error("query voglioancora 2") call ensure("I need 1 values", nattr.eq.1) call idba_unset(handle, "*var") call ensure_no_error("query set 4") call idba_setc(handle, "*varlist", "*B33007,*B33036") call ensure_no_error("query set 5") call idba_voglioancora(handle, nattr) call ensure_no_error("query voglioancora 3") call ensure("I need 2 values", nattr.eq.2) call idba_fatto(handleinit) call idba_fatto(handle) call idba_arrivederci(dbahandle) ! If we made it so far, exit with no error print*,"check_attrs: all tests succeed." call exit (0) end include "check-utils.h" dballe-5.18/fortran/check_missing.f900000644000175000017500000000643511173330007014417 00000000000000 program check_missing ! ***************************************** ! * Test suite for DBALLE Fortran bindings ! ***************************************** use dbtest include "dballef.h" integer dbahandle, handle, ival integer (kind=dba_int_b):: bval real rval real*8 dval character cval*255 external testcb ! call fdba_error_set_callback(0, testcb, 2, i) ! Database login call dbinit(dbahandle) ! Open a session call idba_preparati(dbahandle, handle, "write", "write", "write") call ensure_no_error("preparati") ! Try reading 'missing' values call idba_enqb(handle, "lat", bval) call ensure_no_error("enq key byte") call ensure("enq empty key byte", bval.eq.DBA_MVB) call idba_enqc(handle, "lat", cval) call ensure_no_error("enq key char") call ensure("enq empty key char", cval.eq.DBA_MVC) call idba_enqi(handle, "lat", ival) call ensure_no_error("enq key int") call ensure("enq empty key int", ival.eq.DBA_MVI) call idba_enqr(handle, "lat", rval) call ensure_no_error("enq key real") call ensure("enq empty key real", rval.eq.DBA_MVR) call idba_enqd(handle, "lat", dval) call ensure_no_error("enq key double") call ensure("enq empty key double", dval.eq.DBA_MVD) call idba_enqb(handle, "B12001", bval) call ensure_no_error("enq var byte") call ensure("enq empty var byte", bval.eq.DBA_MVB) call idba_enqc(handle, "B12001", cval) call ensure_no_error("enq var char") call ensure("enq empty var char", cval.eq.DBA_MVC) call idba_enqi(handle, "B12001", ival) call ensure_no_error("enq var int") call ensure("enq empty var int", ival.eq.DBA_MVI) call idba_enqr(handle, "B12001", rval) call ensure_no_error("enq var real") call ensure("enq empty var real", rval.eq.DBA_MVR) call idba_enqd(handle, "B12001", dval) call ensure_no_error("enq var double") call ensure("enq empty var double", dval.eq.DBA_MVD) ! Try using the 'missing' values call idba_setb(handle, "lat", DBA_MVB) call ensure_no_error("unset key byte") call idba_setc(handle, "lat", DBA_MVC) call ensure_no_error("unset key char") call idba_seti(handle, "lat", DBA_MVI) call ensure_no_error("unset key int") call idba_setr(handle, "lat", DBA_MVR) call ensure_no_error("unset key real") call idba_setd(handle, "lat", DBA_MVD) call ensure_no_error("unset key double") call idba_setb(handle, "B12001", DBA_MVB) call ensure_no_error("unset var byte") call idba_setc(handle, "B12001", DBA_MVC) call ensure_no_error("unset var char") call idba_seti(handle, "B12001", DBA_MVI) call ensure_no_error("unset var int") call idba_setr(handle, "B12001", DBA_MVR) call ensure_no_error("unset var real") call idba_setd(handle, "B12001", DBA_MVD) call ensure_no_error("unset var double") call idba_fatto(handle) call ensure_no_error("fatto") call idba_arrivederci(dbahandle) call ensure_no_error("arrivederci") ! If we made it so far, exit with no error print*,"check_missing: all tests succeed." call exit (0) end program include "check-utils.h" dballe-5.18/fortran/dbapi.cc0000644000175000017500000001612011705552220012653 00000000000000/* * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "dbapi.h" #include #include //#include //#include //#include //#include /* #include #include #include #include // snprintf #include // strncpy #include */ using namespace wreport; using namespace std; namespace dballe { namespace fortran { DbAPI::DbAPI(DB& db, const char* anaflag, const char* dataflag, const char* attrflag) : db(db), ana_cur(0), query_cur(0) { set_permissions(anaflag, dataflag, attrflag); } DbAPI::~DbAPI() { if (ana_cur) { ana_cur->discard_rest(); delete ana_cur; } if (query_cur) { query_cur->discard_rest(); delete query_cur; } } void DbAPI::scopa(const char* repinfofile) { if (!(perms & PERM_DATA_WRITE)) error_consistency::throwf( "scopa must be run with the database open in data write mode"); db.reset(repinfofile); } int DbAPI::quantesono() { if (ana_cur != NULL) { ana_cur->discard_rest(); delete ana_cur; ana_cur = 0; } ana_cur = db.query_stations(input).release(); #if 0 if (dba_verbose_is_allowed(DBA_VERB_DB_INPUT)) { dba_verbose(DBA_VERB_DB_INPUT, "invoking dba_db_ana_query(db, ). is:\n"); dba_record_print(input, DBA_VERBOSE_STREAM); } #endif return ana_cur->remaining(); } void DbAPI::elencamele() { if (ana_cur == NULL) throw error_consistency("elencamele called without a previous quantesono"); output.clear(); if (ana_cur->next()) ana_cur->to_record(output); else { delete ana_cur; ana_cur = NULL; } } int DbAPI::voglioquesto() { if (query_cur != NULL) { query_cur->discard_rest(); delete query_cur; query_cur = NULL; } query_cur = db.query_data(input).release(); #if 0 if (dba_verbose_is_allowed(DBA_VERB_DB_INPUT)) { dba_verbose(DBA_VERB_DB_INPUT, "invoking dba_query(db, ). is:\n"); dba_record_print(input, DBA_VERBOSE_STREAM); } #endif return query_cur->remaining(); } const char* DbAPI::dammelo() { if (query_cur == NULL) throw error_consistency("dammelo called without a previous voglioquesto"); /* Reset qc record iterator, so that ancora will not return * leftover QC values from a previous query */ qc_iter = -1; output.clear(); if (query_cur->next()) { query_cur->to_record(output); /* Set context id and variable name on qcinput so that * attribute functions will refer to the last variable read */ const char* varstr = output.key_peek_value(DBA_KEY_VAR); qcinput.set(DBA_KEY_CONTEXT_ID, (int)query_cur->out_context_id); qcinput.set(DBA_KEY_VAR_RELATED, varstr); return varstr; } else { delete query_cur; query_cur = NULL; return 0; } } void DbAPI::prendilo() { if (perms & PERM_DATA_RO) throw error_consistency( "idba_prendilo cannot be called with the database open in data readonly mode"); #if 0 if (dba_verbose_is_allowed(DBA_VERB_DB_INPUT)) { dba_verbose(DBA_VERB_DB_INPUT, "invoking dba_insert_or_replace(db, , %d, %d). is:\n", perms & PERM_DATA_WRITE ? 1 : 0, perms & PERM_ANA_WRITE ? 1 : 0); dba_record_print(input, DBA_VERBOSE_STREAM); } #endif db.insert(input, (perms & PERM_DATA_WRITE) != 0, (perms & PERM_ANA_WRITE) != 0); int ana_id = input.key_peek(DBA_KEY_ANA_ID)->enqi(); int context_id = input.key_peek(DBA_KEY_CONTEXT_ID)->enqi(); // Uncache to prevent confusion on the next insert // input.unset(DBA_KEY_ANA_ID); Not needed here, it is reset automatically // when trying to set a latitude or longitude input.unset(DBA_KEY_CONTEXT_ID); /* Set the values in the output */ output.set(DBA_KEY_ANA_ID, ana_id); output.set(DBA_KEY_CONTEXT_ID, context_id); /* Set context id and variable name on qcinput so that * attribute functions will refer to what has been written */ qcinput.set(DBA_KEY_CONTEXT_ID, context_id); /* If there was only one variable in the input, we can pass it on as a * default for attribute handling routines; otherwise we unset to mark * the ambiguity */ const vector vars = input.vars(); if (vars.size() == 1) { Varcode code = vars[0]->code(); char varname[8]; snprintf(varname, 7, "B%02d%03d", WR_VAR_X(code), WR_VAR_Y(code)); qcinput.set(DBA_KEY_VAR_RELATED, varname); } else qcinput.unset(DBA_KEY_VAR_RELATED); } void DbAPI::dimenticami() { if (! (perms & PERM_DATA_WRITE)) throw error_consistency("dimenticami must be called with the database open in data write mode"); db.remove(input); } int DbAPI::voglioancora() { int id_context; Varcode id_var; /* Retrieve the ID of the data to query */ get_referred_data_id(&id_context, &id_var); /* Retrieve the varcodes of the wanted QC values */ std::vector arr; read_qc_list(arr); /* Do QC query */ int qc_count = db.query_attrs(id_context, id_var, arr, qcoutput); qc_iter = 0; clear_qcinput(); return qc_count; } void DbAPI::critica() { if (perms & PERM_ATTR_RO) throw error_consistency( "critica cannot be called with the database open in attribute readonly mode"); int id_context; Varcode id_var; get_referred_data_id(&id_context, &id_var); db.attr_insert_or_replace(id_context, id_var, qcinput, (perms & PERM_ATTR_WRITE) != 0); clear_qcinput(); } void DbAPI::scusa() { if (! (perms & PERM_ATTR_WRITE)) throw error_consistency( "scusa must be called with the database open in attribute write mode"); int id_context; Varcode id_var; get_referred_data_id(&id_context, &id_var); /* Retrieve the varcodes of the wanted QC values */ std::vector arr; read_qc_list(arr); // If arr is still 0, then dba_qc_delete deletes all QC values db.attr_remove(id_context, id_var, arr); clear_qcinput(); } } } /* vim:set ts=4 sw=4: */ dballe-5.18/fortran/dbtest.f900000644000175000017500000000113411636363030013073 00000000000000 module dbtest use test contains subroutine dbinit(dbahandle) integer::dbahandle, handle character (len=160) :: dsn,testname call getenv("DBA_DB", dsn) call getarg(0, testname) if (dsn=="") then dsn = "test:" end if call idba_presentati(dbahandle, dsn, char(0), char(0)) call ensure_no_error("presentati") call idba_preparati(dbahandle, handle, "write", "write", "write") call idba_scopa(handle, char(0)) call idba_fatto(handle) endsubroutine dbinit endmodule dbtest dballe-5.18/fortran/binding.cc0000644000175000017500000012767611633376430013240 00000000000000/* * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "config.h" #include "msgapi.h" #ifdef HAVE_DBALLE_DB #include "dbapi.h" #include #endif #include // memset #include #include #include "handles.h" #include "error.h" extern "C" { #include } //#define TRACEMISSING(type) fprintf(stderr, "SET TO MISSING (" type ")\n") #define TRACEMISSING(type) do {} while(0) /* * First attempt using constants */ //#define MISSING_STRING "" // Largest signed one byte value #define MISSING_BYTE SCHAR_MAX // integer 2 byte 32767 // Largest signed int value #define MISSING_INT INT_MAX //#define MISSING_REAL (3.4028235E+38f) // Largest positive float value #define MISSING_REAL FLT_MAX // Largest positive double value #define MISSING_DOUBLE DBL_MAX //#define MISSING_DOUBLE (1.79769E+308) //#define MISSING_DOUBLE (1.7976931348623167E+308) //#define MISSING_DOUBLE (1.797693134862316E+308) //#define MISSING_DOUBLE (1.79769313486E+308) //#define MISSING_DOUBLE ((double)0x7FEFFFFFFFFFFFFF) using namespace dballe; using namespace wreport; static inline void tofortran(int& val) { if (val == fortran::API::missing_int) val = MISSING_INT; } static inline int fromfortran(int val) { return val == MISSING_INT ? fortran::API::missing_int : val; } /** @defgroup fortransimple Simplified interface for Dballe * @ingroup fortran * * This module provides a simplified fortran API to Dballe. The interface is * simplified by providing functions with fewer parameters than their * counterparts in the full interface, and the omitted parameters are replaced * by useful defaults. * * The resulting interface is optimized for the common usage, making it faster * and less error prone. However, when creating complicated code with more * parallel reads and writes, it may be useful to use the functions in * ::fortranfull instead, because all parameters are explicit and their precise * semantics is always evident. * * This is a sample code for a query session with the simplified interface: * \code * call idba_presentati(dba, "myDSN", "mariorossi", "CippoLippo") * call idba_preparati(dba, handle, "read", "read", "read") * call idba_setr(handle, "latmin", 30.) * call idba_setr(handle, "latmax", 50.) * call idba_setr(handle, "lonmin", 10.) * call idba_setr(handle, "lonmax", 20.) * call idba_voglioquesto(handle, count) * do i=1,count * call idba_dammelo(handle, param) * call idba_enqd(handle, param, ...) * call idba_enqi(handle, ...) * call idba_enqr(handle, ...) * call idba_enqd(handle, ...) * call idba_enqc(handle, ...) * call idba_voglioancora(handle, countancora) * do ii=1,count * call idba_ancora(handle, param) * call idba_enqi(handle, param) * enddo * enddo * call idba_fatto(handle) * call idba_arrivederci(dba) * \endcode * * This is a sample code for a data insert session with the simplified interface: * \code * call idba_presentati(dba, "myDSN", "mariorossi", "CippoLippo") * call idba_preparati(dba, handle, "reuse", "add", "add") * call idba_scopa(handle, "") * call idba_setr(handle, "lat", 30.) * call idba_setr(handle, "lon", 10.) * call idba_seti(handle, .....) * call idba_seti(handle, "B12011", 5) * call idba_seti(handle, "B12012", 10) * call idba_prendilo(handle) * call idba_setc(handle, "*var", "B12012") * call idba_seti(handle, "*B33101", 50) * call idba_seti(handle, "*B33102", 75) * call idba_critica(handle) * call idba_setc(handle, "*var", "B12011") * call idba_seti(handle, "*B33101", 50) * call idba_seti(handle, "*B33102", 75) * call idba_critica(handle) * call idba_fatto(handle) * call idba_arrivederci(dba) * \endcode */ /** @file * @ingroup fortransimple * Simplified interface for Dballe. * * Every function returns an error indicator, which is 0 if no error happened, * or 1 if there has been an error. * * When an error happens, the functions in fdba_error.c can be used * to get detailed informations about it. * * \par Internals of the simplified interface * * Behind the handle returned by idba_preparati() there are a set of variables * that are used as implicit parameters: * * \li \c query ::dba_record, used to set the parameters of the query made by idba_voglioquesto() * \li \c work ::dba_record, used by idba_dammelo() to return the parameters * \li \c qc ::dba_record, used to manipulate qc data. Every time the \ref idba_enq or \ref idba_set functions are used with a variable name starting with an asterisk, they will manipulate the \c qc record instead of the others. * \li \c ana ::dba_cursor, used to iterate on the results of idba_quantesono() * \li \c query ::dba_cursor, used to iterate on the results of idba_voglioquesto() * * The simplified interface has two possible states: \c QUERY and \c RESULT. * Then the interface is in the \c QUERY state, the \ref idba_enq and \ref * idba_set functions operate in the \c query ::dba_record, to set and check the * parameters of a query. idba_voglioquesto() reads the parameters from the \c * query ::dba_record and switches the state to \c RESULT, and further calls to * idba_dammelo() will put the query results in the \c work ::dba_record, to be read by * the \ref idba_enq functions. * * In the \c RESULT state, the \ref idba_enq and \ref idba_set functions * operate on the \c work ::dba_record, to inspect the results of the queries. A * call to idba_ricominciamo() terminates the current query and goes back to * the \c QUERY state, resetting the contents of all the ::dba_record of the interface. * * idba_prendilo() inserts in the database the data coming from the \c * QUERY ::dba_record if invoked in the \c query state, or the data coming from the * \c RESULT ::dba_record if invoked in the \c result state. This is done * because inserting new values in the database should be independent from the * state. * * \ref qc functions instead always operate on the \c qc ::dba_record, which is * accessed with the \ref idba_enq and \ref idba_set functions by prefixing the * parameter name with an asterisk. */ /* Handles to give to Fortran */ #define MAX_SIMPLE 50 #define MAX_SESSION 10 #ifdef HAVE_DBALLE_DB struct HSession : public fortran::HBase { DB* db; void start() { fortran::HBase::start(); db = new dballe::DB; } void stop() { delete db; fortran::HBase::stop(); } }; struct fortran::Handler hsess; #endif struct HSimple : public fortran::HBase { fortran::API* api; void start() { fortran::HBase::start(); api = 0; } void stop() { if (api) delete api; fortran::HBase::stop(); } }; struct fortran::Handler hsimp; // FDBA_HANDLE_BODY(simple, MAX_SIMPLE, "Dballe simple sessions") // FDBA_HANDLE_BODY(session, MAX_SESSION, "Dballe sessions") //#define STATE (simples.get(*handle)) //#define SESSION (sessions.get(simples.get(*handle).session)) //FDBA_HANDLE(session, FDBA_HANDLE(simple, *handle).session).session) static int usage_refcount = 0; static void lib_init() { if (usage_refcount > 0) return; fortran::error_init(); #ifdef HAVE_DBALLE_DB hsess.init("DB-All.e database sessions", "MAX_CALLBACKS"); #endif hsimp.init("DB-All.e work sessions", "MAX_SIMPLE"); ++usage_refcount; } #if 0 static inline int double_is_missing(double d) { switch (fpclassify(d)) { case FP_ZERO: return 0; case FP_NORMAL: return d == MISSING_DOUBLE; default: return 1; } } #endif extern "C" { #ifdef HAVE_DBALLE_DB /** * Start working with a DBALLE database. * * This function can be called more than once once to connect to different * databases at the same time. * * @param dsn * The ODBC DSN of the database to use * @param user * The username used to connect to the database * @param password * The username used to connect to the database * @retval dbahandle * The database handle that can be passed to idba_preparati to work with the * database. * @return * The error indication for the function. */ F77_INTEGER_FUNCTION(idba_presentati)( INTEGER(dbahandle), CHARACTER(dsn), CHARACTER(user), CHARACTER(password) TRAIL(dsn) TRAIL(user) TRAIL(password)) { GENPTR_INTEGER(dbahandle) GENPTR_CHARACTER(dsn) GENPTR_CHARACTER(user) GENPTR_CHARACTER(password) const char* chosen_dsn; char s_dsn[50]; char s_user[20]; char s_password[20]; try { /* Import input string parameters */ cnfImpn(dsn, dsn_length, 49, s_dsn); s_dsn[49] = 0; cnfImpn(user, user_length, 19, s_user); s_user[19] = 0; cnfImpn(password, password_length, 19, s_password); s_password[19] = 0; /* Initialize the library if needed */ lib_init(); /* Allocate and initialize a new handle */ *dbahandle = hsess.request(); HSession& hs = hsess.get(*dbahandle); /* Open the DBALLE session */ /* If dsn is missing, look in the environment */ if (s_dsn[0] == 0) { chosen_dsn = getenv("DBA_DB"); if (chosen_dsn == NULL) chosen_dsn = ""; } else chosen_dsn = s_dsn; /* If dsn looks like a url, treat it accordingly */ if (DB::is_url(chosen_dsn)) hs.db->connect_from_url(chosen_dsn); else hs.db->connect(chosen_dsn, s_user, s_password); /* Open the database session */ return fortran::success(); } catch (error& e) { return fortran::error(e); } } #endif /** * Stop working with a DBALLE database * * @param dbahandle * The database handle to close. */ F77_SUBROUTINE(idba_arrivederci)(INTEGER(dbahandle)) { GENPTR_INTEGER(dbahandle) // try { #ifdef HAVE_DBALLE_DB hsess.release(*dbahandle); #endif /* dba_shutdown does not exist anymore, but I keep this code commented out here as a placeholder if in the future we'll need to hook actions when the usage refcount goes to 0 if (--usage_refcount == 0) dba_shutdown(); */ // return fortran::success(); // } catch (error& e) { // return fortran::error(e); // } } #ifdef HAVE_DBALLE_DB /** * Starts a session with dballe. * * You can call idba_preparati() many times and get more handles. This allows * to perform many operations on the database at the same time. * * idba_preparati() has three extra parameters that can be used to limit * write operations on the database, as a limited protection against * programming errors. * * Note that some combinations of parameters are illegal, such as anaflag=read * and dataflag=add (when adding a new data, it's sometimes necessary to insert * new pseudoana records), or dataflag=rewrite and qcflag=read (when deleting * data, their attributes are deleted as well). * * @param dbahandle * The main DB-ALLe connection handle * @retval handle * The session handle returned by the function * @param anaflag * Controls access to pseudoana records and can have these values: * \li \c "read" pseudoana records cannot be inserted. * \li \c "write" it is possible to insert and delete pseudoana records. * @param dataflag * Controls access to observed data and can have these values: * \li \c "read" data cannot be modified in any way. * \li \c "add" data can be added to the database, but existing data cannot be * modified. Deletions are disabled. This is used to insert new data in the * database while preserving the data that was already present in it. * \li \c "write" data can freely be added, overwritten and deleted. * @param qcflag * Controls access to data attributes and can have these values: * \li \c "read" attributes cannot be modified in any way. * \li \c "add" attributes can can be added to the database, but existing * attributes cannot be modified. Deletion of attributes is disabled. This is * used to insert new attribute in the database while preserving the attributes * that were already present in it. * \li \c "write" attributes can freely be added, overwritten and deleted. * @return * The error indication for the function. */ F77_INTEGER_FUNCTION(idba_preparati)( INTEGER(dbahandle), INTEGER(handle), CHARACTER(anaflag), CHARACTER(dataflag), CHARACTER(attrflag) TRAIL(anaflag) TRAIL(dataflag) TRAIL(attrflag)) { GENPTR_INTEGER(dbahandle) GENPTR_INTEGER(handle) GENPTR_CHARACTER(anaflag) GENPTR_CHARACTER(dataflag) GENPTR_CHARACTER(attrflag) char c_anaflag[10]; char c_dataflag[10]; char c_attrflag[10]; cnfImpn(anaflag, anaflag_length, 10, c_anaflag); cnfImpn(dataflag, dataflag_length, 10, c_dataflag); cnfImpn(attrflag, attrflag_length, 10, c_attrflag); try { /* Check here to warn users of the introduction of idba_presentati */ /* if (session == NULL) return dba_error_consistency("idba_presentati should be called before idba_preparati"); */ /* Allocate and initialize a new handle */ *handle = hsimp.request(); HSession& hs = hsess.get(*dbahandle); HSimple& h = hsimp.get(*handle); h.api = new fortran::DbAPI(*hs.db, c_anaflag, c_dataflag, c_attrflag); return fortran::success(); } catch (error& e) { hsimp.release(*handle); return fortran::error(e); } } #endif /** * Access a file with wheter messages * * @retval handle * The session handle returned by the function * @param filename * Name of the file to open * @param mode * File open mode. It can be: * \li \c r for read * \li \c w for write (the old file is deleted) * \li \c a for append * @param type * Format of the data in the file. It can be: * \li \c "BUFR" * \li \c "CREX" * \li \c "AOF" (read only) * \li \c "AUTO" (autodetect, read only) * @param force_report * if 0, nothing happens; otherwise, choose the output message template * using this report type instead of the one in the message * @return * The error indication for the function. */ F77_INTEGER_FUNCTION(idba_messaggi)( INTEGER(handle), CHARACTER(filename), CHARACTER(mode), CHARACTER(type) TRAIL(filename) TRAIL(mode) TRAIL(type)) { GENPTR_INTEGER(handle) GENPTR_CHARACTER(filename) GENPTR_CHARACTER(mode) GENPTR_CHARACTER(type) char c_filename[512]; char c_mode[10]; char c_type[10]; cnfImpn(filename, filename_length, 512, c_filename); cnfImpn(mode, mode_length, 10, c_mode); cnfImpn(type, type_length, 10, c_type); try { lib_init(); *handle = hsimp.request(); //HSession& hs = hsess.get(*dbahandle); HSimple& h = hsimp.get(*handle); h.api = new fortran::MsgAPI(c_filename, c_mode, c_type); return fortran::success(); } catch (error& e) { hsimp.release(*handle); return fortran::error(e); } } /** * Ends a session with DBALLE * * @param handle * Handle to the session to be closed. */ F77_INTEGER_FUNCTION(idba_fatto)(INTEGER(handle)) { GENPTR_INTEGER(handle) try { hsimp.release(*handle); return fortran::success(); } catch (error& e) { return fortran::error(e); } } /** * Reset the database contents, loading default report informations from a file. * * It only works in rewrite mode. * * @param handle * Handle to a DBALLE session * @param repinfofile * CSV file with the default report informations. See dba_reset() * documentation for the format of the file. * @return * The error indicator for the function */ F77_INTEGER_FUNCTION(idba_scopa)(INTEGER(handle), CHARACTER(repinfofile) TRAIL(repinfofile)) { GENPTR_INTEGER(handle) GENPTR_CHARACTER(repinfofile) char fname[PATH_MAX]; cnfImpn(repinfofile, repinfofile_length, PATH_MAX, fname); fname[PATH_MAX - 1] = 0; try { HSimple& h = hsimp.get(*handle); if (fname[0] == 0) h.api->scopa(0); else h.api->scopa(fname); return fortran::success(); } catch (error& e) { return fortran::error(e); } } /**@name idba_enq* * @anchor idba_enq * Functions used to read the output values of the DBALLE action routines * @{ */ /** * Read one integer value from the output record * * @param handle * Handle to a DBALLE session * @param parameter * Parameter to query. It can be the code of a WMO variable prefixed by \c * "B" (such as \c "B01023"); the code of a QC value prefixed by \c "*B" * (such as \c "*B01023") or a keyword among the ones defined in \ref * dba_record_keywords * @param value * Where the value will be returned * @return * The error indicator for the function */ F77_INTEGER_FUNCTION(idba_enqi)( INTEGER(handle), CHARACTER(parameter), INTEGER(value) TRAIL(parameter)) { GENPTR_INTEGER(handle) GENPTR_CHARACTER(parameter) GENPTR_INTEGER(value) char parm[20]; cnfImpn(parameter, parameter_length, 19, parm); parm[19] = 0; try { HSimple& h = hsimp.get(*handle); *value = h.api->enqi(parm); tofortran(*value); return fortran::success(); } catch (error& e) { return fortran::error(e); } } /** * Read one byte value from the output record * * @param handle * Handle to a DBALLE session * @param parameter * Parameter to query. It can be the code of a WMO variable prefixed by \c * "B" (such as \c "B01023"); the code of a QC value prefixed by \c "*B" * (such as \c "*B01023") or a keyword among the ones defined in \ref * dba_record_keywords * @param value * Where the value will be returned * @return * The error indicator for the function */ F77_INTEGER_FUNCTION(idba_enqb)( INTEGER(handle), CHARACTER(parameter), BYTE(value) TRAIL(parameter)) { GENPTR_INTEGER(handle) GENPTR_CHARACTER(parameter) GENPTR_BYTE(value) char parm[20]; cnfImpn(parameter, parameter_length, 19, parm); parm[19] = 0; try { HSimple& h = hsimp.get(*handle); *value = h.api->enqb(parm); if (*value == fortran::API::missing_byte) *value = MISSING_BYTE; return fortran::success(); } catch (error& e) { return fortran::error(e); } } /** * Read one real value from the output record * * @param handle * Handle to a DBALLE session * @param parameter * Parameter to query. It can be the code of a WMO variable prefixed by \c * "B" (such as \c "B01023"); the code of a QC value prefixed by \c "*B" * (such as \c "*B01023") or a keyword among the ones defined in \ref * dba_record_keywords * @param value * Where the value will be returned * @return * The error indicator for the function */ F77_INTEGER_FUNCTION(idba_enqr)( INTEGER(handle), CHARACTER(parameter), REAL(value) TRAIL(parameter)) { GENPTR_INTEGER(handle) GENPTR_CHARACTER(parameter) GENPTR_REAL(value) char parm[20]; cnfImpn(parameter, parameter_length, 19, parm); parm[19] = 0; try { HSimple& h = hsimp.get(*handle); *value = h.api->enqr(parm); if (*value == fortran::API::missing_float) *value = MISSING_REAL; return fortran::success(); } catch (error& e) { return fortran::error(e); } } /** * Read one real*8 value from the output record * * @param handle * Handle to a DBALLE session * @param parameter * Parameter to query. It can be the code of a WMO variable prefixed by \c * "B" (such as \c "B01023"); the code of a QC value prefixed by \c "*B" * (such as \c "*B01023") or a keyword among the ones defined in \ref * dba_record_keywords * @param value * Where the value will be returned * @return * The error indicator for the function */ F77_INTEGER_FUNCTION(idba_enqd)( INTEGER(handle), CHARACTER(parameter), DOUBLE(value) TRAIL(parameter)) { GENPTR_INTEGER(handle) GENPTR_CHARACTER(parameter) GENPTR_DOUBLE(value) char parm[20]; cnfImpn(parameter, parameter_length, 19, parm); parm[19] = 0; try { HSimple& h = hsimp.get(*handle); *value = h.api->enqd(parm); if (*value == fortran::API::missing_double) *value = MISSING_DOUBLE; return fortran::success(); } catch (error& e) { return fortran::error(e); } } /** * Read one character value from the output record * * @param handle * Handle to a DBALLE session * @param parameter * Parameter to query. It can be the code of a WMO variable prefixed by \c * "B" (such as \c "B01023"); the code of a QC value prefixed by \c "*B" * (such as \c "*B01023") or a keyword among the ones defined in \ref * dba_record_keywords * @param value * Where the value will be returned * @return * The error indicator for the function */ F77_INTEGER_FUNCTION(idba_enqc)( INTEGER(handle), CHARACTER(parameter), CHARACTER(value) TRAIL(parameter) TRAIL(value)) { GENPTR_INTEGER(handle) GENPTR_CHARACTER(parameter) GENPTR_CHARACTER(value) char parm[20]; cnfImpn(parameter, parameter_length, 19, parm); parm[19] = 0; try { HSimple& h = hsimp.get(*handle); const char* v = h.api->enqc(parm); if (!v) { if (value_length > 0) { // The missing string value has been defined as a // null byte plus blank padding. value[0] = 0; memset(value+1, ' ', value_length - 1); } } else cnfExprt(v, value, value_length); return fortran::success(); } catch (error& e) { return fortran::error(e); } } /*@}*/ /**@name idba_set* * @anchor idba_set * Functions used to read the input values for the DBALLE action routines *@{*/ /** * Set one integer value into the input record * * @param handle * Handle to a DBALLE session * @param parameter * Parameter to set. It can be the code of a WMO variable prefixed by \c * "B" (such as \c "B01023"); the code of a QC value prefixed by \c "*B" * (such as \c "*B01023") or a keyword among the ones defined in \ref * dba_record_keywords * @param value * The value to assign to the parameter * @return * The error indicator for the function */ F77_INTEGER_FUNCTION(idba_seti)( INTEGER(handle), CHARACTER(parameter), INTEGER(value) TRAIL(parameter)) { GENPTR_INTEGER(handle) GENPTR_CHARACTER(parameter) GENPTR_INTEGER(value) char parm[20]; cnfImpn(parameter, parameter_length, 19, parm); parm[19] = 0; try { HSimple& h = hsimp.get(*handle); if (*value == MISSING_INT) { TRACEMISSING("int"); h.api->unset(parm); } else h.api->seti(parm, *value); return fortran::success(); } catch (error& e) { return fortran::error(e); } } /** * Set one byte value into the input record * * @param handle * Handle to a DBALLE session * @param parameter * Parameter to set. It can be the code of a WMO variable prefixed by \c * "B" (such as \c "B01023"); the code of a QC value prefixed by \c "*B" * (such as \c "*B01023") or a keyword among the ones defined in \ref * dba_record_keywords * @param value * The value to assign to the parameter * @return * The error indicator for the function */ F77_INTEGER_FUNCTION(idba_setb)( INTEGER(handle), CHARACTER(parameter), BYTE(value) TRAIL(parameter)) { GENPTR_INTEGER(handle) GENPTR_CHARACTER(parameter) GENPTR_BYTE(value) char parm[20]; cnfImpn(parameter, parameter_length, 19, parm); parm[19] = 0; try { HSimple& h = hsimp.get(*handle); if (*value == MISSING_BYTE) { TRACEMISSING("byte"); h.api->unset(parm); } else h.api->setb(parm, *value); return fortran::success(); } catch (error& e) { return fortran::error(e); } } /** * Set one real value into the input record * * @param handle * Handle to a DBALLE session * @param parameter * Parameter to set. It can be the code of a WMO variable prefixed by \c * "B" (such as \c "B01023"); the code of a QC value prefixed by \c "*B" * (such as \c "*B01023") or a keyword among the ones defined in \ref * dba_record_keywords * @param value * The value to assign to the parameter * @return * The error indicator for the function */ F77_INTEGER_FUNCTION(idba_setr)( INTEGER(handle), CHARACTER(parameter), REAL(value) TRAIL(parameter)) { GENPTR_INTEGER(handle) GENPTR_CHARACTER(parameter) GENPTR_REAL(value) char parm[20]; cnfImpn(parameter, parameter_length, 19, parm); parm[19] = 0; try { HSimple& h = hsimp.get(*handle); if (*value == MISSING_REAL) { TRACEMISSING("real"); h.api->unset(parm); } else h.api->setr(parm, *value); return fortran::success(); } catch (error& e) { return fortran::error(e); } } /** * Set one real*8 value into the input record * * @param handle * Handle to a DBALLE session * @param parameter * Parameter to set. It can be the code of a WMO variable prefixed by \c * "B" (such as \c "B01023"); the code of a QC value prefixed by \c "*B" * (such as \c "*B01023") or a keyword among the ones defined in \ref * dba_record_keywords * @param value * The value to assign to the parameter * @return * The error indicator for the function */ F77_INTEGER_FUNCTION(idba_setd)( INTEGER(handle), CHARACTER(parameter), DOUBLE(value) TRAIL(parameter)) { GENPTR_INTEGER(handle) GENPTR_CHARACTER(parameter) GENPTR_DOUBLE(value) char parm[20]; cnfImpn(parameter, parameter_length, 19, parm); parm[19] = 0; try { HSimple& h = hsimp.get(*handle); if (*value == MISSING_DOUBLE) { TRACEMISSING("double"); h.api->unset(parm); } else h.api->setd(parm, *value); return fortran::success(); } catch (error& e) { return fortran::error(e); } } /** * Set one character value into the input record * * @param handle * Handle to a DBALLE session * @param parameter * Parameter to set. It can be the code of a WMO variable prefixed by \c * "B" (such as \c "B01023"); the code of a QC value prefixed by \c "*B" * (such as \c "*B01023") or a keyword among the ones defined in \ref * dba_record_keywords * @param value * The value to assign to the parameter * @return * The error indicator for the function */ F77_INTEGER_FUNCTION(idba_setc)( INTEGER(handle), CHARACTER(parameter), CHARACTER(value) TRAIL(parameter) TRAIL(value)) { GENPTR_INTEGER(handle) GENPTR_CHARACTER(parameter) GENPTR_CHARACTER(value) char parm[20]; char val[255]; cnfImpn(parameter, parameter_length, 19, parm); parm[19] = 0; cnfImpn(value, value_length, 254, val); val[254] = 0; try { HSimple& h = hsimp.get(*handle); if (val[0] == 0) { TRACEMISSING("char"); h.api->unset(parm); } else h.api->setc(parm, val); return fortran::success(); } catch (error& e) { return fortran::error(e); } } /** * Shortcut function to set query parameters to the anagraphical context * * @param handle * Handle to a DBALLE session * @return * The error indicator for the function */ F77_INTEGER_FUNCTION(idba_setcontextana)( INTEGER(handle)) { GENPTR_INTEGER(handle) try { HSimple& h = hsimp.get(*handle); h.api->setcontextana(); return fortran::success(); } catch (error& e) { return fortran::error(e); } } /** * Shortcut function to read level data. * * @param handle * Handle to a DBALLE session * @retval ltype * Level type from the output record * @retval l1 * L1 from the output record * @retval l2 * L2 from the output record * @return * The error indicator for the function */ F77_INTEGER_FUNCTION(idba_enqlevel)( INTEGER(handle), INTEGER(ltype1), INTEGER(l1), INTEGER(ltype2), INTEGER(l2)) { GENPTR_INTEGER(handle) GENPTR_INTEGER(ltype1) GENPTR_INTEGER(l1) GENPTR_INTEGER(ltype2) GENPTR_INTEGER(l2) try { HSimple& h = hsimp.get(*handle); h.api->enqlevel(*ltype1, *l1, *ltype2, *l2); tofortran(*ltype1); tofortran(*l1); tofortran(*ltype2); tofortran(*l2); return fortran::success(); } catch (error& e) { return fortran::error(e); } } /** * Shortcut function to set level data. * * @param handle * Handle to a DBALLE session * @param ltype * Level type to set in the input record * @param l1 * L1 to set in the input record * @param l2 * L2 to set in the input record * @return * The error indicator for the function */ F77_INTEGER_FUNCTION(idba_setlevel)( INTEGER(handle), INTEGER(ltype1), INTEGER(l1), INTEGER(ltype2), INTEGER(l2)) { GENPTR_INTEGER(handle) GENPTR_INTEGER(ltype1) GENPTR_INTEGER(l1) GENPTR_INTEGER(ltype2) GENPTR_INTEGER(l2) try { HSimple& h = hsimp.get(*handle); h.api->setlevel( fromfortran(*ltype1), fromfortran(*l1), fromfortran(*ltype2), fromfortran(*l2)); return fortran::success(); } catch (error& e) { return fortran::error(e); } } /** * Shortcut function to read time range data. * * @param handle * Handle to a DBALLE session * @retval ptype * P indicator from the output record * @retval p1 * P1 from the output record * @retval p2 * P2 from the output record * @return * The error indicator for the function */ F77_INTEGER_FUNCTION(idba_enqtimerange)( INTEGER(handle), INTEGER(ptype), INTEGER(p1), INTEGER(p2)) { GENPTR_INTEGER(handle) GENPTR_INTEGER(ptype) GENPTR_INTEGER(p1) GENPTR_INTEGER(p2) try { HSimple& h = hsimp.get(*handle); h.api->enqtimerange(*ptype, *p1, *p2); tofortran(*ptype); tofortran(*p1); tofortran(*p2); return fortran::success(); } catch (error& e) { return fortran::error(e); } } /** * Shortcut function to set time range data. * * @param handle * Handle to a DBALLE session * @param ptype * P indicator to set in the input record * @param p1 * P1 to set in the input record * @param p2 * P2 to set in the input record * @return * The error indicator for the function */ F77_INTEGER_FUNCTION(idba_settimerange)( INTEGER(handle), INTEGER(ptype), INTEGER(p1), INTEGER(p2)) { GENPTR_INTEGER(handle) GENPTR_INTEGER(ptype) GENPTR_INTEGER(p1) GENPTR_INTEGER(p2) try { HSimple& h = hsimp.get(*handle); h.api->settimerange( fromfortran(*ptype), fromfortran(*p1), fromfortran(*p2)); return fortran::success(); } catch (error& e) { return fortran::error(e); } } /** * Shortcut function to read date information. * * @param handle * Handle to a DBALLE session * @retval year * Year from the output record * @retval month * Month the output record * @retval day * Day the output record * @retval hour * Hour the output record * @retval min * Minute the output record * @retval sec * Second the output record * @return * The error indicator for the function */ F77_INTEGER_FUNCTION(idba_enqdate)( INTEGER(handle), INTEGER(year), INTEGER(month), INTEGER(day), INTEGER(hour), INTEGER(min), INTEGER(sec)) { GENPTR_INTEGER(handle) GENPTR_INTEGER(year) GENPTR_INTEGER(month) GENPTR_INTEGER(day) GENPTR_INTEGER(hour) GENPTR_INTEGER(min) GENPTR_INTEGER(sec) try { HSimple& h = hsimp.get(*handle); h.api->enqdate(*year, *month, *day, *hour, *min, *sec); tofortran(*year), tofortran(*month), tofortran(*day); tofortran(*hour), tofortran(*min), tofortran(*sec); return fortran::success(); } catch (error& e) { return fortran::error(e); } } /** * Shortcut function to set date information. * * @param handle * Handle to a DBALLE session * @param year * Year to set in the input record * @param month * Month to set in the input * @param day * Day to set in the input * @param hour * Hour to set in the input * @param min * Minute to set in the input * @param sec * Second to set in the input * @return * The error indicator for the function */ F77_INTEGER_FUNCTION(idba_setdate)( INTEGER(handle), INTEGER(year), INTEGER(month), INTEGER(day), INTEGER(hour), INTEGER(min), INTEGER(sec)) { GENPTR_INTEGER(handle) GENPTR_INTEGER(year) GENPTR_INTEGER(month) GENPTR_INTEGER(day) GENPTR_INTEGER(hour) GENPTR_INTEGER(min) GENPTR_INTEGER(sec) try { HSimple& h = hsimp.get(*handle); h.api->setdate( fromfortran(*year), fromfortran(*month), fromfortran(*day), fromfortran(*hour), fromfortran(*min), fromfortran(*sec)); return fortran::success(); } catch (error& e) { return fortran::error(e); } } /** * Shortcut function to set minimum date for a query. * * @param handle * Handle to a DBALLE session * @param year * Minimum year to set in the query * @param month * Minimum month to set in the query * @param day * Minimum day to set in the query * @param hour * Minimum hour to set in the query * @param min * Minimum minute to set in the query * @param sec * Minimum second to set in the query * @return * The error indicator for the function */ F77_INTEGER_FUNCTION(idba_setdatemin)( INTEGER(handle), INTEGER(year), INTEGER(month), INTEGER(day), INTEGER(hour), INTEGER(min), INTEGER(sec)) { GENPTR_INTEGER(handle) GENPTR_INTEGER(year) GENPTR_INTEGER(month) GENPTR_INTEGER(day) GENPTR_INTEGER(hour) GENPTR_INTEGER(min) GENPTR_INTEGER(sec) try { HSimple& h = hsimp.get(*handle); h.api->setdatemin( fromfortran(*year), fromfortran(*month), fromfortran(*day), fromfortran(*hour), fromfortran(*min), fromfortran(*sec)); return fortran::success(); } catch (error& e) { return fortran::error(e); } } /** * Shortcut function to set maximum date for a query. * * @param handle * Handle to a DBALLE session * @param year * Maximum year to set in the query * @param month * Maximum month to set in the query * @param day * Maximum day to set in the query * @param hour * Maximum hour to set in the query * @param min * Maximum minute to set in the query * @param sec * Maximum second to set in the query * @return * The error indicator for the function */ F77_INTEGER_FUNCTION(idba_setdatemax)( INTEGER(handle), INTEGER(year), INTEGER(month), INTEGER(day), INTEGER(hour), INTEGER(min), INTEGER(sec)) { GENPTR_INTEGER(handle) GENPTR_INTEGER(year) GENPTR_INTEGER(month) GENPTR_INTEGER(day) GENPTR_INTEGER(hour) GENPTR_INTEGER(min) GENPTR_INTEGER(sec) try { HSimple& h = hsimp.get(*handle); h.api->setdatemax( fromfortran(*year), fromfortran(*month), fromfortran(*day), fromfortran(*hour), fromfortran(*min), fromfortran(*sec)); return fortran::success(); } catch (error& e) { return fortran::error(e); } } /*@}*/ /** * Remove one parameter from the input record * * @param handle * Handle to a DBALLE session * @param parameter * Parameter to remove. It can be the code of a WMO variable prefixed by \c * "B" (such as \c "B01023"); the code of a QC value prefixed by \c "*B" * (such as \c "*B01023") or a keyword among the ones defined in \ref * dba_record_keywords * @return * The error indicator for the function */ F77_INTEGER_FUNCTION(idba_unset)( INTEGER(handle), CHARACTER(parameter) TRAIL(parameter)) { GENPTR_INTEGER(handle) GENPTR_CHARACTER(parameter) GENPTR_INTEGER(err) char parm[20]; cnfImpn(parameter, parameter_length, 19, parm); parm[19] = 0; try { HSimple& h = hsimp.get(*handle); h.api->unset(parm); return fortran::success(); } catch (error& e) { return fortran::error(e); } } /** * Remove all parameters from the input record * * @param handle * Handle to a DBALLE session */ F77_SUBROUTINE(idba_unsetall)( INTEGER(handle)) { GENPTR_INTEGER(handle) HSimple& h = hsimp.get(*handle); h.api->unsetall(); } /** * Count the number of elements in the anagraphical storage, and start a new * anagraphical query. * * Resulting anagraphical data can be retrieved with idba_elencamele() * * @param handle * Handle to a DBALLE session * @param count * The count of elements * @return * The error indicator for the function */ F77_INTEGER_FUNCTION(idba_quantesono)( INTEGER(handle), INTEGER(count)) { GENPTR_INTEGER(handle) GENPTR_INTEGER(count) try { HSimple& h = hsimp.get(*handle); *count = h.api->quantesono(); return fortran::success(); } catch (error& e) { return fortran::error(e); } } /** * Iterate through the anagraphical data. * * Every invocation of this function will return a new anagraphical data, or * fill fail with code DBA_ERR_NOTFOUND when there are no more anagraphical * data available. * * @param handle * Handle to a DBALLE session * @return * The error indicator for the function */ F77_INTEGER_FUNCTION(idba_elencamele)(INTEGER(handle)) { GENPTR_INTEGER(handle) try { HSimple& h = hsimp.get(*handle); h.api->elencamele(); return fortran::success(); } catch (error& e) { return fortran::error(e); } } /** * Submit a query to the database. * * The query results can be accessed with calls to idba_dammelo. * * @param handle * Handle to a DBALLE session * @retval count * Number of values returned by the function * @return * The error indicator for the function */ F77_INTEGER_FUNCTION(idba_voglioquesto)( INTEGER(handle), INTEGER(count)) { GENPTR_INTEGER(handle) GENPTR_INTEGER(count) try { HSimple& h = hsimp.get(*handle); *count = h.api->voglioquesto(); return fortran::success(); } catch (error& e) { return fortran::error(e); } } /** * Iterate through the query results data. * * Every invocation of this function will return a new result, or fill fail * with code DBA_ERR_NOTFOUND when there are no more results available. * * @param handle * Handle to a DBALLE session * @retval parameter * Contains the ID of the parameter retrieved by this fetch * @return * The error indicator for the function */ F77_INTEGER_FUNCTION(idba_dammelo)( INTEGER(handle), CHARACTER(parameter) TRAIL(parameter)) { GENPTR_INTEGER(handle) GENPTR_CHARACTER(parameter) try { HSimple& h = hsimp.get(*handle); const char* res = h.api->dammelo(); if (!res) cnfExprt("", parameter, parameter_length); else cnfExprt(res, parameter, parameter_length); return fortran::success(); } catch (error& e) { return fortran::error(e); } } /** * Insert a new item in the database. * * This function will fail if the database is open in data readonly mode, and * it will refuse to overwrite existing values if the database is open in data * add mode. * * If the database is open in pseudoana reuse mode, the pseudoana values * provided on input will be used to create a pseudoana record if it is * missing, but will be ignored if it is already present. If it is open in * pseudoana rewrite mode instead, the pseudoana values on input will be used * to replace all the existing pseudoana values. * * @param handle * Handle to a DBALLE session * @return * The error indicator for the function */ F77_INTEGER_FUNCTION(idba_prendilo)( INTEGER(handle)) { GENPTR_INTEGER(handle) try { HSimple& h = hsimp.get(*handle); h.api->prendilo(); return fortran::success(); } catch (error& e) { return fortran::error(e); } } /** * Remove all selected items from the database. * * This function will fail unless the database is open in data rewrite mode. * * @param handle * Handle to a DBALLE session * @return * The error indicator for the function */ F77_INTEGER_FUNCTION(idba_dimenticami)( INTEGER(handle)) { GENPTR_INTEGER(handle) try { HSimple& h = hsimp.get(*handle); h.api->dimenticami(); return fortran::success(); } catch (error& e) { return fortran::error(e); } } /**@name QC functions * @anchor qc * Functions used to manipulate QC data. * * All these functions require some context data about the variable, which is * automatically available when the variable just came as the result of an * idba_dammelo() or has just been inserted with an idba_prendilo(). *@{ */ F77_INTEGER_FUNCTION(idba_voglioancora)(INTEGER(handle), INTEGER(count)) { GENPTR_INTEGER(handle) GENPTR_INTEGER(count) try { HSimple& h = hsimp.get(*handle); *count = h.api->voglioancora(); return fortran::success(); } catch (error& e) { return fortran::error(e); } } /** * Retrieve QC informations from the last variable returned by idba_dammelo(). * * @param handle * Handle to a DBALLE session * @retval parameter * Contains the ID of the parameter retrieved by this fetch * @return * The error indicator for the function */ F77_INTEGER_FUNCTION(idba_ancora)( INTEGER(handle), CHARACTER(parameter) TRAIL(parameter)) { GENPTR_INTEGER(handle) GENPTR_CHARACTER(parameter) try { HSimple& h = hsimp.get(*handle); const char* res = h.api->ancora(); if (!res) cnfExprt("", parameter, parameter_length); else cnfExprt(res, parameter, parameter_length); return fortran::success(); } catch (error& e) { return fortran::error(e); } } /** * Insert new QC informations for a variable of the current record. * * QC informations inserted are all those set by the functions idba_seti(), * idba_setc(), idba_setr(), idba_setd(), using an asterisk in front of the * variable name. * * Contrarily to idba_prendilo(), this function resets all the QC informations * (but only the QC informations) previously set in input, so the values to be * inserted need to be explicitly set every time. * * This function will fail if the database is open in QC readonly mode, and it * will refuse to overwrite existing values if the database is open in QC add * mode. * * The variable referred by the QC informations can be specified in three ways: * * \li by variable code, using ::idba_setc(handle, "*var", "Bxxyyy") * \li by variable id, using ::idba_seti(handle, "*data_id", id) * \li unspecified, will use the last variable returned by ::idba_dammelo * * @param handle * Handle to a DBALLE session * @return * The error indicator for the function */ F77_INTEGER_FUNCTION(idba_critica)( INTEGER(handle)) { GENPTR_INTEGER(handle) try { HSimple& h = hsimp.get(*handle); h.api->critica(); return fortran::success(); } catch (error& e) { return fortran::error(e); } } /** * Remove QC informations for a variable of the current record. * * The QC informations to be removed are set with: * \code * idba_setc(handle, "*varlist", "*B33021,*B33003"); * \endcode * * The variable referred by the QC informations can be specified in three ways: * * \li by variable code, using ::idba_setc(handle, "*var", "Bxxyyy") * \li by variable id, using ::idba_seti(handle, "*data_id", id) * \li unspecified, will use the last variable returned by ::idba_dammelo * * @param handle * Handle to a DBALLE session * @return * The error indicator for the function */ F77_INTEGER_FUNCTION(idba_scusa)(INTEGER(handle)) { GENPTR_INTEGER(handle) try { HSimple& h = hsimp.get(*handle); h.api->scusa(); return fortran::success(); } catch (error& e) { return fortran::error(e); } } F77_INTEGER_FUNCTION(idba_spiegal)( INTEGER(handle), INTEGER(ltype1), INTEGER(l1), INTEGER(ltype2), INTEGER(l2), CHARACTER(result) TRAIL(result)) { GENPTR_INTEGER(handle) GENPTR_INTEGER(ltype1) GENPTR_INTEGER(l1) GENPTR_INTEGER(ltype2) GENPTR_INTEGER(l2) GENPTR_CHARACTER(result) try { HSimple& h = hsimp.get(*handle); const char* res = h.api->spiegal(*ltype1, *l1, *ltype2, *l2); cnfExprt(res, result, result_length); return fortran::success(); } catch (error& e) { return fortran::error(e); } } F77_INTEGER_FUNCTION(idba_spiegat)( INTEGER(handle), INTEGER(ptype), INTEGER(p1), INTEGER(p2), CHARACTER(result) TRAIL(result)) { GENPTR_INTEGER(handle) GENPTR_INTEGER(ptype) GENPTR_INTEGER(p1) GENPTR_INTEGER(p2) GENPTR_CHARACTER(result) try { HSimple& h = hsimp.get(*handle); const char* res = h.api->spiegat(*ptype, *p1, *p2); cnfExprt(res, result, result_length); return fortran::success(); } catch (error& e) { return fortran::error(e); } } F77_INTEGER_FUNCTION(idba_spiegab)( INTEGER(handle), CHARACTER(varcode), CHARACTER(value), CHARACTER(result) TRAIL(varcode) TRAIL(value) TRAIL(result)) { GENPTR_INTEGER(handle) GENPTR_CHARACTER(varcode) GENPTR_CHARACTER(value) GENPTR_CHARACTER(result) char s_varcode[10]; char s_value[300]; cnfImpn(varcode, varcode_length, 9, s_varcode); s_varcode[9] = 0; cnfImpn(value, value_length, 299, s_value); s_value[299] = 0; try { HSimple& h = hsimp.get(*handle); const char* res = h.api->spiegab(s_varcode, s_value); cnfExprt(res, result, result_length); return fortran::success(); } catch (error& e) { return fortran::error(e); } } F77_INTEGER_FUNCTION(idba_test_input_to_output)( INTEGER(handle)) { GENPTR_INTEGER(handle) try { HSimple& h = hsimp.get(*handle); h.api->test_input_to_output(); return fortran::success(); } catch (error& e) { return fortran::error(e); } } } /*@}*/ /* vim:set ts=4 sw=4: */ dballe-5.18/fortran/dbapi.h0000644000175000017500000000302711465006161012520 00000000000000#ifndef FDBA_DBAPI_H #define FDBA_DBAPI_H /* * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "commonapi.h" namespace dballe { struct DB; namespace db { struct Cursor; } namespace fortran { class DbAPI : public CommonAPIImplementation { protected: DB& db; db::Cursor* ana_cur; db::Cursor* query_cur; public: DbAPI(DB& db, const char* anaflag, const char* dataflag, const char* attrflag); virtual ~DbAPI(); virtual void scopa(const char* repinfofile = 0); virtual int quantesono(); virtual void elencamele(); virtual int voglioquesto(); virtual const char* dammelo(); virtual void prendilo(); virtual void dimenticami(); virtual int voglioancora(); virtual void critica(); virtual void scusa(); }; } } /* vim:set ts=4 sw=4: */ #endif dballe-5.18/fortran/simple.cc0000644000175000017500000000234511446470254013101 00000000000000/* * fortran/simple - Interface for Fortran API implementations * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "simple.h" #include using namespace std; namespace dballe { namespace fortran { const signed char API::missing_byte = numeric_limits::min(); const int API::missing_int = numeric_limits::min(); const float API::missing_float = numeric_limits::max(); const double API::missing_double = numeric_limits::max(); } } /* vim:set ts=4 sw=4: */ dballe-5.18/fortran/msgapi-tut.cc0000644000175000017500000000250711466263753013710 00000000000000/* * Copyright (C) 2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include #include "msgapi.h" using namespace dballe; namespace tut { struct msgapi_shar { msgapi_shar() { } ~msgapi_shar() { } }; TESTGRP(msgapi); template<> template<> void to::test<1>() { // Open test file std::string fname = tests::datafile("bufr/simple-generic-group.bufr"); fortran::MsgAPI api(fname.c_str(), "r", "BUFR"); ensure_equals(api.voglioquesto(), 12); ensure_equals(api.voglioquesto(), 12); ensure_equals(api.voglioquesto(), 12); } } /* vim:set ts=4 sw=4: */ dballe-5.18/doc/0000755000175000017500000000000011754670142010447 500000000000000dballe-5.18/doc/db.dia0000644000175000017500000000367311173330007011430 00000000000000OH$3Tm![{撋BjڙxϾ0 @6j&l޷_{@Ext70uc>Vw/|gY j(IߎFzMBFO_d4H^˯)[l$"һxVo"yh6/j/̋Oc@d

=OL]Lnk^/5'mǩӎMsgVj3}ڊVИEK-Bo -Bo -ުgHC Nlp4{ ! tCłAj@M ; 'H4FpMǍi:j:FgL gѩyq.;E*t@‘o@o@oPPDؓ{5y 'xjók|Dn20i!v psw4//p\ۏi@|@|@|K]<7 tAh Շ>hc14fnOO5|3V;k?vjAk!k!kD`Vj$ B7u4B"~OT+u0|:iƎ30fj})h`4cs40f19>ӧ$7WJVXD(խ5vrԇr1ލLn7Ts!]kH"DiOS.Bqy "FwjxRhO qf3yR}YjY;Ltkpcrp>P*&.Jfpƕx#Wp¡2c:v'96;o2cel HI+ae#YqeUS9chS띚Nq9R#M'㋓Yu2YLK@c^1@cۦZ^lw<غ2QNTEsg)hsoSMӋ+e3;lFը^UY ޿'>dballe-5.18/doc/Makefile.in0000644000175000017500000004015311754230756012442 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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@ 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@ @DO_DOCS_TRUE@am__append_1 = libdballe.doxytags guide.ps @DO_DOCS_TRUE@am__append_2 = c_api/index.html @DO_DBALLEF_TRUE@@DO_DOCS_TRUE@am__append_3 = fapi.ps libdballef.doxytags @DO_DBALLEF_TRUE@@DO_DOCS_TRUE@am__append_4 = fortran_api/index.html @DO_DBALLE_PYTHON_TRUE@@DO_DOCS_TRUE@am__append_5 = dballe-doc.i @DO_DOCS_TRUE@@HAVE_LATEX2HTML_TRUE@am__append_6 = \ @DO_DOCS_TRUE@@HAVE_LATEX2HTML_TRUE@ fapi_html/index.html \ @DO_DOCS_TRUE@@HAVE_LATEX2HTML_TRUE@ guide_html/index.html @DO_DBALLE_DB_TRUE@am__append_7 = ../dballe/main-db.dox subdir = doc DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/libdballe.dox.in $(srcdir)/libdballef.dox.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_flag.m4 \ $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/python.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = libdballe.dox libdballef.dox CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = 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)$(docdir)" DATA = $(doc_DATA) $(noinst_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FC = @FC@ FCFLAGS = @FCFLAGS@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBDBALLEF_VERSION_INFO = @LIBDBALLEF_VERSION_INFO@ LIBDBALLE_VERSION_INFO = @LIBDBALLE_VERSION_INFO@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LUA_CFLAGS = @LUA_CFLAGS@ LUA_LIBS = @LUA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ 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@ PKG_CONFIG = @PKG_CONFIG@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WIBBLE_CFLAGS = @WIBBLE_CFLAGS@ WIBBLE_LIBS = @WIBBLE_LIBS@ WREPORT_CFLAGS = @WREPORT_CFLAGS@ WREPORT_LIBS = @WREPORT_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ confdir = @confdir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ have_doxygen = @have_doxygen@ have_gperf = @have_gperf@ have_latex2html = @have_latex2html@ have_rst2html = @have_rst2html@ have_swig = @have_swig@ 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@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ tabledir = @tabledir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ guidesources = guide.tex intro.tex install.tex maintainance.tex troubleshooting.tex local.bib db.dia db.eps fapisources = fapi.tex ../dballe/core/record_keyword.tex ../dballe/msg/ltypes.tex ../dballe/msg/tranges.tex cdoxdeps = libdballe.dox \ ../dballe/libdballe.la \ ../dballe/msg/ltypes.dox \ ../dballe/msg/tranges.dox fortrandoxdeps = libdballef.dox \ ../fortran/libdballef.la LATEX2HTML = latex2html -local_icons doc_DATA = $(am__append_1) $(am__append_3) noinst_DATA = $(am__append_2) $(am__append_4) $(am__append_5) \ $(am__append_6) #mainpages += ../dballe/main-bufrex.dox mainpages = ../dballe/main-core.dox ../dballe/main-msg.dox \ $(am__append_7) TEXINPUTS = "$(srcdir)" EXTRA_DIST = libdballe.dox $(guidesources) fapi.tex doxy2swig.py add_templates_to_manpage introduzione.odt CLEANFILES = libdballe.doxytags libdballef.doxytags {guide,fapi}.{ps,pdf,dvi,aux,bbl,idx,log,toc,blg} dballe-doc.i 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) --foreign doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign 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): libdballe.dox: $(top_builddir)/config.status $(srcdir)/libdballe.dox.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ libdballef.dox: $(top_builddir)/config.status $(srcdir)/libdballef.dox.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-docDATA: $(doc_DATA) @$(NORMAL_INSTALL) test -z "$(docdir)" || $(MKDIR_P) "$(DESTDIR)$(docdir)" @list='$(doc_DATA)'; test -n "$(docdir)" || list=; \ 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) tags: TAGS TAGS: ctags: CTAGS CTAGS: 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 $(DATA) installdirs: for dir in "$(DESTDIR)$(docdir)"; 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: -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." clean: clean-am clean-am: clean-generic clean-libtool clean-local 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-docDATA 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 mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-docDATA uninstall-local .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ clean-local distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-docDATA 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 \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-docDATA uninstall-local install-data-local: for pkg in c fortran; do \ test -d $${pkg}_api && \ $(mkinstalldirs) $(DESTDIR)$(docdir)/$${pkg}_api && \ find $${pkg}_api -type f -exec $(INSTALL_DATA) '{}' $(DESTDIR)$(docdir)/$${pkg}_api/ \; ; \ done || true for pkg in fapi_html guide_html; do \ test -d $$pkg && \ $(mkinstalldirs) $(DESTDIR)$(docdir)/$$pkg && \ find $$pkg -type f -exec $(INSTALL_DATA) '{}' $(DESTDIR)$(docdir)/$$pkg/ \; ; \ done || true uninstall-local: for pkg in c fortran; do \ rm -rf $(DESTDIR)$(docdir)/$${pkg}_api; \ done || true libwreport.doxytags: /usr/share/doc/libwreport-dev/libwreport.doxytags.gz zcat $< > $@ libdballe.doxytags c_api/index.html xml/index.xml: $(cdoxdeps) $(mainpages) doxygen $< libdballef.doxytags fortran_api/index.html: $(fortrandoxdeps) doxygen $< dballe-doc.i: xml/index.xml doxy2swig.py $(srcdir)/doxy2swig.py $< $@ fapi_html/index.html: $(fapisources) $(LATEX2HTML) -dir fapi_html -mkdir $< guide_html/index.html: $(guidesources) $(LATEX2HTML) -dir guide_html -mkdir $< #fapi-quick.html: fapi-quick.rst ../dballe/core/dba_record_keyword.rst #fapi-quick.html: fapi-quick.rst # rst2html < $< > $@ %.ps: %.dvi TEXINPUTS="$(TEXINPUTS):" dvips $< -o %.pdf: %.ps ps2pdf $< %.aux: %.tex TEXINPUTS="$(TEXINPUTS):" latex $< %.bbl: %.aux BIBINPUTS="$(TEXINPUTS):" bibtex `basename $< .aux` %.dvi: %.tex %.aux %.bbl TEXINPUTS="$(TEXINPUTS):" latex $< BIBINPUTS="$(TEXINPUTS):" bibtex `basename $< .tex` TEXINPUTS="$(TEXINPUTS):" latex $< # Additional dependencies for guide.dvi guide.dvi: $(guidesources) fapi.dvi: $(fapisources) clean-local: rm -rf {c,fortran}_api rm -rf xml rm -rf guide_html rm -rf fapi_html rm -f libwreport.doxytags # 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: dballe-5.18/doc/maintainance.tex0000644000175000017500000002471111173330007013531 00000000000000\section {Configuration} A normal \dballe{} installation normally requires very little configuration, namely only the parameters used to connect to the database. Those are either specified in the code with the functions {\tt dba\_db\_create} (from C) or {\tt idba\_presentati} (from Fortran), or in the commandline for {\tt dbadb}. If special needs arise, further parameters that usually have good and working default values can be altered via environment variables: \begin{description} \item[{\tt DBA\_TABLES}] specifies the directory where the various table files are looked for (all the table files excluding {\tt repinfo.csv}). If the variable is not present, the default is {\tt /usr/share/dballe}. \item[{\tt DBA\_REPINFO}] specifies the full path of the file {\tt repinfo.csv} to use when resetting the databse. If the variable is not present, the default is {\tt /etc/dballe/repinfo.csv}. \item[{\tt DBA\_VERBOSE}] enable verbose reporting of \dballe{} internals. The value is a bit mask where every bit corresponds to a different internal part of \dballe{}, and when a bit is 1 then verbose messages are printed when that part runs. All the currently defined bit meanings can be found in {\tt /usr/include/dballe/core/verbose.h}. The default is 0, which means no verbose reporting at all. \item[{\tt DBA\_AOF\_ENDIANNESS}] select a specific endianness to use when encoding AOF messages. The possible values are {\tt ARCH} (use the endianness of the current host), {\tt LE} (little endian) and {\tt BE} (big endian). If the variable is not present, then the default value is {\tt ARCH}. \end{description} \section {Commandline tools} All the tools have a manpage as well as online help. To get a list of the various commands provided by a tool, run it with the {\tt --help} option. To see mode details about a given command, use {\tt --help} after the name of the command, as in {\tt dbamsg dump --help}. The syntax {\tt dbamsg help dump} works as well. \subsection{dbatbl} {\tt dbatbl} is the tool to manage table files. It is useful for small table management tasks like searching table contents and expand entries. \subsection{dbamsg} {\tt dbamsg} is the tool to manage messages. It can display their contents, select messages from a file containing many of them, convert messages among different format, find differences among messages. \subsection{dbadb} {\tt dbadb} is the tool to manage the \dballe{} database. It can reset the database, import and export messages and dump the contents of the database. To import a BUFR file into the database, simply use: {\tt dbadb import file.bufr}. If it does not work, you probably need to add some switches with the parameters to connect to the database, like {\tt --user={\it user} } and {\tt --pass={\it password} }. \section {Managing tables} \dballe{} needs various kinds of data tables to work: \begin{description} \item[repinfo.csv] Contains informations about all the supported origins of data, including a text description, a short memo and the importance of the various kinds of data compared to the others. \item[dballe.txt] Contains the description of all the possible kinds of variables that can be handled by \dballe{}, with information such as text description, measurement units, number of digits used for encoding. It is usually referred as ``the local B table'', and is used for all internal representation and for exporting ``generic'' messages. \item[WMO B tables] Data description tables maintained by WMO that are used for encoding and decoding BUFR and CREX messages. \item[WMO D tables] Data grouping tables maintained by WMO that are used for encoding and decoding BUFR and CREX messages. \end{description} \subsection{repinfo.csv} The file {\tt repinfo.csv} is usually installed in {\tt /etc/dballe/} and is only read when creating or recreating a database. It is a table encoded in CSV format, where every line is a table row and table columns are separated by commas. No particular string escaping is supported, so no strings should contain a comma. This is an example {\tt repinfo.csv}: \begin{verbatim} 01,synop,report synottico,100,oss,0 02,metar,metar,80,oss,0 03,temp,radiosondaggio,100,oss,2 04,pilot,pilot,90,oss,2 09,boe,dati omdametrici,100,oss,31 10,ship,synop da nave,100,oss,1 11,tempship,temp da nave,100,oss,2 12,airep,airep,80,oss,4 13,amdar,amdar,100,oss,4 14,acars,acars,100,oss,4 104,ana_lm,valori analizzati LM,-1,ana,255 105,ana,analisi,-10,pre,255 106,pre_cleps_box1.5maxel001,previsti cosmo leps box 1.5 gradi valore max elemento 1,-1,pre,255 107,pre_lmn_box1.5med,previzione Lokal Model nudging box 1.5 gradi valore medio,-1,pre,255 108,pre_lmp_spnp0,previsione Lkal Model prognostica interpolato punto piu' vicino,-1,pre,255 255,generic,export generici da DB Meteo,1,oss,42 \end{verbatim} The file has six columns: \begin{enumerate} \item The report code. This is used to refer to this report type in all the internal representations. \item The mnemonic short name. It can be used to univocally refer to this report type in a way that is easier to remember than the report code. \item The complete name. \item The report priority. When more data are found in the same physical point but with different report types, the report priority can be used to select a best value among them. \item FIXME: Unknown: "descriptor" \item FIXME: Unknown: "table a" \end{enumerate} \subsection{dballe.txt} The file {\tt dballe.txt} is usually installed in {\tt /usr/share/dballe/} and contains the variable definitions used when working with \dballe{}. {\tt dballe.txt} is used at least for these tasks: \begin{itemize} \item Encoding values in the \dballe{} database. \item Accessing values from the Fortran API\cite{FAPI}. \item Encoding values in memory as intermediate representation when converting among different encodings. \item Encoding values for exporting to BUFR and CREX messages using the non-standard 'generic' template. \end{itemize} The file contains 8 columns with fixed width: \begin{enumerate} \item The variable code to use to refer to this measure (6 characters). \item The description (64 characters). \item The measure unit to use when encoding to BUFR (24 characters). \item The scale to use when encoding to BUFR (3 characters). \item The reference value to use when encoding to BUFR (12 characters). \item The width of the field in \emph{bits} to use when encoding to BUFR (3 characters). \item The measure unit to use when encoding to CREX (24 characters). \item The scale to use when encoding to CREX (3 characters). \item The width of the field in \emph{bytes} to use when encoding to CREX, not including the leading minus sign of negative numbers (10 characters). \end{enumerate} There is a space character before each column, including before the first one. Elements can be freely added to {\tt dballe.txt} paying attention to respecting the file format. There is no need for indexing, and the local B table is read and parsed the first time that a program needs a value from it, and cached in memory for the entire lifetime of the program. \subsection{WMO B tables and WMO D tables} To be able to encode and decode standard BUFR and CREX messages there is a need of extra tables provided by the data center originating the data. These tables are normally to be installed in {\tt /usr/share/dballe} and have special names so that they can be easily identified from the header information stored in the BUFR or CREX message. The format of these tables, in the case of B tables is analogous to the format of {\tt dballe.txt}. BUFR tables usually do not contain the last 3 fields which are specific to CREX encoding, while CREX tables also contain BUFR encoding informations. WMO D tables contain instead definitions of groups of variables to use to reduce the size of a BUFR or CREX message. The file contains 3 fixed width columns, and the rows are organised in records starting with a line with 3 values followed by one or more continuation lines with only one value. The start of a D table record contains: \begin{enumerate} \item D table code used to refer to this group of variables (6 characters). \item Number of elements in the expansion (2 characters). \item First element of the expansion (6 characters). \end{enumerate} The continuation rows of a D table only contains one element of the expansion. An element in the expansion could consist of a B table element, a D table element or occasionally some C table references or repetition codes as explained in the BUFR and CREX documentation. Like the WMO B table, in the WMO D table there is a space character before each column, including before the first one. \dballe{} does not require indexing to access the B and D tables used for encoding: if new B and D tables needs to be installed, they just need to be copied in {\tt /usr/share/dballe} with the right name. The name of the BUFR WMO B and D table files is in the form {\tt t00000aaabbbccdd}, where: \begin{description} \item[{\tt t}] is ``B'' or ``D'' (WMO B table or WMO D table). % FIXME: what is aaa? \item[{\tt aaa}] is normally 0. \item[{\tt bbb}] is the 3 digit code of the originating center. \item[{\tt cc}] is the 2 digit code of the master table used to create the BUFR message. \item[{\tt dd}] is the 2 digit code of the local table used to augment the master table. \end{description} The name of CREX WMO B and D tables is instead in the form {\tt taabbcc}, where: \begin{description} \item[{\tt t}] is ``B'' or ``D'' (WMO B table or WMO D table). \item[{\tt aa}] is the 2 digit code of the master table used to create the CREX message. \item[{\tt bb}] is the 2 digit CREX edition number. \item[{\tt cc}] is the 2 digit code of the table used to create the CREX message. \end{description} \section{Database structure} The \dballe{} database is implemented using 5 SQL tables: \begin{description} \item[{\tt repinfo}] Stores informations about the record types. \item[{\tt pseudoana}] Stores anagraphical informations about the origin of the data. \item[{\tt context}] Stores non-anagraphical context informations about the data (date/time, level layer, time range, report type). \item[{\tt data}] Stores the measured data. \item[{\tt attr}] Stores the attributes of measured data. \end{description} The relationships between the 5 tables are as follows: \begin{figure} \begin{center} \includegraphics[width=\textwidth]{db.eps} \end{center} \caption{Structure of \dballe{} database} \end{figure} dballe-5.18/doc/fapi.tex0000644000175000017500000017442211627730600012035 00000000000000% % Editorial notes are found in the 'Introduction' chapter, marked with a % comment to find them more easily % %\documentclass[draft,a4paper]{book} %\documentclass[final,a4wide]{book} %\documentclass[final,12pt,a4paper,twoside]{book} \documentclass[final,12pt,a4paper,twoside]{book} %\usepackage[italian]{babel} \usepackage[ascii]{inputenc} \usepackage[T1]{fontenc} \usepackage{graphicx} \usepackage{moreverb} \usepackage{ifthen} % Include alcuni simboli non piú standard ma usati da gnuplot \usepackage{subfigure} \usepackage{epsfig} \usepackage{longtable} \title{DB-ALLe Guide of the Fortran API} \author{Enrico Zini \hfil {\tt enrico@enricozini.com}} % Copyright: GNU GPL v2 or later. \newcommand{\dballe}{{\tt DB-ALLe}} \newcommand{\srcinsert}[1]{% {\scriptsize \verbatimtabinput[4]{#1} }} %\newlength{\savedmarginparwidth} \newcommand{\figures}[2][!]{% \smallskip %\setlength{\savedmarginparwidth}{\marginparwidth} %\setlength{\marginparwidth}{0pt} \begin{minipage}[c]{\textwidth} \ifthenelse{\equal{#1}{!}}{}{#1:\\} #2 \end{minipage} \medskip %\setlength{\marginparwidth}{\savedmarginparwidth} } \makeindex \begin{document} \setlength{\oddsidemargin}{0pt} \setlength{\evensidemargin}{0pt} \bibliographystyle{plain} \maketitle %\begin{abstract} %This document is a quick introduction to the Fortran API of DB-ALLe. It %proceeds step by step to introducing different parts of the library using %commented example code. %\end{abstract} \tableofcontents %\listoffigures %\listoftables \chapter {Introduction} \label{ch-intro} \dballe{} is a fast, temporary, on-disk database where meteorological data can be stored, searched, retrieved and updated. To make computation easier, data is stored as physical data, that is, as measures of a variable in a specific point of space and time, rather than as a sequence of reports. This is a quick introduction to \dballe{}. It is intended as a quick read to get up to speed, and as a quick reference for everyday use. % Editorial notes This guide contains examples for all routines, plus examples for all known common usage patterns of dballe. Also, commented Fortran code is preferred to long explanations whenever it makes sense. Other documentation can be found in \cite{UserGuide} and \cite{LibDoc}. \chapter {Basic concepts} \label{ch-concepts} \section{Connections, sessions and handles} \dballe{} stores meteorological values in a database. This database can be optionally shared or accessed using the network. You contact \dballe{} by creating a \emph{connection}, and you work in \dballe{} using one or more \emph{sessions}. A connection is an established link between your program and \dballe{}, and you usually open it at the beginning of your work and close it at the end. Within a connection you can create many working sessions. This is very useful because it allows to do different things at the same time, like reading a set of values while writing computed results. You can also set some safety features on sessions: for example, when you create a session for reading values you can set it to disable all writes, which helps you catch some programming mistakes. You refer to the connection and the sessions using \emph{handles}. A handle is just an integer value that you use when you need to refer to something that is not otherwise representable in any Fortran data type. When you create a connection or a session, \dballe{} will give you the integer handle that you will later use to refer to it. \section {Pseudoana} Values in \dballe{} are associated to informations about their source, such as what kind of station generated the data and some characteristics of the station. These informations are called \emph{pseudoana} informations, to suggest that they are something similar to anagraphical informations about the sources of the values. A pseudoana entry is uniquely identified by: \begin{itemize} \item \emph{latitude}. \item \emph{longitude}. \item \emph{station identifier} (if the station is mobile). \end{itemize} \section {Level or layer} The vertical coordinate of a value in \dballe{} is described using a level description or a layer description. A level is defined univocally by a code table (\texttt{leveltype1}) and a numerical value (\texttt{l1}). A layer is defined univocally by its two bounding levels (\texttt{leveltype1}, \texttt{l1}, \texttt{leveltype2}, \texttt{l2}). See \ref{levels} for a description of the level types and associated level values. \section {Time range} Another characteristic of a value in \dballe{} is the time period to which the datum refers: it can be, for example, a value measured in a specific instant, or a cumulated or averaged value over an interval of time. The time range is defined by a table code (\texttt{pindicator}) and two numerical values (\texttt{p1} and \texttt{p2}, see \ref{tranges}). \section {Values} The main work of \dballe{} is to store and access \emph{measured values}. A measured value is a datum that can be expressed as a floating point (single or double precision), integer, character or byte, depending on what value it measures. Every datum is univocally defined by a system of coordinates with 7 dimensions: \begin{enumerate} \item The variable \emph{type}, which describes the nature of the variable, such as what it measures and the units used for measuring. It is identified by a \emph{local B table descriptor} (see \ref{btable}). \item The \emph{date and time} of validity of the datum, be it observed, forecast or estimated. \item \emph{pseudoana} information about what generated the value (also defining its x and y coordinates). \item The vertical coordinates in space, as a description of the \emph{level layer}. \item The \emph{time range} of the measurement. \item A \emph{network} or \emph{report} type, defining an homogeneous group of stations with the same kind of measures and management (for example: synop, metar, a specific kind of forecast...). \end{enumerate} You can find a list of all current B table descriptors in \ref{btable}. The type of report implicitly defines a priority of the measured value over other equivalent values. This can be used to select a ``best value'' from a specific set of coordinates, where for example, values measured by synoptic stations are preferred over values measured by a satellite, which in turn is preferred over a value computed by a forecast model. Priorities associated to the report type can be customized when creating the database (see \ref{fun-idba_scopa}). Every measured value in \dballe{} can be assigned any number of extra attributes, which can be used, for example, for quality control. \dballe{} also supports storing values \emph{about} a station (such as station height, or station name). These are called \emph{pseudoana values} and are handled just like values, with the exception that vertical coordinates, datetime and time range have no meanings and are forced to default values. Pseudoana values, just like normal values in \dballe{}, can have attributes and any B code. It is possible to have pseudoana values for a station on different networks, although this is rarely needed and the {\tt ana} network is normally used for pseudoana values. See section \ref{sec-querying} for examples on how to work with values. \section {Attributes} Values in \dballe{} are also associated to zero or more \emph{attributes}. An attribute is a value that describes an aspect of a variable, like for example a confidence interval. Attributes in \dballe{} consist on a value and a local B table descriptor, which describes the nature of the variable, such as what it represents and the units in which it is represented. Attributes are uniquely identified by the variable they refer to and the B table descriptor of the attribute. As a consequence, you can only have one attribute per value with a specific B table descriptor. This means that, for example, a variable can have at most one confidence interval attribute. See section \ref{sec-attrs} for examples on how to handle attributes. \dballe{} defines some extra code tables to use as values for attributes: a list is provided in section \ref{extract}. \section {Input, output, actions} \label{basics-inout} Work with \dballe{} happens using \emph{action routines}. An action routine typically reads some input, performs an action and produces some output. Example of action routines are {\tt idba\_voglioquesto} to query data from a database and {\tt idba\_prendilo} to write data into the database. The input and the output of action routines are collections of parameters which have a name and a value. A list of parameters can be found in \ref{parmtable}. You can set the input parameters using the {\tt idba\_set*} functions: \label{fun-idba_set} \begin{description} \item[{\tt idba\_seti(handle, "param", intvalue)}] Set the input parameter to the integer value {\tt intvalue} \item[{\tt idba\_setc(handle, "param", charvalue)}] Set the input parameter to the character value {\tt charvalue} \item[{\tt idba\_setr(handle, "param", realvalue)}] Set the input parameter to the real value {\tt realvalue} \item[{\tt idba\_setd(handle, "param", doublevalue)}] Set the input parameter to the real*8 value {\tt doublevalue} \end{description} You can read the output parameters using the {\tt idba\_enq*} functions: \label{fun-idba_enq} \begin{description} \item[{\tt idba\_enqi(handle, "param", intvalue)}] Read the output parameter into the integer value {\tt intvalue} \item[{\tt idba\_enqc(handle, "param", charvalue)}] Read the output parameter into the character value {\tt charvalue} \item[{\tt idba\_enqr(handle, "param", realvalue)}] Read the output parameter into the real value {\tt realvalue} \item[{\tt idba\_enqd(handle, "param", doublevalue)}] Read the output parameter into the real*8 value {\tt doublevalue} \end{description} Note that all {\tt idba\_set} functions set input parameters, while all {\tt idb\_enq*} functions read output parameters. You cannot read input parameters or set output parameters: that is the job of action routines. In other words, input and output parameters are different things. In this code: \begin{verbatim} c A possible misunderstanding call idba_seti(handle, "height", 1) call idba_enqi(handle, "height", val) \end{verbatim} the value of {\tt val} after the {\tt idba\_enqi} will not probably be 1, and it could be either a value indicating ``missing value'' (in case no {\tt height} parameter is set in the output parameters) or a {\tt height} value previously retrieved by an action routine. To reset one input parameter you can use {\tt idba\_unset}: \label{fun-idba_unset} \begin{verbatim} c ... c We don't want to limit results by latitude this time call idba_unset(handle, "latmin") call idba_unset(handle, "latmax") call idba_voglioquesto(handle, count) \end{verbatim} Alternatively, you can reset an input parameter by setting it to one of the special ``missing value'' values listed below. To reset all input parameters you can use {\tt idba\_unsetall}: \label{fun-idba_unsetall} \begin{verbatim} c Restart the query from scratch call idba_unsetall(handle) call idba_setd(handle, "latmin", 10.D0) c ... \end{verbatim} There is no way to reset output parameters: it is not needed since all action routines will get rid of old output values before producing new ones. In case one of the {\tt idba\_enq*} functions is called on a parameter which does not exist, it will return a special value that indicates ``missing value''. This is a list of such special values: \begin{tabular}{|l|l|} \hline {\em Data type} & {\em Missing value indicator} \\ \hline String & "" \\ Int & 0x7fffffff \\ Real & -1.1754944E-38 \\ Double & -2.22507E-308 \\ \hline \end{tabular} \subsection {Input/output shortcuts} \label{fun-shortcuts} There are a few functions that are shortcuts to other input and output functions: \begin{description} \item[{\tt idba\_enqdate(handle, year, month, day, hour, minute, second)}] is a shortcut to: \begin{verbatim} idba_enqi(handle, "year", year) idba_enqi(handle, "month", month) idba_enqi(handle, "day", day) idba_enqi(handle, "hour", hour) idba_enqi(handle, "min", minute) idba_enqi(handle, "sec", second) \end{verbatim} \item[{\tt idba\_setdate(handle, year, month, day, hour, minute, second)}] is a shortcut to: \begin{verbatim} idba_seti(handle, "year", year) idba_seti(handle, "month", month) idba_seti(handle, "day", day) idba_seti(handle, "hour", hour) idba_seti(handle, "min", minute) idba_seti(handle, "sec", second) \end{verbatim} \item[{\tt idba\_enqlevel(handle, type1, l1, type2, l2)}] is a shortcut to: \begin{verbatim} idba_enqi(handle, "leveltype1", type1) idba_enqi(handle, "l1", l1) idba_enqi(handle, "leveltype2", type2) idba_enqi(handle, "l2", l2) \end{verbatim} \item[{\tt idba\_setlevel(handle, type1, l1, type2, l2)}] is a shortcut to: \begin{verbatim} idba_seti(handle, "leveltype1", type1) idba_seti(handle, "l1", l1) idba_seti(handle, "leveltype2", type2) idba_seti(handle, "l2", l2) \end{verbatim} \item[{\tt idba\_enqtimerange(handle, type, p1, p2)}] is a shortcut to: \begin{verbatim} idba_enqi(handle, "pindicator", type) idba_enqi(handle, "p1", p1) idba_enqi(handle, "p2", p2) \end{verbatim} \item[{\tt idba\_settimerange(handle, type, p1, p2)}] is a shortcut to: \begin{verbatim} idba_seti(handle, "pindicator", type) idba_seti(handle, "p1", p1) idba_seti(handle, "p2", p2) \end{verbatim} \item[{\tt idba\_setcontextana(handle)}] sets the date, time, level and time range in the input record to the fixed values that identify pseudoana values. It is a shortcut to: \begin{verbatim} idba_seti(handle, "year", 1000) idba_seti(handle, "month", 1) idba_seti(handle, "day", 1) idba_seti(handle, "hour", 0) idba_seti(handle, "min", 0) idba_seti(handle, "sec", 0) idba_seti(handle, "leveltype", 257) idba_seti(handle, "l1", 0) idba_seti(handle, "l2", 0) idba_seti(handle, "pindicator", 0) idba_seti(handle, "p1", 0) idba_seti(handle, "p2", 0) \end{verbatim} \end{description} \section {API invariants} \label{fun-error} \begin{itemize} \item All errors are reported as function return values \item All results are reported as output parameters \item All functions {\tt idba\_set*} set the input of action routines \item All functions {\tt idba\_enq*} get the output of action routines \end{itemize} \section {Error management} Errors can be handled by checking the return value of every function: \begin{verbatim} c Example error handling ierr = idba_presentati(dbhandle, "dsn", "user", "password") if (ierr.ne.0) then c handle the error... end if \end{verbatim} Or they can be handled by installing a callback function that is automatically called in case of error: \begin{verbatim} c How to set a callback c * the first parameter is the error code that triggers the callback (0 c means 'trigger on all errors') c * the second parameter is the routine to call when the error happens c (remember to declare the function as 'external' c * the third parameter is a convenience arbitrary integer that will be c passed to the function c * the fourth parameter is used to return a handle that can be used to c remove the callback call idba_error_set_callback(0, error_handler, 42, cb_handle) \end{verbatim} The previous code will setup DB-ALLe to call {\tt error\_handler} after any error, passing it the integer value 42. The callback can be removed at any time by calling {\tt idba\_error\_remove\_callback}: \begin{verbatim} c How to remove a callback call idba_error_remove_callback(cb_handle) \end{verbatim} This is a useful error handling function: \begin{verbatim} c The error handler needs to be declared 'external' external error_handler c Compute the length of a string c (this is an utility function that is used by the error handler c to print nicer error messages) integer function istrlen(string) character string*(*) istrlen = len(string) do while ((string(istrlen:istrlen).eq." " .or. $ string(istrlen:istrlen).eq."").and. $ istrlen.gt.0) istrlen = istrlen - 1 enddo return end c Generic error handler: print all available information c about the error, then exit subroutine error_handler(val) integer val character buf*1000 print *,ier," testcb in ",val call idba_error_message(buf) print *,buf(:istrlen(buf)) call idba_error_context(buf) print *,buf(:istrlen(buf)) call idba_error_details(buf) print *,buf(:istrlen(buf)) call exit (1) return end \end{verbatim} This code introduces three new functions: \begin{description} \item[{\tt idba\_error\_message}] returns a string describing what type of error has happened. \item[{\tt idba\_error\_context}] returns a string describing what \dballe{} was trying to do when the error happened. \item[{\tt idba\_error\_details}] returns a detailed description of the error, when available. If no detailed description is available, it returns an empty string. \end{description} A similar error handling behaviour can be obtained by using the predefined convenience function {\tt idba\_default\_error\_handler}: \label{fun-error-handler} \begin{verbatim} c Declare the external function (not necessary if you include dballef.h) external idba_default_error_handler c Use it as the error handling callback call idba_error_set_callback(0, idba_default_error_handler, 1, cb_handle) \end{verbatim} An alternative error handler called {\tt idba\_error\_handler\_tolerating\_overflows} is available: it exists on all errors instead of value overflows, in what case it prints a warning to standard error and allows the program to continue. The overflow error can then be catched, if needed, by inspecting the error code returned by the \dballe{} function that causes the error. This is how to use it: \begin{verbatim} c Declare the external function (not necessary if you include dballef.h) external idba_error_handler_tolerating_overflows c Use it as the error handling callback call idba_error_set_callback(0, idba_error_handler_tolerating_overflows, 1, cb_handle) \end{verbatim} \chapter {A working session} \label{ch-work} \section{Including the \dballe{} interface file} If you work using Fortran 90, \dballe{} comes with an interface file that you can use to enable type checking on all the \dballe{} API. To make use of the interface file, just include it at the beginning of your program: \begin{verbatim} include "dballe/dballef.h" \end{verbatim} The Fortran 90 interface also allows to replace all the functions {\tt idba\_enqi}, {\tt idba\_enqr}, {\tt idba\_enqd} and {\tt idba\_enqc} with {\tt idba\_enq} and to replace all the functions {\tt idba\_seti}, {\tt idba\_setr}, {\tt idba\_setd} and {\tt idba\_setc} with {\tt idba\_set}. \section{Starting the work} Before any action routine, you need to connect to the database. Connecting to the database will give you a \emph{handle} that you can use to open sessions. This code will open a connection with \dballe{}, then it will start a session: \label{fun-idba_presentati} \label{fun-idba_preparati} \begin{verbatim} c Connect to the database and get a handle to work with it call idba_presentati(dbhandle, "dsn", "username", "password") call idba_preparati(dbhandle, handle, "read", "read", "read") c ...do your work... c End of the work call idba_fatto(handle) call idba_arrivederci(dbhandle) \end{verbatim} You call {\tt idba\_presentati} to connect to the databse. The parameters are the usual ODBC triplet of DSN, username and password. There are alternative ways of invoking {\tt idba\_presentati}: see appendix \ref{dburls} for details. You can call {\tt idba\_preparati} many times and get more handles. This allows to perform many operations on the database at the same time. {\tt idba\_preparati} has three extra parameters that can be used to limit write operations on the database, as a limited protection against programming errors. The first extra parameter controls access to pseudoana records and can have these values: \begin{description} \item[{\tt "read"}] pseudoana records cannot be modified. \item[{\tt "write"}] pseudoana records can be added and removed. \end{description} The second extra parameter control access to observed data and can have these values: \begin{description} \item[{\tt "read"}] data cannot be modified in any way. \item[{\tt "add"}] data can be added to the database, but existing data cannot be modified. Deletions are disabled. This is used to insert new data in the database while preserving the data that was already present in it. \item[{\tt "write"}] data can freely be added, overwritten and deleted. \end{description} The third extra parameter controls access to data attributes and can have these values: \begin{description} \item[{\tt "read"}] attributes cannot be modified in any way. \item[{\tt "add"}] attributes can can be added to the database, but existing attributes cannot be modified. Deletion of attributes is disabled. This is used to insert new attribute in the database while preserving the attributes that were already present in it. \item[{\tt "write"}] attributes can freely be added, overwritten and deleted. \end{description} Note that some combinations are illegal, such as pseudoana=read and data=add (when adding a new data, it's sometimes necessary to insert new pseudoana records), or data=rewrite and attr=read (when deleting data, their attributes are deleted as well). \section{Starting the work on a message} Instead of connecting to a database, you can use the \dballe{} API to read and write message reports in BUFR, CREX format, and read, but not write, messages in AOF format. To do that, use {\tt idba\_messaggi} instead of both {\tt idba\_presentati} and {\tt idba\_preparati}. To write a message, your code will look like: \begin{verbatim} c Connect to the database and get a handle to work with it call idba_messaggi(handle, "file.bufr", "r", "auto") c ...do your work... c End of the work call idba_fatto(handle) \end{verbatim} \label{fun-idba_messaggi} {\tt idba\_messaggi} has three parameters: \begin{enumerate} \item the name of the file to open \item the open mode ("r" for read, "w" for write or create) \item the file format. It can be "BUFR", "CREX", "AOF" or "AUTO". "AUTO" tells \dballe{} to autodetect the file format, but it only works when reading files, not when writing new one. \end{enumerate} You can call {\tt idba\_messaggi} many times and read or write many files. You can even call {\tt idba\_messaggi} many time on the same file as long as you open it read only. Once you open a file, you can use the other \dballe{} functions on it. There are slight differences between working on a database and working on a file, and they are explained later in the section ``Working with files'' (see \ref{db-file-differences}). \section{Setting input and reading output} Input to action routines is done using the functions {\tt idba\_set*}, and output is read with the functions {\tt idba\_enq*} (see \ref{basics-inout}): \begin{verbatim} c Set the extremes of an area and retrieve all the stations in it call idba_setd(handle, "latmin", 30.D0) call idba_setd(handle, "latmax", 50.D0) call idba_setd(handle, "lonmin", 10.D0) call idba_setd(handle, "lonmax", 20.D0) call idba_quantesono(handle, count) c Get the informations about a station do while (count.gt.0) call idba_elencamele(handle) call idba_enqc(handle, "name", cname) call idba_enqi(handle, "ana_id", id) call idba_enqd(handle, "lat", lat) call idba_enqd(handle, "lon", lon) c .... count = count - 1 enddo \end{verbatim} Note that, when one uses {\tt idba\_setc}, {\tt idba\_seti}, {\tt idba\_enqc}, {\tt idba\_enqi} with parameters that have some decimal digits, \dballe{} will work with values as if they did not have a decimal point. That is, if latitude $10.124323$ is read with {\tt idba\_enqi}, then the result will be $10124323$. The following example shows exactly what happens: \begin{verbatim} c Set the latitude to 30.0 degrees call idba_setr(handle, "lat", 30.0) c Set the latitude to 30.0 degrees call idba_setd(handle, "lat", 30.0D0) c Set the latitude to 0.00030 degrees call idba_seti(handle, "lat", 30) c Set the latitude to 30.0 degrees call idba_seti(handle, "lat", 3000000) c Set the latitude to 0.00030 degrees call idba_setc(handle, "lat", "30") c Set the latitude to 30.0 degrees call idba_setc(handle, "lat", "3000000") \end{verbatim} \subsection {Parameter names} There are three different kinds of parameter names one can use: the \dballe{} parameters, the WMO B variables and the variable aliases. The \dballe{} parameters, fully described in \ref{parmtable}, are parameters that have a special meaning to \dballe{}: for example they can be part of the coordinate system, or space/time extremes to use to query the database. They are indicated simply with their name (for example, {\tt "lat"} or {\tt "yearmin"}). The WMO B variables, fully described in the WMO B table, represent all possible sorts of observed data, and are indicated in the form ``B{\itshape xxyyy}'', where {\itshape xxyyy} are the X and Y values from the WMO table B. For more details on working with observed data, see \ref{obsdata}. For a list of all the currently available B table descriptors, see \ref{btable}. The variable aliases are short, easy to remember names which can be used instead of frequently used WMO B variables. For a list of all the currently available aliases, see \ref{aliastable}. \subsection{Queries and observed data} \label{obsdata} The {\tt idba\_set*} and {\tt idba\_enq*} functions can also be used to set and get observation data. To do so, use as parameter the string {\tt "Bxxyyy"}, where {\tt xx} and {\tt yyy} are the X and Y values of the BUFR/CREX table B describing the observed data. For example: \begin{verbatim} c Set the speed of the wind (very useful in summer) call idba_setr(handle, "B11002", 1.8) c Also set the temperature call idba_setr(handle, "B12001", 21.8) call idba_prendilo(handle) \end{verbatim} \subsection{Attributes} \label{sec-attrs} The {\tt idba\_set} and {\tt idba\_enq} groups of functions can also be used to set and get attributes on data. To do so, use as parameter the string {\tt "*Bxxyyy"}, where {\tt xx} and {\tt yyy} are the X and Y values of the BUFR/CREX table B describing the attribute. For example: \begin{verbatim} c Set the confidence of the wind speed value we inserted c in the last 'idba_prendilo' call idba_setr(handle, "*B33007", 75.0) call idba_setc(handle, "*var_related", "B11002") call idba_critica(handle) \end{verbatim} \section {Querying the database} \ref{sec-querying} Queries are made by giving one or more extremes of space, time, level or time range. You can refer to section \ref{parmtable} for a list of all available query parameters (see the column ``On query input''). \subsection {Querying the anagraphical data} Example code to query all the stations in a given area: \label{fun-idba_quantesono} \label{fun-idba_elencamele} \begin{verbatim} call idba_setd(handle, "latmin", 30.D0) call idba_setd(handle, "latmax", 50.D0) call idba_setd(handle, "lonmin", 10.D0) call idba_setd(handle, "lonmax", 20.D0) call idba_quantesono(handle, count) do while (count.gt.0) call idba_elencamele(handle) call idba_enqi(handle, "ana_id", id) c Pseudoana values can be read as well: call idba_enqc(handle, "name", cname) call idba_enqd(handle, "B07001", height) c ...query more data and work with it... count = count - 1 enddo \end{verbatim} This code introduces two new functions: \begin{description} \item[{\tt idba\_quantesono}] performs the query and returns the number of stations it finds. \item[{\tt idba\_elencamele}] gets a station out of the results of {\tt idba\_quantesono}. If there are no more stations, the function fails. \end{description} After {\tt idba\_elencamele}, the output record will also contain all the pseudoana values available for the station. If {\tt rep\_cod} or {\tt rep\_memo} are specified as query parameters, the pseudoana values of that network will be used. Else, {\tt idba\_elencamele} will use all available pseudoana values, choosing the one in the network with the highest priority in case the same pseudoana value is available on more than one network. \subsection {Querying the values} Example code to query all the values in a given area and time: \label{fun-idba_voglioquesto} \label{fun-idba_dammelo} \begin{verbatim} call idba_seti(handle, "latmin", 30) call idba_seti(handle, "latmax", 50) call idba_seti(handle, "lonmin", 10) call idba_seti(handle, "lonmax", 20) call idba_seti(handle, "yearmin", 2004) call idba_seti(handle, "yearmax", 2004) call idba_voglioquesto(handle, count) do while (count.gt.0) call idba_dammelo(handle, param) c get the value of this variable call idba_enqc(handle, param, cvalue) call idba_enqd(handle, "lat", dlat) call idba_enqd(handle, "lon", dlon) c query more data and work with it count = count - 1 enddo \end{verbatim} This code introduces two new functions: \begin{description} \item[{\tt idba\_voglioquesto}] performs the query and returns the number of values it finds. \item[{\tt idba\_dammelo}] gets a value out of the result of {\tt idba\_voglioquesto}. If there are no more stations, the function fails. \end{description} \subsection {Clearing the database} You can initialise or reinitialise the database using {\tt idba\_scopa}: \label{fun-idba_scopa} \begin{verbatim} c Start the work with a clean database call idba_scopa(handle, "repinfo.csv") \end{verbatim} {\tt idba\_scopa} clears the database if it exists, then recreates all the needed tables. Finally, it populates the informations about the reports (such as the available report types, their mnemonics and their priority) using the data in the file given as argument. The file is in CSV format, with 6 columns: \begin{enumerate} \item Report code (corresponding to parameter {\tt rep\_cod}) \item Mnemonic name (corresponding to parameter {\tt rep\_memo}) \item Report description \item Report priority (corresponding to parameter {\tt priority}) \item Ignored \item Ignored \end{enumerate} If {\tt ""} is given instead of the file name, {\tt idba\_scopa} will read the data from {\tt /etc/repinfo.csv}. This is an example of the contents of the file: \begin{verbatim} 01,synop,report synottico,100,oss,0 02,metar,metar,80,oss,0 03,temp,radiosondaggio,100,oss,2 04,ana_lm,valori analizzati LM,-1,ana,255 05,ana,analisi,-10,pre,255 06,pre_cleps_box1.5maxel001,previsti cosmo leps box 1.5 gradi valore max elemento 1,-1,pre,255 07,pre_lmn_box1.5med,previzione Lokal Model nudging box 1.5 gradi valore medio,-1,pre,255 08,pre_lmp_spnp0,previsione Lkal Model prognostica interpolato punto piu' vicino,-1,pre,255 09,boe,dati omdametrici,100,oss,31 \end{verbatim} {\tt idba\_scopa} will not work unless {\tt rewrite} has been enabled for the data when opening the database. \subsection {Inserting data} Data is inserted using {\tt idba\_prendilo}: \label{fun-idba_prendilo} \begin{verbatim} c Insert a new data in the database call idba_setr(handle, "ana_id", 4) call idba_setr(handle, "rep_memo", "synop") call idba_setd(handle, "lat", 44.500D0) call idba_setd(handle, "lon", 11.328D0) call idba_setr(handle, "year", 2005) call idba_setr(handle, "month", 7) call idba_setr(handle, "day", 26) ... call idba_setr(handle, "B11002", 1.8) call idba_prendilo(handle) \end{verbatim} This code introduces a new function: \begin{description} \item[{\tt idba\_prendilo}] inserts a new value in the database. All the information about the parameter to insert is taken from the input previously set by {\tt idba\_set*} functions. When data of the same kind and with the same characteristics already exists, the behaviour of {\tt idba\_prendilo} is defined by the parameter passed to {\tt idba\_preparati} when creating the handle. See `Starting the work`\_ for more informations. \end{description} {\tt idba\_prendilo} will work in different ways according to the data opening mode of the database: \begin{description} \item[{\tt read}] causes an error, because the data cannot be read. \item[{\tt add}] new data can be inserted, but causes an error when trying to insert a value that already exists. \item[{\tt rewrite}] new data can be inserted, and existing data is overwritten. \end{description} Also, behaviour changes according to the pseudoana opening mode: \begin{description} \item[{\tt "reuse"}] when inserting data, if an existing pseudoana record for the data is found, it will be reused. \item[{\tt "rewrite"}] when inserting data, if an existing pseudoana record for the data is found, it will be completely overwritten with the parameters in input. \end{description} Note that the database cannot be opened in pseudoana {\tt read} mode when data is {\tt add} or {\tt rewrite}. \section{Deleting data} Data is deleted using {\tt idba\_dimenticami}: \label{fun-idba_dimenticami} \begin{verbatim} c Delete all data from the station with id 4 in year 2002 call idba_seti(handle, "ana_id", 4) call idba_seti(handle, "year", 2002) call idba_dimenticami(handle) \end{verbatim} This code introduces a new function: \begin{description} \item[{\tt idba\_dimenticami}] deletes all the data found in the extremes specified in input. \end{description} {\tt idba\_dimenticami} will not work unless {\tt rewrite} has been enabled for the data when opening the database. \section {Attributes} \subsection{Reading attributes} Attributes are read using {\tt idba\_ancora}: \label{fun-idba_voglioancora} \label{fun-idba_ancora} \begin{verbatim} c ...setup a query... idba_voglioquesto(handle, count) do while (count.gt.0) call idba_dammelo(handle, param) c Read QC informations about the last value read call idba_voglioancora(handle, qc_count) do while (qc_count.gt.0) call idba_ancora(handle, param) call idba_enqc(handle, param, value) c ...process the value... qc_count = qc_count - 1 enddo count = count - 1 enddo \end{verbatim} This code introduces two new functions: \begin{description} \item[{\tt idba\_voglioancora}] Performs a query to retrieve attributes for the last variable read by {\tt idba\_dammelo}. It returns the number of attributes available. \item[{\tt idba\_ancora}] Retrieves one by one the values queried by {\tt idba\_voglioancora} if there are no more items available, the function will fail. The parameter {\tt param} will be set to the name (in the form {\tt *Bxxyyy}) of the attribute just read. \end{description} It is possible to read attributes at a later time giving a context ID and a B table value: \begin{verbatim} c Read the context ID after a prendilo or a dammelo idba_enqi(handle, "context_id", id) c ...a while later... c Query the attributes of the variable with the given c context ID and B table value idba_seti(handle, "*context_id", id) idba_seti(handle, "*var_related", "B12001") c These are ways one could choose specific attributes: c one attribute: idba_setc(handle, "*var", "B33007") c some attributes: idba_setc(handle, "*varlist", "B33007,B33036") c by default, all attributes are returned c Read QC informations about the last value read call idba_voglioancora(handle, qc_count) do while (qc_count.gt.0) call idba_ancora(handle, param) call idba_enqc(handle, param, value) c ...process the value... qc_count = qc_count - 1 enddo \end{verbatim} \subsection{Writing attributes} \label{fun-idba_critica} Attributes are written using {\tt idba\_critica}, which can be used after an {\tt idba\_dammelo}, after an {\tt idba\_prendilo} or at any time using a stored data id. These three case differ on how to communicate to {\tt idba\_critica} what is the data about which to write attributes. When used after {\tt idba\_dammelo}, {\tt idba\_critica} can refer directly to the last data retrieved: \begin{verbatim} c ...setup a query... call idba_voglioquesto(handle, count) do while (count.gt.0) call idba_dammelo(handle, param) c ...process data... c Set the attributes call idba_seti(handle, "*B33007", 75) call idba_seti(handle, "*B33006", 42) call idba_critica(handle) count = count - 1 enddo \end{verbatim} After an {\tt idba\_prendilo} instead, since {\tt idba\_prendilo} can write more than one data at a time, we need to tell {\tt idba\_critica} which of them we are referring to: \begin{verbatim} c Insert wind speed and temperature call idba_setr(handle, "B11002", 1.8) call idba_setr(handle, "B12001", 22) call idba_prendilo(handle) c Set the attributes call idba_seti(handle, "*B33007", 75) c Use "*var_related" to indicate which of the two variables we are annotating call idba_setc(handle, "*var_related", "B11002") call idba_critica(handle) \end{verbatim} {\tt idba\_critica} can also be called at any time using a previously stored data it: \begin{verbatim} c ...perform a query with idba\_voglioquesto... do while (count.gt.0) call idba_dammelo(handle, param) c ...process data... c This variable is interesting: save the context ID c to refer to it later call idba_enqi(handle, "context_id", saved_id) count = count - 1 enddo c ...some time later... c Insert attributes about that interesting variable call idba_seti(handle, "*B33007", 75) call idba_seti(handle, "*B33006", 42) c Select the variable using its context id c and variable code call idba_seti(handle, "*context_id", saved_id) call idba_seti(handle, "*var_related", "B11001") call idba_critica(handle) \end{verbatim} This code introduces a new function: \begin{description} \item[{\tt idba\_critica}] Set one or more attributes about a variable. The variable can be identified directly by using {\tt idba\_seti(handle, "*context\_id", id)} and {\tt idba\_seti(handle, "*var\_related", name)}. These parameters are automatically set by the {\tt idba\_dammelo} and {\tt idba\_prendilo} action routines. The attributes and values are set as input to {\tt idba\_critica} using the {\tt idba\_set*} functions with an asterisk in front of the variable name. \end{description} {\tt idba\_critica} will work in different ways according to the attributes opening mode of the database: \begin{description} \item[{\tt "read"}] attributes cannot be modified in any way. \item[{\tt "add"}] attributes can can be added to the database, but existing attributes cannot be modified. \item[{\tt "rewrite"}] attributes can be added, and existing attributes can be overwritten. \end{description} \subsection{Deleting attributes} Attributes are deleted using {\tt idba\_scusa}: \label{fun-idba_scusa} \begin{verbatim} c Delete the confidence interval from the wind speed c The referring variable is identified in the same way as with c idba_critica: call idba_seti(handle, "*context_id", saved_id) call idba_seti(handle, "*var_related", "B11002") c The attributes to delete are selected by setting "*varlist": call idba_setc(handle, "*varlist", "*B33007") call idba_scusa(handle) \end{verbatim} This code introduces a new function: \begin{description} \item[{\tt idba\_scusa}] Delete attributes from a variable identified in the same way as with {\tt idba\_critica}. By default it deletes all attributes; specific attributes to delete can be selected by setting their names, separated by commas, in the "*varlist" variable. \end{description} {\tt idba\_scusa} will not work unless the database has been opened in attribute {\tt rewrite} mode. \section{Ending the work} When you are finished working with a handle, you can release it with {\tt idba\_fatto} \label{fun-idba_fatto} \begin{verbatim} c We are finished with this handle call idba_fatto(handle) \end{verbatim} When you are finished working with DB-ALLe, you can ask it to close all connections and release all resources: \label{fun-idba_arrivederci} \begin{verbatim} c We do not need to work with dballe anymore call idba_arrivederci(dbh) \end{verbatim} \chapter{Advanced topics} \section{Shortcuts to stations and data} \dballe{} offers two shortcuts to represent pseudoana entries and data in the database: the {\tt ana\_id} and the {\tt data\_id} keys, that are set in the output of every {\tt idba\_dammelo}. {\tt ana\_id} represents a pseudoana entry. Every time one needs to specify a set of latitude, longitude, fixed/mobile, one could use the corresponding {\tt ana\_id} value, if known, and get a faster search. {\tt data\_id} represents a data entry. Every time one needs to identify some data setting latitude, longitude, level layer, time range and so on, one can just provide the value of {\tt data\_id}, and also get a faster search. \section{Helpers for pretty printing} \label{fun-pprint} There are a number of functions in \dballe{}, the {\tt idba\_spiega\*} group of functions, that are not needed for normal processing but can be useful to improve the presentation of data to users. All these function take a number of parameters and a string, and they store a proper description of the values into the string. The functions are: \begin{description} \item[{\tt idba\_spiegal(handle,ltype1,l1,ltype2,l2,string)}] Describes a level. For example, {\tt idba\_spiegal(handle,106,10,106,20,string)} will store in {\tt string} something like: ``\emph{Layer between 10hm and 20hm above ground}``. \item[{\tt idba\_spiegat(handle,ptype,p1,p2,string)}] Describes a time range. For example, {\tt idba\_spiegat(handle,3,0,600,string)} will store in {\tt string} something like: ``\emph{Average between reference time+0s to reference time+600s}``. \item[{\tt idba\_spiegab(handle,varcode,value,string)}] Describe a value. For example, {\tt idba\_spiegab(handle,"B12001","280",string)} will store in {\tt string} something like: ``\emph{280 (K) TEMPERATURE/DRY-BULB TEMPERATURE}``. \end{description} \section{Query modifiers} \dballe{} allows to set special query behaviours using the {\tt "query"} parameter. The available options are: \begin{description} \item [best] When measures from different kinds of reports exist in the same physical space, do not return them all, but only return the one of the record type with the highest priority. \item [bigana] Use special query optimizations that make things faster when there are a lot of stations in the database, and slower otherwise. If you are having slow queries, try setting this option and see if it helps. \item [nosort] Return the results in a nondefined order. It can make things faster when writing algorithms that do not depend on the ordering of data from \dballe{}. \item [stream] Normally the functions {\tt idba\_quantesono} or {\tt idba\_voglioquesto} will read all the results from the server, count them and save them locally. When using this option, those functions will return right after performing the query, and the results will be read later using {\tt idba\_elencamele} or {\tt idba\_dammelo}. As a side effect, {\tt idba\_quantesono} and {\tt idba\_voglioquesto} cannot know in advance the result count, and will return some undefined value in it. When using this option, the only way to find out when to stop reading is to know that {\tt idba\_elencamele} and {\tt idba\_dammelo} will set all the output parameters to undefined when there is no more data to read. One could thus use a loop like this: \begin{verbatim} call idba_setc (handle, "query", "stream") c Make the query call idba_voglioquesto (handle, N) c Iterate the results. Ignore N because it is c meaningless when using query=stream do call idba_dammelo (handle, varname) c If ana_id is missing value, then we are done idba_enqi(handle, "ana_id", value) if (value .eq. 2147483647) exit c ...process the data... enddo \end{verbatim} This option can be a significant improvement in speed and memory when the result count is not needed in advance. The speed improvement comes because the client can start doing computations on the results while the server is still generating the results, taking advantage of parallelism, especially if the server and the application are on two different computers. Without using this option, the client cannot start to use the results until the server has finished computing and trasmitting them. \end{description} \section{Working with files} \label{db-file-differences} This is a list of the differences between working with files and working with databases: \begin{itemize} \item You do not need to call {\tt idba\_presentati} and {\tt idba\_arrivederci}: the work session starts at {\tt idba\_messaggi} and ends at {\tt idba\_fatto} \item When reading, performing {\tt idba\_quantesono} or {\tt idba\_voglioquesto} a second time advances to the next message in the file. \item Query parameters set before an {\tt idba\_voglioquesto} have no effect: filtering data is not implemented for files. Since it may be implemented in the future, it is suggested to avoid setting query parameters before an {\tt idba\_voglioquesto} to avoid unexpected changes of behaviour with future versions of \dballe{}. \item When reading, you will see that there are no more messages because {\tt idba\_quantesono} or {\tt idba\_voglioquesto} will return 0. \item When writing, you can use the {\tt query} input parameter to {\tt idba\_prendilo} to control when a new message is started. If you set it to {\tt subset}, then the data will be inserted in a new BUFR or CREX subset. If you set it to {\tt message}, you will start a new message. After ``message'' you can specify a template for the message, using one of the names listed by {\tt dbadb export -t list}, for example: ``{\tt message generic}''. If you do not specify a template name, an appropriate template will automatically be chosen for you. \item You cannot use {\tt rep\_memo}: only {\tt rep\_cod} works. Setting {\tt rep\_cod} you can influence the output template of messages: if you set it to a synop report code, you will create a synop message. \end{itemize} \chapter{Code examples} \label{ch-examples} % TODO: put some more example code snippets from real-world \section{Insert station data, then insert data} \begin{verbatim} call idba_preparati(dbhandle, handle, "write", "add", "add") c Insert data about a station call idba_setr (handle, "lat", 11.345) call idba_setr (handle, "lon", 44.678) call idba_setr (handle, "height", 23) call idba_prendilo (handle) c Read the station ID for the station we just inserted call idba_enqi (handle, "ana_id", anaid) c Reset the input data call idba_unsetall (handle) c Add data to the station we just inserted call idba_seti (handle, "ana_id", anaid) call idba_setlevel (handle, 100, 1, 0, 0) call idba_settimerange (handle, 0, 0, 0) call idba_setdate (handle, 2006, 06, 20, 19, 30, 0) call idba_seti (handle, "t", 21) call idba_setc (handle, "B12345", "ciao") call idba_prendilo (handle) \end{verbatim} \section{Query data, then query station data} \begin{verbatim} call idba_preparati(dbhandle, handle, "read", "read", "read") call idba_preparati(dbhandle, handleana, "read", "read", "read") c Prepare a query call idba_setd (handle, "latmin", 10) ... call idba_setd (handle, "lonmax", 60) c Make the query call idba_voglioquesto (handle, N) c Iterate the results do i=1,N call idba_dammelo (handle, varname) c Read data about the variable we just had call idba_enqlevel (handle, ltype, l1, l2) c Read pseudoana data about the variable we just had c Setup a query for the station with 'quantesono' call idba_enqi (handle, "ana_id", anaid) call idba_seti (handleana, "ana_id", anaid) c Query. Nstaz should always be 1 because we query a specific station call idba_quantesono (handleana, Nstaz) c Fetch the data call idba_elencamele (handleana) c Read the data about the station c All the data inserted with setcontextana is available here call idba_enqi (handleana, "height", height) enddo \end{verbatim} \chapter{FAQ and Troubleshooting} \label{ch-trouble} \begin{description} \item [ {\tt call idba\_setc (handle, "query", "stream")} does not make any difference ] Because of a quirk of the MySQL ODBC driver, you may need to add a special configuration option to the MySQL driver. These are the instructions that you, or the person who set up ODBC in your computer, can follow: \begin{quote} You need to add 1048576 to the value of the Options field of the configuration of the ODBC DSN. This can be done by adding the line {\tt Option = 1048576} to the file {\tt odbc.ini}, or editing the Options field using the graphical ODBC configuration tool. \end{quote} \item [ How do I access the extra station data? ] There are two ways: \begin{enumerate} \item If you know in advances what variables you want to read, you can find them among the results of {\tt idba\_elencamele}: \begin{verbatim} c Query station data call idba_quantesono(handle, count) c Get the informations about a station do i=1,count call idba_elencamele(handle) call idba_enqc(handle, "name", cname) call idba_enqi(handle, "B02001", type) c .... enddo \end{verbatim} \item If you want to see all the extra station data available, you can make an explicit query for the extra station data using {\tt idba\_voglioquesto} and {\tt idba\_dammelo} \begin{verbatim} call idba_seti("ana_id", id) call idba_voglioquesto(handle, count) do i=1,count call idba_dammelo(handle, param) c get the value of this variable call idba_enqc(handle, param, cvalue) print*,param,": ",cvalue enddo \end{verbatim} \end{enumerate} \end{description} \appendix \chapter{Input and output parameters} \section{For data-related action routines} \label{parmtable} \input{../dballe/core/record_keyword.tex} \section{For attribute-related action routines} {\begin{scriptsize} \begin{longtable}{|@{\hspace{0.5mm}}l@{\hspace{0.5mm}}|@{\hspace{0.5mm}}l@{\hspace{0.5mm}}|@{\hspace{0.5mm}}l@{\hspace{0.5mm}}|@{\hspace{0.5mm}}p{2.0cm}@{\hspace{0.5mm}}|@{\hspace{0.5mm}}p{1.4cm}@{\hspace{0.5mm}}|@{\hspace{0.5mm}}p{1.4cm}@{\hspace{0.5mm}}|@{\hspace{0.5mm}}p{1.4cm}@{\hspace{0.5mm}}|@{\hspace{0.5mm}}p{3.5cm}@{\hspace{0.5mm}}|} \hline {\em Name} & {\em Unit} & {\em Format} & {\em Description} & {\em On insert input} & {\em On query input} & {\em On output} & {\em Comment} \\ \hline \endhead \hline \endfoot {\tt *Bxxyyy} & depends & depends & Value of the attribute & required & ignored & present & \\ {\tt *var} & Character & 7 chars & Attribute queried & ignored & optional & present, indicates the name of the last attribute returned & \\ {\tt *varlist} & Character & 255 chars & List of attributes to query & ignored & optional & absent & Comma-separated list of attribute B codes wanted on output \\ {\tt *var\_related} & Character & 6 chars & Variable related to the attribute to query & required & required & absent & It is automatically set by {\tt idba\_dammelo} and {\tt idba\_prendilo} (when {\tt idba\_prendilo} inserts a single variable) \\ {\tt *context\_id} & Numeric & 10 digits & Context ID of the variable related to the attribute to query & required & required & absent & It is automatically set by {\tt idba\_dammelo} and {\tt idba\_prendilo} \\ \hline \end{longtable} \end{scriptsize} } \chapter{Values for level layer and time range} \section{Level layer} \label{levels} This table lists all the various value combinations to use as a level layer: \input{../dballe/msg/ltypes.tex} \section{Time range} \label{tranges} This table lists all the various time range interpretation of \emph{P1} and \emph{P2} for every value of \emph{pindicator}: \input{../dballe/msg/tranges.tex} \chapter{Contents of the local B table} \section{B table contents} \label{btable} \input{../tables/dballe.tex} \section{Extra code tables} \label{extract} This section lists extra code tables defined by \dballe{} that define useful values to be used as attributes. \subsection{Code table 33196: \emph{Data has been invalidated}} This attribute is useful to mark when a value has been invalidated as a consequence of quality checks. \begin{tabular}{|l|l|} \hline {\em Value} & {\em Description} \\ \hline 0 & data has been checked and not invalidated \\ 1 & data has been not invalidated \\ missing & data has not beek checked \\ \hline \end{tabular} \subsection{Code table 33197 \emph{Manual replacement in substitution}} This attribute is useful to track when a value has been manually substitute, and it allows to identify both the original value and the new value that substituted it. \begin{tabular}{|l|l|} \hline {\em Value} & {\em Description} \\ \hline 0 & no substitution happened \\ 1 & substitution happened, and this is the original value \\ 2 & substitution happened, and this is the substituted value \\ missing & no substitution information \\ \hline \end{tabular} \chapter{Variable aliases} \label{aliastable} \input{../dballe/core/aliases.tex} \chapter{Database connection methods} \label{dburls} Instead of the usual DSN, user and password triplet it is possible to connect to the database using an URL-like syntax. \section{Connecting via ODBC} Specifying DSN, user and password: \begin{description} \item[in Fortran] {\tt call idba\_presentati(dbhandle, "dsn", "username", "password")} \item[with dbadb] {\tt dbadb \-\-dsn=dsn \-\-user=username \-\-pass=password} \item[with provami] {\tt provami \-\-dsn=dsn \-\-user=username \-\-pass=password} \end{description} Via URL: \begin{description} \item[in Fortran] {\tt call idba\_presentati(dbhandle, "odbc://username:password@dsn", DBA\_MVC, DBA\_MVC)} \item[with dbadb] {\tt dbadb \-\-dsn="odbc://username:password@dsn" \dots} \item[with provami] {\tt provami \-\-dsn="odbc://username:password@dsn"} \end{description} Via an environment variable: \begin{verbatim} # Export the environment variable export DBA_DB="odbc://username:password@dsn" \end{verbatim} \begin{description} \item[in Fortran] {\tt call idba\_presentati(dbhandle, DBA\_MVC, DBA\_MVC, DBA\_MVC)} \item[with dbadb] {\tt dbadb \dots} \item[with provami] {\tt provami} \end{description} \section{Using a SQLite file directly} Using SQLite makes \dballe{} very slow, but it is very useful when working with small datasets since it does not require any ODBC set up. For example, it can be used to run software to process small BUFR files: \begin{verbatim} export DBA_DB="sqlite:temp.sqlite" dbadb wipe dbadb import data.bufr # ...run something here that processes the data... dbadb export > processed-data.bufr rm temp.sqlite \end{verbatim} Via URL: \begin{description} \item[in Fortran] {\tt call idba\_presentati(dbhandle, "sqlite:file.sqlite", DBA\_MVC, DBA\_MVC)} \item[with dbadb] {\tt dbadb \-\-dsn="sqlite:file.sqlite" \dots} \item[with provami] {\tt provami \-\-dsn="sqlite:file.sqlite"} \end{description} Via an environment variable: \begin{verbatim} # Export the environment variable export DBA_DB="sqlite:file.sqlite" \end{verbatim} \begin{description} \item[in Fortran] {\tt call idba\_presentati(dbhandle, DBA\_MVC, DBA\_MVC, DBA\_MVC)} \item[with dbadb] {\tt dbadb \dots} \item[with provami] {\tt provami} \end{description} \chapter{Summary of routines} This appendix contains some reference tables for the functions in the Fortran API. \section{Input/Output routines} These routines are used to set the input and read the output of action routines. \begin{tabular}{|l|l|l|} \hline {\em Name} & {\em Description} & {\em See} \\ \hline {\tt \small idba\_seti(h, param, val)} & Set an integer in input & \ref{fun-idba_set} \\ {\tt \small idba\_setr(h, param, val)} & Set a real in input & \ref{fun-idba_set} \\ {\tt \small idba\_setd(h, param, val)} & Set a double in input & \ref{fun-idba_set} \\ {\tt \small idba\_setc(h, param, val)} & Set a character in input & \ref{fun-idba_set} \\ {\tt \small idba\_unset(h, param)} & Unset a value from the input & \ref{fun-idba_unset} \\ {\tt \small idba\_unsetall(h)} & Unset all values from the input & \ref{fun-idba_unsetall} \\ {\tt \small idba\_enqi(h, param, val)} & Read an integer from the output & \ref{fun-idba_enq} \\ {\tt \small idba\_enqr(h, param, val)} & Read a real from the output & \ref{fun-idba_enq} \\ {\tt \small idba\_enqd(h, param, val)} & Read a double from the output & \ref{fun-idba_enq} \\ {\tt \small idba\_enqc(h, param, val)} & Read a character from the output & \ref{fun-idba_enq} \\ \hline \end{tabular} The following routines are shortcuts for combinations of the above ones. \begin{tabular}{|l|p{6cm}|l|} \hline {\em Name} & {\em Description} & {\em See} \\ \hline {\tt \small idba\_setcontextana(h)} & Set query parameters to the anagraphical context & \ref{fun-shortcuts} \\ {\tt \small idba\_enqlevel(h,type1,l1,type2,l2)} & Read level data & \ref{fun-shortcuts} \\ {\tt \small idba\_setlevel(h,type1,l1,type2,l2)} & Set level data & \ref{fun-shortcuts} \\ {\tt \small idba\_enqtimerange(h,type,p1,p2)} & Read time range data & \ref{fun-shortcuts} \\ {\tt \small idba\_settimerange(h,type,p1,p2)} & Set time range data & \ref{fun-shortcuts} \\ {\tt \small idba\_enqdate(h,y,m,d,h,m,s)} & Read date information & \ref{fun-shortcuts} \\ {\tt \small idba\_setdate(h,y,m,d,h,m,s)} & Set date information & \ref{fun-shortcuts} \\ {\tt \small idba\_setdatemin(h,y,m,d,h,m,s)} & Set minimum date for a query & \ref{fun-shortcuts} \\ {\tt \small idba\_setdatemax(h,y,m,d,h,m,s)} & Set maximum date for a query & \ref{fun-shortcuts} \\ \hline \end{tabular} \section{Session routines} These routines are used to begin and end working sessions with \dballe{}. \begin{tabular}{|l|l|l|} \hline {\em Name} & {\em Description} & {\em See} \\ \hline {\tt \small idba\_presentati(dbh,dsn,user,pwd)} & Connect to the database & \ref{fun-idba_presentati} \\ {\tt \small idba\_preparati(dbh,h,mana,mdata,mattr)} & Open a new session & \ref{fun-idba_preparati} \\ {\tt \small idba\_messaggi(h,filename,mode,type)} & Work with a message file & \ref{fun-idba_messaggi} \\ {\tt \small idba\_fatto(h)} & Close a session & \ref{fun-idba_fatto} \\ {\tt \small idba\_arrivederci(dbh)} & Disconnect from the database & \ref{fun-idba_arrivederci} \\ \hline \end{tabular} \section{Action routines} \begin{tabular}{|l|l|l|} \hline {\em Name} & {\em Description} & {\em See} \\ \hline {\tt \small idba\_scopa(h, filename)} & Reinitialise the database & \ref{fun-idba_scopa} \\ {\tt \small idba\_quantesono(h, count)} & Query the stations archive & \ref{fun-idba_quantesono} \\ {\tt \small idba\_elencamele(h)} & Fetch data about a station & \ref{fun-idba_elencamele} \\ {\tt \small idba\_voglioquesto(h, count)} & Query the data archive & \ref{fun-idba_voglioquesto} \\ {\tt \small idba\_dammelo(h, param)} & Fetch one observed data & \ref{fun-idba_dammelo} \\ {\tt \small idba\_prendilo(h)} & Insert values in the database & \ref{fun-idba_prendilo} \\ {\tt \small idba\_dimenticami(h)} & Remove values from the database & \ref{fun-idba_dimenticami} \\ {\tt \small idba\_voglioancora(h, count)} & Query QC data about a value & \ref{fun-idba_voglioancora} \\ {\tt \small idba\_ancora(h, param)} & Fetch QC data & \ref{fun-idba_ancora} \\ {\tt \small idba\_critica(h)} & Insert QC data about a value & \ref{fun-idba_critica} \\ {\tt \small idba\_scusa(h)} & Remove QC data & \ref{fun-idba_scusa} \\ \hline \end{tabular} \section{Pretty printing routines} \begin{tabular}{|l|l|l|} \hline {\em Name} & {\em Description} & {\em See} \\ \hline {\tt \small idba\_spiegal(handle,ltype1,l1,ltype2,l2,string)} & Describe a level layer & \ref{fun-pprint} \\ {\tt \small idba\_spiegat(handle,ptype,p1,p2,string)} & Describe a time range & \ref{fun-pprint} \\ {\tt \small idba\_spiegab(handle,varcode,value,string)} & Describe a value & \ref{fun-pprint} \\ \hline \end{tabular} \section{Error management routines} \begin{tabular}{|l|p{6cm}|l|} \hline {\em Name} & {\em Description} & {\em See} \\ \hline {\tt \small idba\_error\_code()} & Return the error code of the last function & \ref{fun-error} \\ {\tt \small idba\_error\_message(msg)} & Get the error message of the last function & \ref{fun-error} \\ {\tt \small idba\_error\_context(msg)} & Get the context description for the error of the last function & \ref{fun-error} \\ {\tt \small idba\_error\_details(msg)} & Get details about the error of the last function & \ref{fun-error} \\ {\tt \small idba\_error\_set\_callback(code,fun,data,h)} & Set a callback for handling errors & \ref{fun-error} \\ {\tt \small idba\_error\_remove\_callback(h)} & Remove a previously set callback & \ref{fun-error} \\ {\tt \small idba\_default\_error\_handler} & Predefined convenience error handler & \ref{fun-error-handler} \\ {\tt \small idba\_error\_handler\_tolerating\_overflows} & Predefined convenience error handler that does not exist on overflow errors & \ref{fun-error-handler} \\ \hline \end{tabular} \bibliography{local} \end{document} dballe-5.18/doc/Makefile.am0000644000175000017500000000564711636642373012443 00000000000000## Process this file with automake to produce Makefile.in guidesources = guide.tex intro.tex install.tex maintainance.tex troubleshooting.tex local.bib db.dia db.eps fapisources = fapi.tex ../dballe/core/record_keyword.tex ../dballe/msg/ltypes.tex ../dballe/msg/tranges.tex cdoxdeps = libdballe.dox \ ../dballe/libdballe.la \ ../dballe/msg/ltypes.dox \ ../dballe/msg/tranges.dox fortrandoxdeps = libdballef.dox \ ../fortran/libdballef.la LATEX2HTML = latex2html -local_icons doc_DATA = noinst_DATA = if DO_DOCS doc_DATA += libdballe.doxytags guide.ps noinst_DATA += c_api/index.html if DO_DBALLEF doc_DATA += fapi.ps libdballef.doxytags noinst_DATA += fortran_api/index.html endif if DO_DBALLE_PYTHON noinst_DATA += dballe-doc.i endif if HAVE_LATEX2HTML noinst_DATA += \ fapi_html/index.html \ guide_html/index.html endif endif install-data-local: for pkg in c fortran; do \ test -d $${pkg}_api && \ $(mkinstalldirs) $(DESTDIR)$(docdir)/$${pkg}_api && \ find $${pkg}_api -type f -exec $(INSTALL_DATA) '{}' $(DESTDIR)$(docdir)/$${pkg}_api/ \; ; \ done || true for pkg in fapi_html guide_html; do \ test -d $$pkg && \ $(mkinstalldirs) $(DESTDIR)$(docdir)/$$pkg && \ find $$pkg -type f -exec $(INSTALL_DATA) '{}' $(DESTDIR)$(docdir)/$$pkg/ \; ; \ done || true uninstall-local: for pkg in c fortran; do \ rm -rf $(DESTDIR)$(docdir)/$${pkg}_api; \ done || true mainpages = ../dballe/main-core.dox #mainpages += ../dballe/main-bufrex.dox mainpages += ../dballe/main-msg.dox if DO_DBALLE_DB mainpages += ../dballe/main-db.dox endif TEXINPUTS="$(srcdir)" libwreport.doxytags: /usr/share/doc/libwreport-dev/libwreport.doxytags.gz zcat $< > $@ libdballe.doxytags c_api/index.html xml/index.xml: $(cdoxdeps) $(mainpages) doxygen $< libdballef.doxytags fortran_api/index.html: $(fortrandoxdeps) doxygen $< dballe-doc.i: xml/index.xml doxy2swig.py $(srcdir)/doxy2swig.py $< $@ fapi_html/index.html: $(fapisources) $(LATEX2HTML) -dir fapi_html -mkdir $< guide_html/index.html: $(guidesources) $(LATEX2HTML) -dir guide_html -mkdir $< #fapi-quick.html: fapi-quick.rst ../dballe/core/dba_record_keyword.rst #fapi-quick.html: fapi-quick.rst # rst2html < $< > $@ %.ps: %.dvi TEXINPUTS="$(TEXINPUTS):" dvips $< -o %.pdf: %.ps ps2pdf $< %.aux: %.tex TEXINPUTS="$(TEXINPUTS):" latex $< %.bbl: %.aux BIBINPUTS="$(TEXINPUTS):" bibtex `basename $< .aux` %.dvi: %.tex %.aux %.bbl TEXINPUTS="$(TEXINPUTS):" latex $< BIBINPUTS="$(TEXINPUTS):" bibtex `basename $< .tex` TEXINPUTS="$(TEXINPUTS):" latex $< # Additional dependencies for guide.dvi guide.dvi: $(guidesources) fapi.dvi: $(fapisources) EXTRA_DIST = libdballe.dox $(guidesources) fapi.tex doxy2swig.py add_templates_to_manpage introduzione.odt CLEANFILES = libdballe.doxytags libdballef.doxytags {guide,fapi}.{ps,pdf,dvi,aux,bbl,idx,log,toc,blg} dballe-doc.i clean-local: rm -rf {c,fortran}_api rm -rf xml rm -rf guide_html rm -rf fapi_html rm -f libwreport.doxytags dballe-5.18/doc/doxy2swig.py0000755000175000017500000002727411173330007012703 00000000000000#!/usr/bin/env python """Doxygen XML to SWIG docstring converter. Converts Doxygen generated XML files into a file containing docstrings that can be used by SWIG-1.3.x. Note that you need to get SWIG version > 1.3.23 or use Robin Dunn's docstring patch to be able to use the resulting output. Usage: doxy2swig.py input.xml output.i input.xml is your doxygen generated XML file and output.i is where the output will be written (the file will be clobbered). """ # This code is implemented using Mark Pilgrim's code as a guideline: # http://www.faqs.org/docs/diveintopython/kgp_divein.html # # Author: Prabhu Ramachandran # License: BSD style from xml.dom import minidom import re import textwrap import sys import types import os.path def my_open_read(source): if hasattr(source, "read"): return source else: return open(source) def my_open_write(dest): if hasattr(dest, "write"): return dest else: return open(dest, 'w') class Doxy2SWIG: """Converts Doxygen generated XML files into a file containing docstrings that can be used by SWIG-1.3.x that have support for feature("docstring"). Once the data is parsed it is stored in self.pieces. """ def __init__(self, src): """Initialize the instance given a source object (file or filename). """ f = my_open_read(src) self.my_dir = os.path.dirname(f.name) self.xmldoc = minidom.parse(f).documentElement f.close() self.pieces = [] self.pieces.append('\n// File: %s\n'%\ os.path.basename(f.name)) self.space_re = re.compile(r'\s+') self.lead_spc = re.compile(r'^(%feature\S+\s+\S+\s*?)"\s+(\S)') self.multi = 0 self.ignores = ('inheritancegraph', 'param', 'listofallmembers', 'innerclass', 'name', 'declname', 'incdepgraph', 'invincdepgraph', 'programlisting', 'type', 'references', 'referencedby', 'location', 'collaborationgraph', 'reimplements', 'reimplementedby', 'derivedcompoundref', 'basecompoundref') #self.generics = [] def generate(self): """Parses the file set in the initialization. The resulting data is stored in `self.pieces`. """ self.parse(self.xmldoc) def parse(self, node): """Parse a given node. This function in turn calls the `parse_` functions which handle the respective nodes. """ pm = getattr(self, "parse_%s"%node.__class__.__name__) pm(node) def parse_Document(self, node): self.parse(node.documentElement) def parse_Text(self, node): txt = node.data txt = txt.replace('\\', r'\\\\') txt = txt.replace('"', r'\"') # ignore pure whitespace m = self.space_re.match(txt) if m and len(m.group()) == len(txt): pass else: self.add_text(textwrap.fill(txt)) def parse_Element(self, node): """Parse an `ELEMENT_NODE`. This calls specific `do_` handers for different elements. If no handler is available the `generic_parse` method is called. All tagNames specified in `self.ignores` are simply ignored. """ name = node.tagName ignores = self.ignores if name in ignores: return attr = "do_%s" % name if hasattr(self, attr): handlerMethod = getattr(self, attr) handlerMethod(node) else: self.generic_parse(node) #if name not in self.generics: self.generics.append(name) def add_text(self, value): """Adds text corresponding to `value` into `self.pieces`.""" if type(value) in (types.ListType, types.TupleType): self.pieces.extend(value) else: self.pieces.append(value) def get_specific_nodes(self, node, names): """Given a node and a sequence of strings in `names`, return a dictionary containing the names as keys and child `ELEMENT_NODEs`, that have a `tagName` equal to the name. """ nodes = [(x.tagName, x) for x in node.childNodes \ if x.nodeType == x.ELEMENT_NODE and \ x.tagName in names] return dict(nodes) def generic_parse(self, node, pad=0): """A Generic parser for arbitrary tags in a node. Parameters: - node: A node in the DOM. - pad: `int` (default: 0) If 0 the node data is not padded with newlines. If 1 it appends a newline after parsing the childNodes. If 2 it pads before and after the nodes are processed. Defaults to 0. """ npiece = 0 if pad: npiece = len(self.pieces) if pad == 2: self.add_text('\n') for n in node.childNodes: self.parse(n) if pad: if len(self.pieces) > npiece: self.add_text('\n') def space_parse(self, node): self.add_text(' ') self.generic_parse(node) do_ref = space_parse do_emphasis = space_parse do_bold = space_parse do_computeroutput = space_parse do_formula = space_parse def do_compoundname(self, node): self.add_text('\n\n') data = node.firstChild.data self.add_text('%%feature("docstring") %s "\n'%data) def do_compounddef(self, node): kind = node.attributes['kind'].value if kind in ('class', 'struct'): prot = node.attributes['prot'].value if prot <> 'public': return names = ('compoundname', 'briefdescription', 'detaileddescription', 'includes') first = self.get_specific_nodes(node, names) for n in names: if first.has_key(n): self.parse(first[n]) self.add_text(['";','\n']) for n in node.childNodes: if n not in first.values(): self.parse(n) elif kind in ('file', 'namespace'): nodes = node.getElementsByTagName('sectiondef') for n in nodes: self.parse(n) def do_includes(self, node): self.add_text('C++ includes: ') self.generic_parse(node, pad=1) def do_parameterlist(self, node): self.add_text(['\n', '\n', 'Parameters:', '\n']) self.generic_parse(node, pad=1) def do_para(self, node): self.add_text('\n') self.generic_parse(node, pad=1) def do_parametername(self, node): self.add_text('\n') self.add_text("%s: "%node.firstChild.data) def do_parameterdefinition(self, node): self.generic_parse(node, pad=1) def do_detaileddescription(self, node): self.generic_parse(node, pad=1) def do_briefdescription(self, node): self.generic_parse(node, pad=1) def do_memberdef(self, node): prot = node.attributes['prot'].value id = node.attributes['id'].value kind = node.attributes['kind'].value tmp = node.parentNode.parentNode.parentNode compdef = tmp.getElementsByTagName('compounddef')[0] cdef_kind = compdef.attributes['kind'].value if prot == 'public': first = self.get_specific_nodes(node, ('definition', 'name')) name = first['name'].firstChild.data if name[:8] == 'operator': # Don't handle operators yet. return defn = first['definition'].firstChild.data self.add_text('\n') self.add_text('%feature("docstring") ') anc = node.parentNode.parentNode if cdef_kind in ('file', 'namespace'): ns_node = anc.getElementsByTagName('innernamespace') if not ns_node and cdef_kind == 'namespace': ns_node = anc.getElementsByTagName('compoundname') if ns_node: ns = ns_node[0].firstChild.data self.add_text(' %s::%s "\n%s'%(ns, name, defn)) else: self.add_text(' %s "\n%s'%(name, defn)) elif cdef_kind in ('class', 'struct'): # Get the full function name. anc_node = anc.getElementsByTagName('compoundname') cname = anc_node[0].firstChild.data self.add_text(' %s::%s "\n%s'%(cname, name, defn)) for n in node.childNodes: if n not in first.values(): self.parse(n) self.add_text(['";', '\n']) def do_definition(self, node): data = node.firstChild.data self.add_text('%s "\n%s'%(data, data)) def do_sectiondef(self, node): kind = node.attributes['kind'].value if kind in ('public-func', 'func'): self.generic_parse(node) def do_simplesect(self, node): kind = node.attributes['kind'].value if kind in ('date', 'rcs', 'version'): pass elif kind == 'warning': self.add_text(['\n', 'WARNING: ']) self.generic_parse(node) elif kind == 'see': self.add_text('\n') self.add_text('See: ') self.generic_parse(node) else: self.generic_parse(node) def do_argsstring(self, node): self.generic_parse(node, pad=1) def do_member(self, node): kind = node.attributes['kind'].value refid = node.attributes['refid'].value if kind == 'function' and refid[:9] == 'namespace': self.generic_parse(node) def do_doxygenindex(self, node): self.multi = 1 comps = node.getElementsByTagName('compound') for c in comps: refid = c.attributes['refid'].value fname = refid + '.xml' if not os.path.exists(fname): fname = os.path.join(self.my_dir, fname) print "parsing file: %s"%fname p = Doxy2SWIG(fname) p.generate() self.pieces.extend(self.clean_pieces(p.pieces)) def write(self, fname): o = my_open_write(fname) if self.multi: o.write("".join(self.pieces)) else: o.write("".join(self.clean_pieces(self.pieces))) o.close() def clean_pieces(self, pieces): """Cleans the list of strings given as `pieces`. It replaces multiple newlines by a maximum of 2 and returns a new list. It also wraps the paragraphs nicely. """ ret = [] count = 0 for i in pieces: if i == '\n': count = count + 1 else: if i == '";': if count: ret.append('\n') elif count > 2: ret.append('\n\n') elif count: ret.append('\n'*count) count = 0 ret.append(i) _data = "".join(ret) ret = [] for i in _data.split('\n\n'): if i == 'Parameters:': ret.extend(['Parameters:', '\n\n']) elif i.find('// File:') > -1: # leave comments alone. ret.extend([i, '\n']) else: _tmp = textwrap.fill(i.strip()) _tmp = self.lead_spc.sub(r'\1"\2', _tmp) ret.extend([_tmp, '\n\n']) return ret def main(input, output): p = Doxy2SWIG(input) p.generate() p.write(output) if __name__ == '__main__': if len(sys.argv) != 3: print __doc__ sys.exit(1) main(sys.argv[1], sys.argv[2]) dballe-5.18/doc/introduzione.odt0000644000175000017500000004013711173330007013621 00000000000000PK4^2 ''mimetypeapplication/vnd.oasis.opendocument.textPK4Configurations2/statusbar/PK4'Configurations2/accelerator/current.xmlPKPK4Configurations2/floater/PK4Configurations2/popupmenu/PK4Configurations2/progressbar/PK4Configurations2/menubar/PK4Configurations2/toolbar/PK4Configurations2/images/Bitmaps/PK4 content.xml]KoIrW$hxA.'#+@ZބdUv3RVUSiO/k`>WopDdf=f79b1bW#"2_DfU}OM #&BO2??kã?\7j48ND<&/a|n>?Juxx,OD|x*u^l}Ns+q9ܝ{'SR3-g޾U;c[jHU)j#RD<3T| dMDmSWzh5nFRP+k@dqUo5\ۉHxUm0\ ]Y4u|+^i$ҫ8bK^,|ytn f%}ZYZ=DG ˰Qӛ]$AG.cP@"uh4Ns- T* >`ă؈ V;guw6#DZkH@ `2.7z~r:]0`7vWN:ͤ=(Aʖ&10hS+\WZ+L]qRzmܗ6>t 5g۷B"4 ͭd<\@|ʚ!ǥ$>dU7*yo*+X{v֠#8M"ojEI ofn!W5_ͅp;n.rU"ٮinϬ<(Ò`.|ViJ ϑX*!wsn~ZιjHw,U)D7Xo-Eڻ}7Xb*hM㻹^@G \S Fr~ w|ij::ÖE(X9pN_8}ox8}ya ,ܮsKcu9$^P3Df7.`X͘ן8w1&A CL)gDu+}p״KzKz7:a0p.sO (}qPŞ ic'lkA}7jH73K7fih, OfƓKDͼ^pJ@ыw7"k&\ %1EԈY)8qn*Y{h=Ju ;|.fDù$NvʤQER(-| 1a"?q@Ǥ FKCd bq$-QVۘy¯P\)^7.@ ?: baO`sWM? Pq>c"HҬNʩZs Z0Bi })$:%3D t  cNQSARi h1joMC0qA6 ChH3dbg5DFqUPqpJb ^PQ9TrBT$6w*Du^C$#r6 {P (:QjB$I5  4ϭ)+Kx *N&` Fbf@.*LPa|=aD?S~:@YgE ep$I46Oxb0_*,43!0 w5]q&f k~z"LS4q耲TIJTD][ļk BA97jD@Y|Rh B ޲ASJ҈"@Eh4pVН_X`A@SH4Q/BwQO ʄ((-H< k*fʙ0]S˹L}eqM?Q( BПp%F~qHeL@pX)\e}]B7]E I/$I|1:"Lf}aŠBKն!|)ަ07{A~JRWҸW[ 3 FƱ{ )C#!#&-,Vp$}g0- %RknUm|۲ss2M-)!{B0e* %f!:!GfHY@|V%чcI(ɾ {Ķ ϗg[Q[*YnHmXl-K+@Г68"kK n&)oVyZ?pUiF̕[("$0U"F<#FfPV~9!7.8/o8?X)¥kYMr gŢO*B0PsJI 37&]y*TZOgPada>0i"XzT+ ?[Na=Vض331lX)?ԛ&M&a gp?1QduY pJZ-G(|}N*uߗ#<qF XF*yF? &U#Cf#[E,ZZ4SϩWQm5WE]9{sFfYτIHk>LP<:J O:tʆa÷~N#ȆðvfAnt'jJP+dQXel_O>yG4@k7Z$Ithđ Uf:_>6@{' _y5<70üzd='Hi/ر0v AL&At(0a?Btb%m| Cs aehpPV]ji-Vy9yE`NwWowX̽RpF>aʿlF5||?6#)[LEX_3{LT*sTr-&洱R,Yu +Mg*?HL01BxJPzt OPBp"D~V@ӭIhrZDiX3n:cqDrB#pVO~8E*jcad:N9^o靉(_ U7X `J%SR:o]bi e R5|=y2b .,=z{ ,"X&ב߬XS7manP6bOsZSmf &ޅuݼp$s$ѳR%{qPغg蔲Z61xHNnC,Ը1\g̸LSTsi# Sw=;y/PU!AgޘOd9|@a_éYyݿ6*V^\T L|s=܉y 9raakoӜ-؂^H 8UdTRsE)nq^ӑEvpF^:h^827?R%sXTv>+E)}f&KUy`p130*miBqj,.^U[i H.*]/";ςYb^^?҅xhߜSز5~&̼xϱlIiĥό-K]LJWXp1z隊hҚt7/珴dF;ٱ܇I~\c `y-y&jzNi.~7;ْo_kh2uMrqCJ#qGzD̜6) f\_KEH;)k WPK7D'PK4 styles.xml[[۸~0To%;9YA/9낖h](_R(Yeyb΅o3CR1KgTLg/ތHČbc"*3ʕ_SJbc^)FN2ZlT9VhroTfD+*]iEj0dvٕ̚%9LF^߉"wD:VS~bq8\"\ M j抣M)NV,yUd}lKdh"g^-^#u?M9964s۽x{W+ i_?|ibAfSBTdenW^QfjsAna~;܇QdJ=eHՈ4 W SoVVhsN@~ڑ1[Fȯl+Roqd2:F JA_b|Oُ3I.?;7ᩋ+KS/7%Ӛ)ӪZ͕A{IE~ $జl~GUy}S|( /rAa!/`:Iu4fD笐mj=cY:L%);s"Fǐ'8D0$͓:ε[I BǕ`.Cp={նS,DbFh"/0NͮՔ8z! (JwXT_p+=/n"Qr%!>Vr>­tMXM4YB>)=h:khm k) %9 A$k[=.YcĘK(<Br`c[$|>lvD;,s7Ď㶁$~otZ(=5歃OOWЄonP%iF׍ S^Iׇ7ԍ s aib"%y1zľ0s?SJJ{uc"cop[祤(<f9O[(<%'ᘹ)a>+V]Q@1H&&fl+*gRII${1 }P޼j|uHVVr*.%G'U`'߽kW܄׺Q★-W{ZTmmQ*]S8A !7uCe\ x Z!)Km|0 ]3h[w񜴜wU`PK)I\s;,n ʛ}ۯݩCj&x@} #覨r. e?暫@Y Z\oݮ>u):Po0z[ 6ǿ!&#Ђ7Fec ns rlpC]3mO$ǃosg}` o vWφR5|,)McZ߷AR4VVp9g.?QY&6s`B=  F)GUPܨ&lkN,Xi/W=55.LRn4zV{jШƻ E/iDj~nF36hSNՅ9g}_4lgA'*`{69w[P^OԔa^Y%$U\ϿYb5 |L`)JSbjF3l#r7s&`|Y14 <Ix' fxkombCWyu{]PFX+u5wj!#EDMRrǵ Q';PKݔfB2PK4I0((meta.xml OpenOffice.org/2.0$Linux OpenOffice.org_project/680m1$Build-89902006-06-27T12:48:522006-07-04T19:16:50it-IT18PT11H34M36SPK4Thumbnails/thumbnail.png PNG  IHDRq;Z IDATx]v* mribak`! |~j qoR PJJ7@)(%d|~~z??g_9:^Sh;4 PG}㓒R}Sb!SѶ-UncrJ,,H4h4pi%-q[%TyVp4mAru)ֺ^.NvJy7)Bd/񵎧GZoR PJ'PzAo]Nw&R<9u=u"2S0<Y!ٜfuH{QL4m(p\5Y)zkV#g# ֆwk&JOmikWl;X%0naҨߟhW![&5LD7a?;%Жmx@VMXJds˜n#LfuGJ.@|Ygg߯.ztb Ȑi+DdAFFCg X4LN-O )؈n̎'׫5-M)h>plv)'*ꔠwccxK~`QZp)I6Z~ QIKd O։ UGFfc2Pa*5y8Zرg˓ϕ?rʣD GZXfTЦ86{zFWk;#Dv栙,kwF8S t0k΄RS_Z#@.D{d8PٴК:$Fl5Xͬ4^0= z~p?v#0@}֪J7<}Љ^2>Ios|%̞&8 IK]V˓a<yp<ֹ c.`\K!9_NS4s꩟ebekm1elN9smXe4#oDF.I ؜Of@5O ٰ.7A)4,hy3B^YaLI{queqzPj33H}"E{ {#9A` ^E/lgN-<4[Fb9RuHG^,z;S@c-Fx&ک#ɲ±Ac,G=M?nL?Nff/fG8^Rq=!ŬTǒ6{TVFWFZOHJpA)~fg%[>C𰵮>ND֟Ŗ쟛u-,GvNv5?7b WQQ pZ3f%{lij4# ~`Pʴ)B.RLC967@)(%bщaMӍ&Gmv8'qYq p-p# qא{_N@-xͩt#HPߣf3E? K(e:cVr*ؿJ7@)p+'R+!j}~_h ՗)%.RtRW %Y8fw_&#7{f%kF%\];J7@)(%CmY>8+i$pn}lhIܜf=4?q',aL,đ/w1Zx#)9^1䥵'f)|aKk=U:`[1Gޞa9CW~0ruJ>L~)i 86 e::#|#hYH9fl-ڞBjI4x@c[Y}W=.տj09{?*ΰIENDB`PK< h  PK4 settings.xmlY]SJ}-]ې4$:IL '"r>d&ӧ'?f=y!CJ:q?dӒЯ^X?\$s/S Jy3Y\,D"'2EF"Ey lu[blqeFCRb. YPegp8 c2emsBS^a~r`q*tlNi% U_CHߣfm{@m2Y0Qf$C_D; e@8 6]^.2MA)sN0Dh੄O#̇Ca=b[R U`>Ans_L;{bpLDd v&-E/]Jhl{{<꣤u\`{u).6؆O_xa[*O[ryŏmy7`aٽ-.$(,l&! "Osщ..Dio: DcpmM\bMĿٞH2. P 4L5Io: )Uz[>Zpc@iwJ27:$@%l -M&&k`iWGp u-D·|%dḒ܎&g,e^M_V9VN ؟\Oo͝Gzk??o#.Όͽz۸u-.r zvΪ2'ïc9`|]O~nըkǽdXH:ʫǺѐը]S(#!Җ-C/a|w]٪i99>}yzؤfnz $ʼƎ3=vT:.c\e'79@|4?eٝyU&2 u]0MH71?H5udz#;V\(Z5cBkv( +C: T% p=P!0Z[g' y4ZHP4| l +CD- ߱3FT Zl1D,EBOgz ݥb3>x<ݹvUJHԋSZyTCpc;mJ5+=ERf:p5{8F&hkOm"U8봑P-B+ȋ4E.ç*fz}߻KPK. xPK4^2 ''mimetypePK4MConfigurations2/statusbar/PK4'Configurations2/accelerator/current.xmlPK4Configurations2/floater/PK4Configurations2/popupmenu/PK4JConfigurations2/progressbar/PK4Configurations2/menubar/PK4Configurations2/toolbar/PK4Configurations2/images/Bitmaps/PK47D' -content.xmlPK4ݔfB2 fstyles.xmlPK4I0((p&meta.xmlPK4< h  *Thumbnails/thumbnail.pngPK4ܼF 5settings.xmlPK4. x:META-INF/manifest.xmlPK[<dballe-5.18/doc/db.eps0000644000175000017500000004121311173330007011452 00000000000000%!PS-Adobe-2.0 EPSF-2.0 %%Title: /home/enrico/lavori/arpa/libdballe/doc/db.dia %%Creator: Dia v0.94 %%CreationDate: Mon Feb 6 15:00:18 2006 %%For: enrico %%Orientation: Portrait %%Magnification: 1.0000 %%BoundingBox: 0 0 756 497 %%BeginSetup %%EndSetup %%EndComments %%BeginProlog [ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def /cp {closepath} bind def /c {curveto} bind def /f {fill} bind def /a {arc} bind def /ef {eofill} bind def /ex {exch} bind def /gr {grestore} bind def /gs {gsave} bind def /sa {save} bind def /rs {restore} bind def /l {lineto} bind def /m {moveto} bind def /rm {rmoveto} bind def /n {newpath} bind def /s {stroke} bind def /sh {show} bind def /slc {setlinecap} bind def /slj {setlinejoin} bind def /slw {setlinewidth} bind def /srgb {setrgbcolor} bind def /rot {rotate} bind def /sc {scale} bind def /sd {setdash} bind def /ff {findfont} bind def /sf {setfont} bind def /scf {scalefont} bind def /sw {stringwidth pop} bind def /tr {translate} bind def /ellipsedict 8 dict def ellipsedict /mtrx matrix put /ellipse { ellipsedict begin /endangle exch def /startangle exch def /yrad exch def /xrad exch def /y exch def /x exch def /savematrix mtrx currentmatrix def x y tr xrad yrad sc 0 0 1 startangle endangle arc savematrix setmatrix end } def /mergeprocs { dup length 3 -1 roll dup length dup 5 1 roll 3 -1 roll add array cvx dup 3 -1 roll 0 exch putinterval dup 4 2 roll putinterval } bind def /Times-Roman-latin1 /Times-Roman findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Times-Italic-latin1 /Times-Italic findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Times-Bold-latin1 /Times-Bold findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Times-BoldItalic-latin1 /Times-BoldItalic findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /AvantGarde-Book-latin1 /AvantGarde-Book findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /AvantGarde-BookOblique-latin1 /AvantGarde-BookOblique findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /AvantGarde-Demi-latin1 /AvantGarde-Demi findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /AvantGarde-DemiOblique-latin1 /AvantGarde-DemiOblique findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Bookman-Light-latin1 /Bookman-Light findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Bookman-LightItalic-latin1 /Bookman-LightItalic findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Bookman-Demi-latin1 /Bookman-Demi findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Bookman-DemiItalic-latin1 /Bookman-DemiItalic findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Courier-latin1 /Courier findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Courier-Oblique-latin1 /Courier-Oblique findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Courier-Bold-latin1 /Courier-Bold findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Courier-BoldOblique-latin1 /Courier-BoldOblique findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Helvetica-latin1 /Helvetica findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Helvetica-Oblique-latin1 /Helvetica-Oblique findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Helvetica-Bold-latin1 /Helvetica-Bold findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Helvetica-BoldOblique-latin1 /Helvetica-BoldOblique findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Helvetica-Narrow-latin1 /Helvetica-Narrow findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Helvetica-Narrow-Oblique-latin1 /Helvetica-Narrow-Oblique findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Helvetica-Narrow-Bold-latin1 /Helvetica-Narrow-Bold findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Helvetica-Narrow-BoldOblique-latin1 /Helvetica-Narrow-BoldOblique findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /NewCenturySchoolbook-Roman-latin1 /NewCenturySchoolbook-Roman findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /NewCenturySchoolbook-Italic-latin1 /NewCenturySchoolbook-Italic findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /NewCenturySchoolbook-Bold-latin1 /NewCenturySchoolbook-Bold findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /NewCenturySchoolbook-BoldItalic-latin1 /NewCenturySchoolbook-BoldItalic findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Palatino-Roman-latin1 /Palatino-Roman findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Palatino-Italic-latin1 /Palatino-Italic findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Palatino-Bold-latin1 /Palatino-Bold findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Palatino-BoldItalic-latin1 /Palatino-BoldItalic findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /Symbol-latin1 /Symbol findfont definefont pop /ZapfChancery-MediumItalic-latin1 /ZapfChancery-MediumItalic findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop /ZapfDingbats-latin1 /ZapfDingbats findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding isolatin1encoding def currentdict end definefont pop 28.346000 -28.346000 scale -0.950000 -19.450000 translate %%EndProlog 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 1.000000 2.000000 m 1.000000 3.400000 l 7.850000 3.400000 l 7.850000 2.000000 l f 0.000000 0.000000 0.000000 srgb n 1.000000 2.000000 m 1.000000 3.400000 l 7.850000 3.400000 l 7.850000 2.000000 l cp s /Helvetica-latin1 ff 0.700000 scf sf (pseudoana) dup sw 2 div 4.425000 ex sub 3.000000 m gs 1 -1 sc sh gr 1.000000 1.000000 1.000000 srgb n 1.000000 3.400000 m 1.000000 10.800000 l 7.850000 10.800000 l 7.850000 3.400000 l f 0.000000 0.000000 0.000000 srgb n 1.000000 3.400000 m 1.000000 10.800000 l 7.850000 10.800000 l 7.850000 3.400000 l cp s /Courier-latin1 ff 0.560000 scf sf (+id: int) 1.150000 4.050000 m gs 1 -1 sc sh gr /Courier-latin1 ff 0.560000 scf sf ( lat: int) 1.150000 4.850000 m gs 1 -1 sc sh gr /Courier-latin1 ff 0.560000 scf sf ( lon: int) 1.150000 5.650000 m gs 1 -1 sc sh gr /Courier-latin1 ff 0.560000 scf sf ( ident: character) 1.150000 6.450000 m gs 1 -1 sc sh gr /Courier-latin1 ff 0.560000 scf sf ( height: int) 1.150000 7.250000 m gs 1 -1 sc sh gr /Courier-latin1 ff 0.560000 scf sf ( heightbaro: int) 1.150000 8.050000 m gs 1 -1 sc sh gr /Courier-latin1 ff 0.560000 scf sf ( block: tinyint) 1.150000 8.850000 m gs 1 -1 sc sh gr /Courier-latin1 ff 0.560000 scf sf ( station: smallint) 1.150000 9.650000 m gs 1 -1 sc sh gr /Courier-latin1 ff 0.560000 scf sf ( name: character) 1.150000 10.450000 m gs 1 -1 sc sh gr 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 1.000000 13.000000 m 1.000000 14.400000 l 9.650000 14.400000 l 9.650000 13.000000 l f 0.000000 0.000000 0.000000 srgb n 1.000000 13.000000 m 1.000000 14.400000 l 9.650000 14.400000 l 9.650000 13.000000 l cp s /Helvetica-latin1 ff 0.700000 scf sf (repinfo) dup sw 2 div 5.325000 ex sub 14.000000 m gs 1 -1 sc sh gr 1.000000 1.000000 1.000000 srgb n 1.000000 14.400000 m 1.000000 19.400000 l 9.650000 19.400000 l 9.650000 14.400000 l f 0.000000 0.000000 0.000000 srgb n 1.000000 14.400000 m 1.000000 19.400000 l 9.650000 19.400000 l 9.650000 14.400000 l cp s /Courier-latin1 ff 0.560000 scf sf (+id: smallint) 1.150000 15.050000 m gs 1 -1 sc sh gr /Courier-latin1 ff 0.560000 scf sf ( memo: character) 1.150000 15.850000 m gs 1 -1 sc sh gr /Courier-latin1 ff 0.560000 scf sf ( description: character) 1.150000 16.650000 m gs 1 -1 sc sh gr /Courier-latin1 ff 0.560000 scf sf ( prio: int) 1.150000 17.450000 m gs 1 -1 sc sh gr /Courier-latin1 ff 0.560000 scf sf ( descriptor: character) 1.150000 18.250000 m gs 1 -1 sc sh gr /Courier-latin1 ff 0.560000 scf sf ( tablea: int) 1.150000 19.050000 m gs 1 -1 sc sh gr 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 20.000000 2.000000 m 20.000000 3.400000 l 26.550000 3.400000 l 26.550000 2.000000 l f 0.000000 0.000000 0.000000 srgb n 20.000000 2.000000 m 20.000000 3.400000 l 26.550000 3.400000 l 26.550000 2.000000 l cp s /Helvetica-latin1 ff 0.700000 scf sf (data) dup sw 2 div 23.275000 ex sub 3.000000 m gs 1 -1 sc sh gr 1.000000 1.000000 1.000000 srgb n 20.000000 3.400000 m 20.000000 6.000000 l 26.550000 6.000000 l 26.550000 3.400000 l f 0.000000 0.000000 0.000000 srgb n 20.000000 3.400000 m 20.000000 6.000000 l 26.550000 6.000000 l 26.550000 3.400000 l cp s /Courier-latin1 ff 0.560000 scf sf (+id_context: int) 20.150000 4.050000 m gs 1 -1 sc sh gr /Courier-latin1 ff 0.560000 scf sf (+id_var: smallint) 20.150000 4.850000 m gs 1 -1 sc sh gr /Courier-latin1 ff 0.560000 scf sf (+value: character) 20.150000 5.650000 m gs 1 -1 sc sh gr 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 20.000000 9.000000 m 20.000000 10.400000 l 26.550000 10.400000 l 26.550000 9.000000 l f 0.000000 0.000000 0.000000 srgb n 20.000000 9.000000 m 20.000000 10.400000 l 26.550000 10.400000 l 26.550000 9.000000 l cp s /Helvetica-latin1 ff 0.700000 scf sf (attr) dup sw 2 div 23.275000 ex sub 10.000000 m gs 1 -1 sc sh gr 1.000000 1.000000 1.000000 srgb n 20.000000 10.400000 m 20.000000 13.800000 l 26.550000 13.800000 l 26.550000 10.400000 l f 0.000000 0.000000 0.000000 srgb n 20.000000 10.400000 m 20.000000 13.800000 l 26.550000 13.800000 l 26.550000 10.400000 l cp s /Courier-latin1 ff 0.560000 scf sf (+id_context: int) 20.150000 11.050000 m gs 1 -1 sc sh gr /Courier-latin1 ff 0.560000 scf sf (+id_var: smallint) 20.150000 11.850000 m gs 1 -1 sc sh gr /Courier-latin1 ff 0.560000 scf sf ( type: smallint) 20.150000 12.650000 m gs 1 -1 sc sh gr /Courier-latin1 ff 0.560000 scf sf ( value: character) 20.150000 13.450000 m gs 1 -1 sc sh gr 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 11.000000 2.000000 m 11.000000 3.400000 l 18.550000 3.400000 l 18.550000 2.000000 l f 0.000000 0.000000 0.000000 srgb n 11.000000 2.000000 m 11.000000 3.400000 l 18.550000 3.400000 l 18.550000 2.000000 l cp s /Helvetica-latin1 ff 0.700000 scf sf (context) dup sw 2 div 14.775000 ex sub 3.000000 m gs 1 -1 sc sh gr 1.000000 1.000000 1.000000 srgb n 11.000000 3.400000 m 11.000000 11.600000 l 18.550000 11.600000 l 18.550000 3.400000 l f 0.000000 0.000000 0.000000 srgb n 11.000000 3.400000 m 11.000000 11.600000 l 18.550000 11.600000 l 18.550000 3.400000 l cp s /Courier-latin1 ff 0.560000 scf sf (+id: int) 11.150000 4.050000 m gs 1 -1 sc sh gr /Courier-latin1 ff 0.560000 scf sf ( id_ana: int) 11.150000 4.850000 m gs 1 -1 sc sh gr /Courier-latin1 ff 0.560000 scf sf ( id_report: smallint) 11.150000 5.650000 m gs 1 -1 sc sh gr /Courier-latin1 ff 0.560000 scf sf ( datetime: datetime) 11.150000 6.450000 m gs 1 -1 sc sh gr /Courier-latin1 ff 0.560000 scf sf ( ltype: smallint) 11.150000 7.250000 m gs 1 -1 sc sh gr /Courier-latin1 ff 0.560000 scf sf ( l1: int) 11.150000 8.050000 m gs 1 -1 sc sh gr /Courier-latin1 ff 0.560000 scf sf ( l2: int) 11.150000 8.850000 m gs 1 -1 sc sh gr /Courier-latin1 ff 0.560000 scf sf ( ptype: smallint) 11.150000 9.650000 m gs 1 -1 sc sh gr /Courier-latin1 ff 0.560000 scf sf ( p1: int) 11.150000 10.450000 m gs 1 -1 sc sh gr /Courier-latin1 ff 0.560000 scf sf ( p2: int) 11.150000 11.250000 m gs 1 -1 sc sh gr 0.100000 slw [] 0 sd [] 0 sd 0 slj 0 slc n 26.550000 4.700000 m 27.550000 4.700000 l 27.550000 11.700000 l 26.550000 11.700000 l s 0.100000 slw [] 0 sd [] 0 sd 0 slj 0 slc n 26.550000 3.900000 m 27.550000 3.900000 l 27.550000 10.900000 l 26.550000 10.900000 l s 0.100000 slw [] 0 sd [] 0 sd 0 slj 0 slc n 20.000000 3.900000 m 20.000000 3.900000 l 18.550000 3.900000 l 18.550000 3.900000 l s 0.100000 slw [] 0 sd [] 0 sd 0 slj 0 slc n 9.650000 14.900000 m 10.325000 14.900000 l 10.325000 5.500000 l 11.000000 5.500000 l s 0.100000 slw [] 0 sd [] 0 sd 0 slc n 7.850000 3.900000 m 11.000000 4.700000 l s showpage dballe-5.18/doc/intro.tex0000644000175000017500000000427711173330007012242 00000000000000\section{What is \dballe{} } \dballe{} is a database for punctual meteorological data intended to complement the existing tools to manage grid-based data. These are the main characteristics of \dballe{}: \begin{itemize} \item it is temporary, to be used for a limited time and then be deleted. \item does not need backup, since it only contains replicated or derived data. \item write access is enabled for its users. \item it is fast for both read and for write access. \item it is based on physical principles, that is, the data it contains are defined in terms of omogeneous and consistent physical data. For example, it is impossible for two incompatible values to exist in the same point in space and time. \item it can manage fixed station and moving stations such as airplanes or ships. \item it can manage both observational and forecast data. \item it can manage data along all three dimensions in space, such as data from soundings and airplanes. \item it can work based on physical parameters or on report types. \end{itemize} \section{Intended usage of this guide} This guide is the reference for usage and maintenance of \dballe{}. It provides informations about installing a \dballe{} system and keeping it up to the changing requirements of the users. This guide is intended to be used by advanced users of \dballe{} that want to know more about the system and perform some troubleshooting, and to system administrators who need to install and maintain \dballe{} in their system. \section{What this guide is not} This guide does not intend to be a guide for the Fortran API: for that, the reader is referred to the document ``Quick guide of the Fortran API''\cite{FAPI}. This guide does not intend to be a guide for coding with \dballe{}. For that, the reader is referred to the document ``libdballe Documentation''\cite{LibDoc}. This guide does not intend to be the reference guide for the commandline tools that are part of \dballe{}. For that, the reader is referred to the manpages\cite{DbaTblMan}\cite{DbaMsgMan}\cite{DbaDbMan} of the tools. You can however find (see \ref{ch-tools}) an introduction to the commandline tools in this guide, as well as some usage examples. dballe-5.18/doc/add_templates_to_manpage0000755000175000017500000000151711674670146015326 00000000000000#!/usr/bin/env python import sys, re, subprocess SPLIT=re.compile(r"\s*,\s*") # Read the aliases templates = [] proc = subprocess.Popen(["./run-local", "dbamsg", "convert", "--template=list"], stdout=subprocess.PIPE) out, err = proc.communicate() for line in out.split("\n"): if not line: continue name, desc = line.split(" - ") templates.append(dict(name=name, desc=desc)) templates.sort(key=lambda x: x["name"]) for line in sys.stdin: if line.startswith(".SH AUTHOR"): print r""" .SH TEMPLATE NAMES This is a list of possible template names for the \fB\-\-template\fP switch: .P """ for a in templates: print ".TP" print r"\fB%s\fP" % a["name"] print ".br" print a["desc"] print r""" .P \-\-template=list will also print the list. """ print line, dballe-5.18/doc/install.tex0000644000175000017500000001674711173330007012562 00000000000000\section {Installing \dballe{} } \dballe{} should come prepackaged for your system on a {\tt RPM} or {\tt DEB} package. If that is the case, you can just install \dballe{} like any other software in your system. In case the packages are not good for you, or in case you are the one that needs to create the package, this section will show all the steps required for an installation of \dballe{} from scratch. % see procedure from script on spino Outline of the procedure: \begin{enumerate} \item Install the package dependencies \item Unpack the source \item Configure the source \item Compile the source \item Install the binaries \end{enumerate} Once installed, \dballe{} will provide a low-level C API, a high-level Fortran API and various commandline tools to import, export and manipulate meteorological messages. \subsection{Install the package dependencies} This table lists the dependencies needed to build \dballe{}: \begin{tabular}{|l|l|l|l|} \hline {\em Package} & {\em Type of dependency} & {\em Fedora package} & {\rm Debian package} \\ \hline unixodbc & Required & {\tt unixODBC-devel} & {\tt unixodbc-dev} \\ gperf & Required & {\tt gperf} & {\tt gperf} \\ popt & Required & {\tt } & {\tt libpopt-dev} \\ CNF & Only required for the Fortran API & {\tt starmet} & {\tt starmet} (unofficial, contact \dballe{} team) \\ g77 & Only required for unit tests & {\tt } & {\tt g77} \\ doxygen & Only required for documentation & {\tt doxygen} & {\tt doxygen} \\ tetex & Only required for documentation & {\tt tetex, tetex-latex} & {\tt tetex-bin} \\ latex2html & Only required for documentation & {\tt } & {\tt latex2html} \\ rst2html & Optionally required for pretty-printing of the README file & {\tt } & {\tt python-docutils} \\ \end{tabular} In order to run, \dballe{} requires an Unix GNU operating system with the following packages installed: \begin{tabular}{|l|l|l|l|} \hline {\em Package} & {\em Type of dependency} & {\em Fedora package} & {\rm Debian package} \\ \hline popt & Required & {\tt } & {\tt libpopt0} \\ CNF & Only required for the Fortran API & {\tt starmet} & {\tt starmet} (unofficial, contact \dballe{} team) \\ MyODBC & Required & {\tt MyODBC} & {\tt libmyodbc} \\ MySQL & Required if not accessed remotely & {\tt mysql >= 4.1.1 } & {\tt mysql-server-5.0} \\ \end{tabular} \subsection{Unpack the source} You should have receved the source tarball of \dballe{} in a file with a name like ``\tarball{}''. You can extract it with {\tt tar}: ``{\tt tar xf \tarball{}}'': this will create the directory ``\sourcedir{}'' with the extracted source. Enter the source directory to continue with configuring the source. \subsection{Configure the source} \dballe{} sources need to be configured before building, so that they can adapt to the host architecture and operating system. \dballe{} uses the standard GNU Autotools, which you may already be familiar with. Configuration is done using the {\tt ./configure} script: \begin{verbatim} ./configure \end{verbatim} \dballe{} allows some extra options to be passed to {\tt configure} to control the building process, for example to disable building the documentation or the unit test suite. These are the \dballe{}-specific parameters you can use to turn off compiling specific parts of the library: \begin{description} \item[\tt --disable-fortran] Disable generation of Fortran bindings. This allows the code to be compiled without having CNF installed, but the library will be impossible to use from Fortran. \item[\tt --disable-docs] Disable building of the documentation. This allows the code to be compiled without having {\tt doxygen}, {\tt tetex} and {\tt latex2html} installed, but there will be little or no documentation. \end{description} Other relevant {\tt configure} parameters are: \begin{description} \item[{\tt --prefix=dir}] Set the toplevel directory where \dballe{} will be install. By default this is {\tt /usr/local}. \item[{\tt --localstatedir=dir}] Set the toplevel directory where \dballe{} will store the indexes for fast-access to the table files. By default this is {\tt \$prefix/var}, and the table indexes are stored in {\tt \$localstatedir/cache/dballe}. \item[{\tt --sysconfdir=dir}] Set the toplevel directory where global configuration is kept. By default this is {\tt \$prefix/etc}, and the configuration is stored in {\tt \$sysconfdir/dballe}. \item[{\tt --disable-shared}] Disable building shared libraries. This is a 2x speedup in compilation time, and is very useful when debugging the library. \end{description} \subsection{Compile the source} Compiling the source is as you would expect: you just run ``{\tt make}'' and it does everything for you. You can run ``{\tt make check}'' after ``{\tt make}'' to run the library self-test; some tests may fail if a MySQL database named ``test'' is not accessible. \subsection{Install the binaries} Installing the binaries follows the usual procedure as well: just run ``{\tt make install}''. This will take care of installing all the built files in the right place. The installation of \dballe{} is now completed. Remember that \dballe{} applications need an ODBC DSN to connect to the database. The directory layout of \dballe{} after installation is described in \ref{install-dir-layout}. \subsection{Optional extra goodies} Besides what gets installed by {\tt make install}, there are a couple of extra things left in the source directory after compilation that may be useful: \begin{description} \item[{\tt README}] Contains informations about the current state of the development of \dballe{}. It is in reStructuredText format, and you can convert it into HTML using the tool {\tt rst2html} from {\tt python-docutils}. \item[{\tt doc/}] Contains the documentation built at build time, unless {\tt --disable-docs} was used when configuring the sources. You probably want to copy the relevant parts to a place where users can find it. \item[{\tt doc/fapi\_html}] Quick guide of the Fortran API, in HTML format. \item[{\tt doc/fapi.ps}] Quick guide of the Fortran API, in PostScript format. \item[{\tt doc/dox\_html}] libdballe documentation for the programmer, in HTML format. \item[{\tt doc/guide\_html}] DB-ALLe Manual for Advanced Users and Administrators, in HTML format. \item[{\tt doc/guide.ps}] DB-ALLe Manual for Advanced Users and Administrators, in PostScript format. \end{description} \section {\dballe{} directory layout} \label{install-dir-layout} These are the various files and directories installed by \dballe{} (assuming {\tt ./configure} was invoked with {\tt --prefix=/usr/local}, {\tt --localstatedir=/usr/local/var} and {\tt --sysconfdir=/usr/local/etc}): \begin{description} \item[{\tt /usr/local/bin}] \dballe{} tools: {\tt dbatbl}, {\tt dbamsg} and {\tt dbadb}. \item[{\tt /usr/local/share/man/man1}] Manpages for the \dballe{} tools. \item[{\tt /usr/local/include/dballe}] Include files for building applications that use \dballe{}. \item[{\tt /usr/local/lib}] Compiled libraries. \item[{\tt /usr/local/lib/pkgconfig}] pkg-config metadata about the library. \item[{\tt /usr/local/share/aclocal}] autoconf macro for using the library. \item[{\tt /usr/local/share/doc}] Documentation. \item[{\tt /usr/local/share/dballe}] Tables in text format. \item[{\tt /usr/local/etc/dballe}] Configuration files. \end{description} dballe-5.18/doc/guide.tex0000644000175000017500000000271611173330007012200 00000000000000%\documentclass[draft,a4paper]{book} %\documentclass[final,a4wide]{book} %\documentclass[final,12pt,a4paper,twoside]{book} \documentclass[final,12pt,a4paper,twoside]{book} %\usepackage[italian]{babel} \usepackage[ascii]{inputenc} \usepackage[T1]{fontenc} \usepackage{graphicx} \usepackage{moreverb} \usepackage{ifthen} % Include alcuni simboli non pi standard ma usati da gnuplot \usepackage{subfigure} \usepackage{epsfig} \title{DB-ALLe Manual for Advanced Users and Administrators} \author{Enrico Zini \hfil {\tt enrico@enricozini.com}} \newcommand{\dballe}{{\tt DB-ALLe}} \newcommand{\sourcedir}{{\tt dballe-0.4}} \newcommand{\tarball}{{\tt \sourcedir{}.tar.gz}} \newcommand{\srcinsert}[1]{% {\scriptsize \verbatimtabinput[4]{#1} }} %\newlength{\savedmarginparwidth} \newcommand{\figures}[2][!]{% \smallskip %\setlength{\savedmarginparwidth}{\marginparwidth} %\setlength{\marginparwidth}{0pt} \begin{minipage}[c]{\textwidth} \ifthenelse{\equal{#1}{!}}{}{#1:\\} #2 \end{minipage} \medskip %\setlength{\marginparwidth}{\savedmarginparwidth} } \makeindex \begin{document} \bibliographystyle{plain} \maketitle \tableofcontents %\listoffigures %\listoftables \chapter{Introduction} \label{ch-intro} \input{intro.tex} \chapter{Installation} \label{ch-install} \input{install.tex} \chapter{Maintainance} \label{ch-config} \input{maintainance.tex} \chapter{FAQ and Troubleshooting} \label{ch-trouble} \input{troubleshooting.tex} \appendix \bibliography{local} \end{document} dballe-5.18/doc/libdballe.dox.in0000644000175000017500000013400711465023701013417 00000000000000# Doxyfile 1.3.7 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = libdballe # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = @VERSION@ # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 2 levels of 10 sub-directories under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of source # files, where putting all generated files in the same directory would otherwise # cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, # Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en # (Japanese with English messages), Korean, Korean-en, Norwegian, Polish, Portuguese, # Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # This tag can be used to specify the encoding used in the generated output. # The encoding is not always determined by the language that is chosen, # but also whether or not the output is meant for Windows or non-Windows users. # In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES # forces the Windows encoding (this is the default for the Windows binary), # whereas setting the tag to NO uses a Unix-style encoding (the default for # all platforms other than Windows). USE_WINDOWS_ENCODING = NO # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is used # as the annotated text. Otherwise, the brief description is used as-is. If left # blank, the following values are used ("$name" is automatically replaced with the # name of the entity): "The $name class" "The $name widget" "The $name file" # "is" "provides" "specifies" "contains" "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited # members of a class in the documentation of that class as if those members were # ordinary class members. Constructors, destructors and assignment operators of # the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explicit @brief command for a brief description. JAVADOC_AUTOBRIEF = YES # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = YES # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = YES # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 4 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources # only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = NO # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = YES # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = ../dballe # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp # *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm FILE_PATTERNS = *.h *.c *.dox # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories # that are symbolic links (a Unix filesystem feature) are excluded from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. EXCLUDE_PATTERNS = test-utils-*.h # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. INPUT_FILTER = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = c_api # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = YES # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = YES # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_PREDEFINED tags. EXPAND_ONLY_PREDEF = YES # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. PREDEFINED = \ "F77_INTEGER_FUNCTION(a)=integer a" \ "F77_SUBROUTINE(a)=subroutine a" \ "LOGICAL(a)=logical a" \ "INTEGER(a)=integer a" \ "CHARACTER(a)=character a" \ "REAL(a)=real a" \ "DOUBLE(a)=double a" \ "TRAIL(a)=" # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse the # parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = libwreport.doxytags = /usr/share/doc/libwreport-doc/apidocs/ # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = libdballe.doxytags # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or # super classes. Setting the tag to NO turns the diagrams off. Note that this # option is superseded by the HAVE_DOT option below. This is only a fallback. It is # recommended to install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = YES # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found on the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_WIDTH = 1024 # The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_HEIGHT = 1024 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes that # lay further from the root node will be omitted. Note that setting this option to # 1 or 2 may greatly reduce the computation time needed for large code bases. Also # note that a graph may be further truncated if the graph's image dimensions are # not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). # If 0 is used for the depth value (the default), the graph is not depth-constrained. MAX_DOT_GRAPH_DEPTH = 0 # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO dballe-5.18/doc/local.bib0000644000175000017500000007264411173330007012140 00000000000000%%%==================================================================== %%% BibTeX-file{ %%% filename = "local.bib", %%% version = "2.01", %%% url = "http://localhost", %%% date = "1 Set 2005", %%% time = "11:33:02 CET", %%% author = "Enrico Zini", %%% address = "undisclosed", %%% telephone = "undisclosed", %%% FAX = "undisclosed", %%% checksum = "53966 3591 6748 66918", %%% email = "enrico at enricozini.com", %%% codetable = "ISO/ASCII", %%% keywords = "", %%% supported = "yes", %%% abstract = "", %%% docstring = "The checksum field above contains a CRC-16 %%% checksum as the first value, followed by the %%% equivalent of the standard UNIX wc (word %%% count) utility output of lines, words, and %%% characters. This is produced by Robert %%% Solovay's checksum utility.", %%% } %%% ==================================================================== @misc{FAPI, author={Enrico Zini}, title={Quick guide of the Fortran API} } @misc{LibDoc, author={Enrico Zini}, title={libdballe Documentation} } @misc{UserGuide, author={Enrico Zini}, title={DB-ALLe Manual for Advanced Users and Administrators} } @misc{DbaTblMan, author={Enrico Zini}, title={dbatbl Manpage} } @misc{DbaMsgMan, author={Enrico Zini}, title={dbamsg Manpage} } @misc{DbaDbMan, author={Enrico Zini}, title={dbadb Manpage} } % tse-published.ps % Presentazione di CTTE % Ottimo esempio di come sistemare la struttura dell'articolo @Article{Mori2002, author={Giulio Mori, Fabio Patern{\`o}, Carmen Santoro}, title={CTTE: Support for developing and analizing task models for interactive system design}, journal={IEEE Transactions on Software Engineering}, volume={28}, number={9}, year={2002}, month={September} } % http://giove.cnuce.cnr.it/concurtasktrees.html @misc{IntroCTT, author={Fabio Patern{\`o}}, title={ConcurTaskTrees Home Page}, url={http://giove.cnuce.cnr.it/concurtasktrees.html}, note={Available from http://giove.cnuce.cnr.it/concurtasktrees.html} } % deliverable mefisto @Misc{Mefisto, author={Fabio Patern{\`o} and Carmen Santoro}, title={Application of usability evaluation methods}, year={2000}, note={Project Mefisto, Deliverable 6, Part B: Notations and Related Tools Evaluation}, month={December} } % Observatii evaluare @misc{Observatii, author={Ana Maria Marhan}, title={CTTE 1.5.8b: usability evaluation}, year={2003}, month={Nov}, note={Documento interno al progetto} } % Tesi di Violante sui vari metodi di task analysis % thesis_violante_part1.pdf @PHDThesis{Violante, author={Francesco Fabio Domenico Violante}, title={OPTA: OPen Task Analysis}, school={Politecnico di Milano}, address={Milano, Italy}, } % Libro su CTT % book-task-paterno-1.pdf @Book{Paterno-ctt, author={Fabio Patern{\`o}}, title={ConcurTaskTrees: An Engineered Approach to Model-based Design of Interactive Systems} } % Semantica di CTT % last-del.zip @Misc{Semantica-ctt, author={Fabio Patern{\`o} and Carmen Santoro}, title={The ConcurTaskTrees Notation for Task Modelling}, year={2001}, month={May}, note={Guitare Project Document} } % Un qualche manuale di Gimp (usato per l'indagine cognitiva) @Book{Kylander:1999:GUM, author = "Olof Kylander and Karin Kylander", title = "The {GIMP} user's manual", publisher = "Coriolis Group Books", address = "Scottsdale, AZ, USA", pages = "xxiv + 895", year = "1999", ISBN = "1-57610-520-2", LCCN = "T385 .K866 1999", bibdate = "Mon Dec 06 16:18:41 1999", price = "US\$49.99, CAN\$73.99, UK\pounds 34.99", acknowledgement = ack-nhfb, } @Book{Bunks:2000:GG, author = "Carey Bunks", title = "Grokking the {GIMP}", publisher = "New Riders Publishing", address = "Carmel, IN, USA", pages = "342 (est.)", year = "2000", ISBN = "0-7357-0924-6", LCCN = "????", bibdate = "Fri Dec 15 06:47:10 2000", price = "US\$45.00", acknowledgement = ack-nhfb, } %% I vari task analysis % Introduzione di Patern @Book{LibroPaterno, author={Fabio Patern{\`o}}, title={Model-based Design and Evaluation of Interactive Applications}, publisher={Springer Verlag}, year={1999}, month={Nov}, ISBN={1-85233-155-0} } % GOMS @Book{Card83, author = "Stuart K. Card and Thomas P. Moran and Allen Newell", title = "The Psychology of Human-Computer Interaction", pages = "469", publisher = "Lawrence Erlbaum Associates", address = "Hillsdale, NJ", year = "1983", keywords = "GENERAL DESIGN Psych EVALUATION Model Theory", MRnumber = "B.Card.83", ISBN = "0-89859243-7", URL = "http://www.erlbaum.com/149.htm", note = "(pbk) 0-89859859-1 (hdbk); OCLC 9042220", contents = "(not listed)", } %UAN @Article{Hartson92, author = "H. Rex Hartson and Philip D. Gray", title = "Temporal Aspects of Tasks in the User Action Notation", journal = "Human-Computer Interaction", series = "Articles", volume = "7", number = "1", pages = "1--45", year = "1992", copyright = "(c) Copyright 1992 Lawrence Erlbaum Associates", MRnumber = "J.HCI.7.1.1", abstract = "The need for communication among a multiplicity of cooperating roles in user interface development translates into the need for a common set of interface design representation techniques. The important difference between design of the interaction part of the interface and design of the interface software calls for representation techniques with a behavioral view -- a view that focuses on user interaction rather than on the software. The User Action Notation (UAN) is a user- and task-oriented notation that describes physical (and other) behavior of the user and interface as they perform a task together. The primary abstraction of the UAN is a user task. The work reported here addresses the need to identify temporal relationships within user task descriptions and to express explicitly and precisely how designers view temporal relationships among those tasks. Drawing on simple temporal concepts such as events in time and preceding and overlapping of time intervals, we identify basic temporal relationships among tasks; sequence, waiting, repeated disjunction, order independence, interruptibility, one-way interleavability, mutual interleavability, and concurrency. The UAN temporal relations, through the notion of modal logic, offer an explicit and precise representation of the specific kinds of temporal behavior that can occur in asynchronous user interaction without the need to detail all cases that might result.", contents = "(not listed)", } @Book{Hix93, author = "Deborah Hix and H. Rex Hartson", title = "Developing User Interfaces: Ensuring Usability Through Product and Process", pages = "381", publisher = "John Wiley \& Sons", address = "New York, New York", year = "1993", MRnumber = "B.Hix.93", ISBN = "0-471-57813-4", note = "OCLC QA 76.9 U83 H59", contents = "(not listed)", } % GTA @Article{Veer96, author="G. van der Veer and B. Lenting and B. Bergevoet", title="GTA: Groupware task analysis - modeling complexity", journal="Acta Psychologica", volume="91", pages={297--322}, year="1996", url="citeseer.nj.nec.com/vanderveer96gta.html" } % Intent @InProceedings{1998:icre:leveson, author = "N. G. Leveson", title = "Intent Specifications: An Approach to Building Human-Centered Specifications", booktitle = "Proceedings: 3rd International Conference on Requirements Engineering", publisher = "IEEE Computer Society Press", ISSN = "1097-0592", ISBN = "0-8186-8356-2", year = "1998", pages = "204--213", annote = "incomplete", } % Petshop @Article{Bastide99, author = "R. Bastide and P. Palanque", title = "A visual and formal glue between application and interaction.", journal = "Journal of Visual Languages and Computing", volume = "10", number = "5", pages = "481--507", year = "1999", keywords = "Petri nets, interactive software, software engineering, software interfaces, software specification;", abstract = "The construction of interactive software is known to be a difficult task. As far as the non-interactive part of the application is concerned, designers can find support in the field of software engineering, using object-oriented design methods for example. With regard to the user interface per se, a number of interactive tools (interface builders) are available, that allows creating interactively the look and feel of the interface. However, relating an object-oriented design with a proper user-interface design is still a matter of craft and experience, and few techniques permit the seamless integration of the two. The work presented here aims at bridging this gap. The paper proposes a visual language, based on Petri nets, for the design of the dialogue of interactive systems. This language allows specifying both activation and rendering on the one hand, and provides a seamless integration with an object-oriented design on the other.", } % Teallach @inproceedings{Teallach, author = "P. Barclay and T. Griffiths and J. McKirdy and N. W. Paton and R. Cooper and J. Kennedy", title = "The Teallach Tool: Using Models for Flexible User Interface Design", booktitle = "Computer-Aided Design of User Interfaces II (CADUI)", pages = "139-158", publisher = "Kluwer", month = jan, year = 1999, note = "ISBN 0792360788" } %% Metodi di indagine % Lo Sperandio @Book{Sperandio, author = "Jean-Claude Sperandio", title = "La psicologia in ergonomia", publisher = "Societ{\`a} Editrice Il Mulino", address = "Bologna", pages = "210", year = "1983", ISBN = "88-15-00165-4", } % L'Hackos-Redish @Book{Hackos98, author = "JoAnn T. Hackos and Janice C. Redish", title = "User and Task Analysis for Interface Design", pages = "488", publisher = "John Wiley \& Sons", year = "1998", MRnumber = "B.Hackos.98", ISBN = "0-471-17831-4", contents = "(not listed)", } % Zammuner @Book{Zammuner, author={V.L. Zammuner}, title={Tecniche dell'intervista e del questionario}, publisher="Societ{\`a} Editrice Il Mulino", address="Bologna", year={2000} } % Libro interview di Yuwei @Book{Brenner, author={M. Brenner and J. Brown and D. Canter}, title={The Research Interview: Uses and Approaches}, publisher={Academic Press}, year={1985}, ISBN={0-12-131580-0} } %% Information Visualization @Book{infovis, editor = "Stuart K. Card and Jock D. Mackinlay and Ben Shneiderman", title = "Readings in information visualization: Using vision to think", publisher = "Morgan Kaufmann Publishers", year = "1999", address = "San Francisco", } @TechReport{Furnas, author = "G. W. Furnas", title = "The {FISHEYE} View: {A} New Look at Structured Files", institution = "Bell Laboratories", address = "Murray Hill, New Jersey 07974, U.S.A.", type = "Technical Memorandum", number = "\#81-11221-9", month = "12~" # oct, year = "1981", postscript-url = "http://www.si.umich.edu/~furnas/POSTSCRIPTS/FisheyeOriginalTM.ps", postscript-doc = "00000657.ps", } @Article{Spence82, author = "Robert Spence and Mark Apperley", title = "Data Base Navigation: An Office Environment for the Professional", journal = "Behaviour and Information Technology", volume = "1", number = "1", pages = "43--54", year = "1982", copyright = "(c) Copyright 1982 Taylor \& Francis Ltd.", MRnumber = "J.BIT.1.1.43", abstract = "The potential of the computer to assist in the everyday information handling activities of professional people has received little attention. This paper proposes a number of novel facilities to produce, for his purpose, an office environment in which needed item of information can rapidly be sought and identified. It involves a new display technique which overcomes the classical {"}windowing{"} problem, and the use of natural dialogues utilizing simple actions such as pointing, gesturing, touching and spoken commands. The simple dialogue makes the scheme well suited to the professional person, who is most likely unwilling to learn complex command languages. Little disturbances to the appearance of the office need be involved.", } @InProceedings{Rao94a, author = "Ramana Rao and Stuart K. Card", booktitle = "Proceedings CHI 94", institution = "Xerox Palo Alto Research Center", pages = "318--322", publisher = "ACM", title = "{T}he {T}able {L}ens: {M}erging {G}raphical {R}epresentations in an {I}nteractive {F}ocus+{C}ontext {V}isualization for {T}abular {I}nformation", year = "1994", } @Article{Hyperbolic, author = "John Lamping and Ramana Rao", title = "The Hyperbolic Browser: {A} Focus + Context Technique for Visualizing Large Hierarchies", journal = "Journal of Visual Languages and Computing", year = "1996", volume = "7", number = "1", pages = "33--35", } @TechReport{Lifelines, year = "1995", title = "LifeLines: Visualizing personal histories", URL = "http://visinfo.zib.de/EVlib/Show?EVL-1995-153", author = "Catherine Plaisant and Brett Milash and Anne Rose and Seth Widoff and Ben Shneiderman", abstract = "LifeLines provide a general visualization environment for personal histories that can be applied to medical and court records, professional histories and other types of biographical data. A one screen overview shows multiple facets of the records. Aspects, for example medical conditions or legal cases, are displayed as individual time lines, while icons indicate discrete events, such as physician consultations or legal reviews. Line color and thickness illustrate relationships or significance, scaling tools and filters allow users to focus on part of the information. LifeLines reduce the chances of missing information, facilitate spotting anomalies and trends, streamline access to details, while remaining tailorable and easily sharable between applications. The paper describes the use of LifeLines for youth records of the Maryland Department of Juvenile Justice and also for medical records. User's feedback was collected using a Visual Basic prototype for the youth record. Techniques to deal with complex records are reviewed and issues of a standard personal record format are discussed.", language = "en", month = sep, keywords = "Visualization, history, timeline, personal record, justice, medical record screen design, overview, screen management", number = "CS-TR-3523", institution = "HCIL Dept. of Computer Science, University of Maryland", } @TechReport{EVL-1995-154, year = "1995", title = "Browsing Hierarchical Data with Multi-Level Dynamic Queries and Pruning", URL = "http://visinfo.zib.de/EVlib/Show?EVL-1995-154", author = "Harsha Kumar and Catherine Plaisant and Ben Shneiderman.", language = "en", month = mar, keywords = "Browsing, Hierarchical, Dynamic Queries, Pruning, Tree-browser, visualization tool,filtering", number = "CS-TR-3474", institution = "HCIL Dept. of Computer Science, University of Maryland", } @InProceedings{Bederson94, author = "Benjamin B. Bederson and James D. Hollan", title = "Pad++: {A} Zooming Graphical Interface for Exploring Alternate Interface Physics", booktitle = "Proceedings of the ACM Symposium on User Interface Software and Technology", series = "Visualization I", pages = "17--26", year = "1994", copyright = "(c) Copyright 1994 Association for Computing Machinery", keywords = "Interactive user interfaces, Multiscale interfaces, Zooming interfaces, Authoring, Information navigation, Hypertext, Information visualization, Information physics", MRnumber = "C.UIST.94.17", URL = "http://www.acm.org/pubs/articles/proceedings/uist/192426/p17-bederson/p17-bederson.pdf", abstract = "We describe the current status of Pad++, a zooming graphical interface that we are exploring as an alternative to traditional window and icon-based approaches to interface design. We discuss the motivation for Pad++, describe the implementation, and present prototype applications. In addition, we introduce an informational physics strategy for interface design and briefly compare it with metaphor-based design strategies.", } @Article{JGraph, author = "Jay Bagga and Adrian Heinz", title = "{JGraph} --- {A} {Java} Based System for Drawing Graphs and Running Graph Algorithms", journal = "Lecture Notes in Computer Science", volume = "2265", pages = "459--??", year = "2002", CODEN = "LNCSD9", ISSN = "0302-9743", bibdate = "Tue Sep 10 19:09:04 MDT 2002", URL = "http://link.springer-ny.com/link/service/series/0558/bibs/2265/22650459.htm; http://link.springer-ny.com/link/service/series/0558/papers/2265/22650459.pdf", acknowledgement = ack-nhfb, } @misc{ArgoUML, title={ArgoUML Website}, author={Marko Boger and Jason Robbins and Linus Tolke and Markus Klink}, url={http://argouml.tigris.org/}, note={http://argouml.tigris.org/} } @PhdThesis{ArgoUMLErgonomia, title = "Cognitive support features for software development tools", author = "Jason Elliot Robbins", year = "1999", description = "Thesis (Ph. D., Information and Computer Science)--University of California, Irvine, 1999.; Includes bibliographical references (leaves 222-231).", oai = "oai:xtcat.oclc.org:OCLCNo/ocm43696229", school = "University of California, Irvine", subject = "Computer software--Development--Psychological aspects.; Computer-aided software engineering--Psychological aspects.; Object-oriented methods (Computer science); Problem solving.; Cognition.", } %% Processo @misc{yuwei, author={Yuwei Lin}, title={Culture, Creativity, and Innovation: practices of locally-crafted software}, institution={Science and Technology Studies Unit, Department of Sociology, University of York}, note={This paper is a work-in-progress under development for a presentation at a joint seminar of SATSU (Science and Technology Studies Unit) and HCI group at Computer Science and Psychology Departments at University of York, UK}, year={2003}, month={May} } @Misc{AgileManifesto, key = "AgileManifesto", author ={Kent Beck and Mike Beedle and Arie van Bennekum and Alistair Cockburn and Ward Cunningham and Martin Fowler and James Grenning and Jim Highsmith and Andrew Hunt and Ron Jeffries and Jon Kern and Brian Marick and Robert C. Martin and Steve Mellor and Ken Schwaber and Jeff Sutherland and Dave Thomas}, title = "Manifesto for Agile Software Development", url = "http://agilemanifesto.org", note = "Available from: http://agilemanifesto.org", } @misc{Cockburn1, author={Alistair Cockburn}, title={A methodology per project}, url={http://alistair.cockburn.us/crystal/articles/mpp/methodologyperproject.html}, note={Available from: http://alistair.cockburn.us/crystal/articles/ (cont.) /mpp/methodologyperproject.html} } @misc{Cockburn2, author={Alistair Cockburn}, title={Just-In-Time Methodology Construction}, url={http://alistair.cockburn.us/crystal/articles/jmc/justintimemethodologyconstruction.html}, note={Available from: http://alistair.cockburn.us/crystal/articles/ (cont.) /jmc/justintimemethodologyconstruction.html} } @inproceedings{Wood1, author = {William A. Wood and William L. Kleb}, title = {Extreme Programming in a Research Environment}, booktitle = {Proceedings of the Second XP Universe and First Agile Universe Conference on Extreme Programming and Agile Methods - XP/Agile Universe 2002}, year = {2002}, isbn = {3-540-44024-0}, pages = {89--99}, publisher = {Springer-Verlag}, } @Article{Wood2, author = "William A. Wood and William L. Kleb", title = "Exploring {XP} for Scientific Research", journal = "IEEE Software", volume = "20", number = "3", pages = "30--36", month = may # "\slash " # jun, year = "2003", CODEN = "IESOEG", ISSN = "0740-7459", bibdate = "Fri Oct 24 16:32:01 MDT 2003", URL = "http://www.computer.org/software/so2003/s3030abs.htm; http://dlib.computer.org/so/books/so2003/pdf/s3030.pdf", acknowledgement = ack-nhfb, } @Book{DesignPatterns, author = "Gamma and Helm and Johnson and Vlissides", title = "Design Patterns Elements of Reusable Object-Oriented Software", publisher = "Addison-Wesley", address = "Massachusetts", year = "1995", ISBN = "0-201-63361-2", descriptor = "Design, Objektorientierung", annote = "Objektorientierte Software Loesungen fuer haufig auftretende Design-Probleme werden in katalogisierter Form mit Anwendungsbeispielen und Implementierungsbeispielen in C++ oder Smalltalk dargestellt.", } %% Ergonomia @Book{Norman, author={Donald A. Norman}, title={La caffettiera del masochista - Psicopatologia degli oggetti quotidiani}, publisher={Giunti}, address={Firenze}, year={1997}, ISBN={88-09-21027-1} } @Book{Mantovani, author={Giuseppe Mantovani}, title={Comunicazione e identit{\`a} - Dalle situazioni quotidiane agli ambienti virtuali}, publisher="Societ{\`a} Editrice Il Mulino", address="Bologna", year={1995}, ISBN={88-15-04772-7} } @Book{Cooper99, author = "Alan Cooper", title = "The Inmates Are Running the Asylum: Why High Tech Products Drive Us Crazy and How to Restore the Sanity", pages = "300", publisher = "Sams", year = "1999", MRnumber = "B.Cooper.99", ISBN = "0-67231649-8", contents = "(not listed)", } @misc{Affordance, author={Donald A. Norman}, title={Affordances and Design}, url={http://www.jnd.org/dn.mss/affordances-and-design.html}, note={Available from: http://www.jnd.org/dn.mss/affordances-and-design.html} } @misc{Creativita, author={Maurizio Boscarol}, title={Usabilit{\`a} e creativit{\`a}}, url={http://www.usabile.it/172002.htm}, note={Available from: http://www.usabile.it/172002.htm}, year={2002}, month={Sep} } @misc{Euristiche, author={Jakob Nielsen}, title={Ten Usability Heuristics}, url={http://www.useit.com/papers/heuristic/heuristic_list.html}, note={Available from: http://www.useit.com/papers/heuristic/heuristic{\_}list.html}, } @misc{ValutazioneEuristica, author={Jakob Nielsen}, title={How to Conduct a Heuristic Evaluation}, url={http://www.useit.com/papers/heuristic/heuristic_evaluation.html}, note="Available from: http://www.useit.com/papers/heuristic/heuristic{\_}evaluation.html", } @incollection{Stress, author={Bangara S. and Rizzo A. and Vian M.}, title={Organizzazione del lavoro, decisione, fatica mentale e stress}, pages={21--49}, booktitle={Stress e lavoro - Temi, problemi, il contributo della sociologia ed i rapporti interdisciplinari}, publisher={Franco Angeli}, address={Milano}, year={1991}, note={Raccolta curata da Michele La Rosa} } @incollection{Errori, author={Bagnara S.}, title={Tecnologie dell'informazione e prospettive di ergonomia cognitiva}, booktitle={Interazione col computer e processi formativi: ipotesi di lavoro}, note={A cura di D. Gilli e A. Grimaldi}, publisher={FrancoAngeli}, address={Milano}, year={1990} } @InProceedings{Green89, author = "T. R. G. Green", title = "Cognitive Dimensions of Notations", booktitle = "Proceedings of the HCI'89 Conference on People and Computers V", series = "Cognitive Ergonomics", pages = "443--460", year = "1989", copyright = "(c) Copyright 1989 British Informatics Society Ltd.", keywords = "Computer languages, Opportunistic planning, Cognitive dimensions", MRnumber = "C.BCSHCI.89.443", abstract = "'Cognitive dimensions' are features of computer languages considered purely as information structures or notations. They therefore apply to many types of language -- interactive or programming, high or low level, procedural or declarative, special purpose or general purpose. They are 'cognitive' dimensions because they control how (or whether) the preferred cognitive strategy for design-like tasks can be adopted; it has repeatedly been shown that users prefer opportunistic planning rather than any fixed strategy such as top-down development. The dimension analysis makes it easier to compare dissimilar interfaces or languages, and also helps to identify the relationship between support tools and programming languages: the support tools make it possible to use opportunistic planning with notations that would otherwise inhibit it.", } @Article{Blackwell:2001:CDN, author = "A. F. Blackwell and C. Britton and A. Cox and T. R. G. Green and C. Gurr and G. Kadoda and M. S. Kutar and M. Loomes and C. L. Nehaniv and M. Petre and C. Roast and C. Roe and A. Wong and R. M. Young", title = "Cognitive Dimensions of Notations: Design Tools for Cognitive Technology", journal = "Lecture Notes in Computer Science", volume = "2117", pages = "325--??", year = "2001", CODEN = "LNCSD9", ISSN = "0302-9743", bibdate = "Sat Feb 2 13:05:19 MST 2002", URL = "http://link.springer.de/link/service/series/0558/bibs/2117/21170325.htm; http://link.springer.de/link/service/series/0558/papers/2117/21170325.pdf", acknowledgement = ack-nhfb, } @TechReport{CDtutorial, author = "T. Green and A. Blackwell", title = "Cognitive dimensions of information artefacts: a tutorial", institution = "BCS HCI Conference", version = "1.2", type = "Tutorial", month = "Oct", year = "1998", pdf-url = "http://www.cl.cam.ac.uk/users/afb21/CognitiveDimensions/CDtutorial.pdf", } @misc{blackwell00cognitive, author = "A. Blackwell and T. Green", title = "A Cognitive Dimensions questionnaire optimised for users", text = "Blackwell, A.F. & Green, T.R.G. (2000). A Cognitive Dimensions questionnaire optimised for users. In A.F.", year = "2000", url = "citeseer.nj.nec.com/blackwell00cognitive.html" } @InProceedings{CD-UML, author = "Kutar, M., Britton, C. and Barker, T.", title = "A Comparison of Empirical Study and Cognitive Dimensions Analysis in the Evaluation of UML Diagrams", booktitle = "Proceedings of the Fourteenth Annual Meeting of the Psychology of Programming Interest Group", publisher = "J. Kuljis, L. Baldwin and R. Scoble", year = "2002", pages = "1--14", } @article{Miller, author = {Miller,GA}, year = {1956}, title = {The magical number seven, plus or minus two: Some limtis on our capacity for processing information}, journal = {Psycological Review}, volume = {63}, pages = {81-97} } % - Qualche libro su Java e le librerie usate, comprese le API specification % - Design Patterns % - Qualche libro su LaTeX % - Il libro di task analysis di Patern dballe-5.18/doc/libdballe.dox0000644000175000017500000013400211754255507013021 00000000000000# Doxyfile 1.3.7 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = libdballe # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 5.18 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 2 levels of 10 sub-directories under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of source # files, where putting all generated files in the same directory would otherwise # cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, # Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en # (Japanese with English messages), Korean, Korean-en, Norwegian, Polish, Portuguese, # Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # This tag can be used to specify the encoding used in the generated output. # The encoding is not always determined by the language that is chosen, # but also whether or not the output is meant for Windows or non-Windows users. # In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES # forces the Windows encoding (this is the default for the Windows binary), # whereas setting the tag to NO uses a Unix-style encoding (the default for # all platforms other than Windows). USE_WINDOWS_ENCODING = NO # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is used # as the annotated text. Otherwise, the brief description is used as-is. If left # blank, the following values are used ("$name" is automatically replaced with the # name of the entity): "The $name class" "The $name widget" "The $name file" # "is" "provides" "specifies" "contains" "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited # members of a class in the documentation of that class as if those members were # ordinary class members. Constructors, destructors and assignment operators of # the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explicit @brief command for a brief description. JAVADOC_AUTOBRIEF = YES # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = YES # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = YES # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 4 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources # only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = NO # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = YES # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = ../dballe # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp # *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm FILE_PATTERNS = *.h *.c *.dox # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories # that are symbolic links (a Unix filesystem feature) are excluded from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. EXCLUDE_PATTERNS = test-utils-*.h # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. INPUT_FILTER = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = c_api # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = YES # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = YES # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_PREDEFINED tags. EXPAND_ONLY_PREDEF = YES # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. PREDEFINED = \ "F77_INTEGER_FUNCTION(a)=integer a" \ "F77_SUBROUTINE(a)=subroutine a" \ "LOGICAL(a)=logical a" \ "INTEGER(a)=integer a" \ "CHARACTER(a)=character a" \ "REAL(a)=real a" \ "DOUBLE(a)=double a" \ "TRAIL(a)=" # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse the # parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = libwreport.doxytags = /usr/share/doc/libwreport-doc/apidocs/ # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = libdballe.doxytags # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or # super classes. Setting the tag to NO turns the diagrams off. Note that this # option is superseded by the HAVE_DOT option below. This is only a fallback. It is # recommended to install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = YES # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found on the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_WIDTH = 1024 # The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_HEIGHT = 1024 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes that # lay further from the root node will be omitted. Note that setting this option to # 1 or 2 may greatly reduce the computation time needed for large code bases. Also # note that a graph may be further truncated if the graph's image dimensions are # not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). # If 0 is used for the depth value (the default), the graph is not depth-constrained. MAX_DOT_GRAPH_DEPTH = 0 # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO dballe-5.18/doc/troubleshooting.tex0000644000175000017500000000011211173330007014316 00000000000000\section{General} \section{Installation} \section{Fortran programming} dballe-5.18/doc/libdballef.dox.in0000644000175000017500000013375611340766434013610 00000000000000# Doxyfile 1.3.7 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = libdballe Fortran bindings # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = @VERSION@ # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 2 levels of 10 sub-directories under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of source # files, where putting all generated files in the same directory would otherwise # cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, # Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en # (Japanese with English messages), Korean, Korean-en, Norwegian, Polish, Portuguese, # Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # This tag can be used to specify the encoding used in the generated output. # The encoding is not always determined by the language that is chosen, # but also whether or not the output is meant for Windows or non-Windows users. # In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES # forces the Windows encoding (this is the default for the Windows binary), # whereas setting the tag to NO uses a Unix-style encoding (the default for # all platforms other than Windows). USE_WINDOWS_ENCODING = NO # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is used # as the annotated text. Otherwise, the brief description is used as-is. If left # blank, the following values are used ("$name" is automatically replaced with the # name of the entity): "The $name class" "The $name widget" "The $name file" # "is" "provides" "specifies" "contains" "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited # members of a class in the documentation of that class as if those members were # ordinary class members. Constructors, destructors and assignment operators of # the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explicit @brief command for a brief description. JAVADOC_AUTOBRIEF = YES # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = YES # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = YES # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 4 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources # only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = NO # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = YES # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = ../fortran # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp # *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm FILE_PATTERNS = error.cc binding.cc *.dox # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories # that are symbolic links (a Unix filesystem feature) are excluded from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. EXCLUDE_PATTERNS = test-utils-*.h # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. INPUT_FILTER = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = fortran_api # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = YES # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_PREDEFINED tags. EXPAND_ONLY_PREDEF = YES # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. PREDEFINED = \ "F77_INTEGER_FUNCTION(a)=integer a" \ "F77_SUBROUTINE(a)=subroutine a" \ "LOGICAL(a)=logical a" \ "INTEGER(a)=integer a" \ "CHARACTER(a)=character a" \ "REAL(a)=real a" \ "DOUBLE(a)=double a" \ "TRAIL(a)=" # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse the # parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = libdballef.doxytags # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or # super classes. Setting the tag to NO turns the diagrams off. Note that this # option is superseded by the HAVE_DOT option below. This is only a fallback. It is # recommended to install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = YES # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found on the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_WIDTH = 1024 # The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_HEIGHT = 1024 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes that # lay further from the root node will be omitted. Note that setting this option to # 1 or 2 may greatly reduce the computation time needed for large code bases. Also # note that a graph may be further truncated if the graph's image dimensions are # not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). # If 0 is used for the depth value (the default), the graph is not depth-constrained. MAX_DOT_GRAPH_DEPTH = 0 # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO dballe-5.18/autogen.sh0000755000175000017500000000006511173330007011610 00000000000000#!/bin/sh # Rebuild the build system autoreconf -i dballe-5.18/depcomp0000755000175000017500000004755611730345670011217 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2011-12-04.11; # UTC # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010, # 2011 Free Software Foundation, Inc. # This program is free software; you can redistribute 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, see . # 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. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" # Add `dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test "$stat" = 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/ \1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/ / G p }' >> "$depfile" rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: dballe-5.18/install-sh0000755000175000017500000003325611730345667011644 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-01-19.21; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # 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. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for `test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for `test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for `test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # 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 $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: dballe-5.18/dballe/0000755000175000017500000000000011754670141011124 500000000000000dballe-5.18/dballe/main-msg.dox0000644000175000017500000000251311173330007013256 00000000000000/** @mainpage The DB-All.e msg library \section msg The Db-All.e msg library This library provides and encoding-independent message abstraction (see @ref msg.h and @ref msgs.h), and functions to intepret AOF, BUFR and CREX messages as physical information (see @ref bufrex_codec.h and @ref aof_codec.h). from the DB-All.e bufrex module, one main header file, @ref msg.h, which provides a container for parsed BUFR and CREX data and the BUFR and CREX encoding and decoding functions. The library also provides import/export functions from bufr, crex and aof, and to bufr and crex formats: see @ref bufrex_codec.h and @ref aof_codec.h \section bufrex The DB-All.e BUFR and CREX library This library provides BUFR and CREX encoding and decoding functions. There is only one main header file, @ref bufrex/msg.h, which provides a container for parsed BUFR and CREX data and the BUFR and CREX encoding and decoding functions. \section core The DB-All.e core library This library provides various core functionality for weather applications. You can use it for: \li The infrastructure for error handling (see @ref error.h) \li The infrastructure for working with physical quantities (see @ref var.h, @ref vartable.h, @ref conv.h, @ref record.h) \li The infrastructure for reading and writing meteorological data (see @ref file.h, @ref rawmsg.h) */ dballe-5.18/dballe/main-db.dox0000644000175000017500000000314411173330007013056 00000000000000/** @mainpage The DB-All.e db library \section db The DB-All.e database library This library contains all the functions to work with the main DB-All.e database. It includes both insert and query functions (see @ref db.h) and import/export functions (see @ref import.h and @ref export.h) to and from ::dba_msg structures. \section msg The DB-All.e msg library This library provides and encoding-independent message abstraction (see @ref msg.h and @ref msgs.h), and functions to intepret AOF, BUFR and CREX messages as physical information (see @ref bufrex_codec.h and @ref aof_codec.h). from the DB-All.e bufrex module, one main header file, @ref msg.h, which provides a container for parsed BUFR and CREX data and the BUFR and CREX encoding and decoding functions. The library also provides import/export functions from bufr, crex and aof, and to bufr and crex formats: see @ref bufrex_codec.h and @ref aof_codec.h \section bufrex The DB-All.e BUFR and CREX library This library provides BUFR and CREX encoding and decoding functions. There is only one main header file, @ref msg.h, which provides a container for parsed BUFR and CREX data and the BUFR and CREX encoding and decoding functions. \section core The DB-All.e core library This library provides various core functionality for weather applications. You can use it for: \li The infrastructure for error handling (see @ref error.h) \li The infrastructure for working with physical quantities (see @ref var.h, @ref vartable.h, @ref conv.h, @ref record.h) \li The infrastructure for reading and writing meteorological data (see @ref file.h, @ref rawmsg.h) */ dballe-5.18/dballe/Makefile.in0000644000175000017500000016742511754230756013134 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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@ 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@ @DO_DBALLE_DB_TRUE@am__append_1 = \ @DO_DBALLE_DB_TRUE@ db/odbcworkarounds.h \ @DO_DBALLE_DB_TRUE@ db/querybuf.h \ @DO_DBALLE_DB_TRUE@ db/internals.h \ @DO_DBALLE_DB_TRUE@ db/repinfo.h \ @DO_DBALLE_DB_TRUE@ db/station.h \ @DO_DBALLE_DB_TRUE@ db/context.h \ @DO_DBALLE_DB_TRUE@ db/data.h \ @DO_DBALLE_DB_TRUE@ db/attr.h \ @DO_DBALLE_DB_TRUE@ db/cursor.h \ @DO_DBALLE_DB_TRUE@ db/db.h \ @DO_DBALLE_DB_TRUE@ cmdline/dbadb.h @DO_DBALLE_DB_TRUE@am__append_2 = \ @DO_DBALLE_DB_TRUE@ db/querybuf.cc \ @DO_DBALLE_DB_TRUE@ db/internals.cc \ @DO_DBALLE_DB_TRUE@ db/repinfo.cc \ @DO_DBALLE_DB_TRUE@ db/station.cc \ @DO_DBALLE_DB_TRUE@ db/context.cc \ @DO_DBALLE_DB_TRUE@ db/data.cc \ @DO_DBALLE_DB_TRUE@ db/attr.cc \ @DO_DBALLE_DB_TRUE@ db/cursor.cc \ @DO_DBALLE_DB_TRUE@ db/db.cc \ @DO_DBALLE_DB_TRUE@ db/import.cc \ @DO_DBALLE_DB_TRUE@ db/export.cc \ @DO_DBALLE_DB_TRUE@ cmdline/dbadb.cc check_PROGRAMS = tut_test$(EXEEXT) @LUA_TRUE@am__append_3 = \ @LUA_TRUE@ msg/tests/lua.cc \ @LUA_TRUE@ msg/test-utils-lua.cc @DO_DBALLE_DB_TRUE@am__append_4 = \ @DO_DBALLE_DB_TRUE@ db/test-utils-db.cc \ @DO_DBALLE_DB_TRUE@ db/tests/querybuf.cc \ @DO_DBALLE_DB_TRUE@ db/tests/repinfo.cc \ @DO_DBALLE_DB_TRUE@ db/tests/station.cc \ @DO_DBALLE_DB_TRUE@ db/tests/context.cc \ @DO_DBALLE_DB_TRUE@ db/tests/data.cc \ @DO_DBALLE_DB_TRUE@ db/tests/attr.cc \ @DO_DBALLE_DB_TRUE@ db/tests/db.cc \ @DO_DBALLE_DB_TRUE@ db/tests/db_import.cc \ @DO_DBALLE_DB_TRUE@ db/tests/db_export.cc \ @DO_DBALLE_DB_TRUE@ cmdline/dbadb-tut.cc noinst_PROGRAMS = dump-core-info$(EXEEXT) subdir = dballe DIST_COMMON = $(am__nobase_dist_dballeinclude_HEADERS_DIST) \ $(dist_noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_flag.m4 \ $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/python.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h 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)$(libdir)" \ "$(DESTDIR)$(dballeincludedir)" LTLIBRARIES = $(lib_LTLIBRARIES) libdballe_la_LIBADD = am__libdballe_la_SOURCES_DIST = core/verbose.cc core/aliases.cc \ core/aliases-reverse.cc core/defs.cc core/var.cc core/file.cc \ core/arrayfile.cc core/aoffile.cc core/csv.cc \ core/record_keyword.cc core/record.cc core/matcher.cc \ core/match-wreport.cc msg/repinfo.cc msg/vars.cc \ msg/context.cc msg/msg.cc msg/msgs.cc msg/msg-lua.cc \ msg/codec.cc msg/aof_codec.cc msg/aof_importers/common.cc \ msg/aof_importers/synop.cc msg/aof_importers/dribu.cc \ msg/aof_importers/flight.cc msg/aof_importers/temp.cc \ msg/aof_importers/pilot.cc msg/wr_codec.cc \ msg/wr_importers/base.cc msg/wr_importers/synop.cc \ msg/wr_importers/temp.cc msg/wr_importers/metar.cc \ msg/wr_importers/flight.cc msg/wr_importers/generic.cc \ msg/wr_importers/pollution.cc msg/wr_exporters/synop.cc \ msg/wr_exporters/ship.cc msg/wr_exporters/buoy.cc \ msg/wr_exporters/metar.cc msg/wr_exporters/temp.cc \ msg/wr_exporters/flight.cc msg/wr_exporters/generic.cc \ msg/wr_exporters/pollution.cc cmdline/cmdline.cc \ cmdline/processor.cc cmdline/conversion.cc db/querybuf.cc \ db/internals.cc db/repinfo.cc db/station.cc db/context.cc \ db/data.cc db/attr.cc db/cursor.cc db/db.cc db/import.cc \ db/export.cc cmdline/dbadb.cc am__dirstamp = $(am__leading_dot)dirstamp @DO_DBALLE_DB_TRUE@am__objects_1 = db/querybuf.lo db/internals.lo \ @DO_DBALLE_DB_TRUE@ db/repinfo.lo db/station.lo db/context.lo \ @DO_DBALLE_DB_TRUE@ db/data.lo db/attr.lo db/cursor.lo db/db.lo \ @DO_DBALLE_DB_TRUE@ db/import.lo db/export.lo cmdline/dbadb.lo am_libdballe_la_OBJECTS = core/verbose.lo core/aliases.lo \ core/aliases-reverse.lo core/defs.lo core/var.lo core/file.lo \ core/arrayfile.lo core/aoffile.lo core/csv.lo \ core/record_keyword.lo core/record.lo core/matcher.lo \ core/match-wreport.lo msg/repinfo.lo msg/vars.lo \ msg/context.lo msg/msg.lo msg/msgs.lo msg/msg-lua.lo \ msg/codec.lo msg/aof_codec.lo msg/aof_importers/common.lo \ msg/aof_importers/synop.lo msg/aof_importers/dribu.lo \ msg/aof_importers/flight.lo msg/aof_importers/temp.lo \ msg/aof_importers/pilot.lo msg/wr_codec.lo \ msg/wr_importers/base.lo msg/wr_importers/synop.lo \ msg/wr_importers/temp.lo msg/wr_importers/metar.lo \ msg/wr_importers/flight.lo msg/wr_importers/generic.lo \ msg/wr_importers/pollution.lo msg/wr_exporters/synop.lo \ msg/wr_exporters/ship.lo msg/wr_exporters/buoy.lo \ msg/wr_exporters/metar.lo msg/wr_exporters/temp.lo \ msg/wr_exporters/flight.lo msg/wr_exporters/generic.lo \ msg/wr_exporters/pollution.lo cmdline/cmdline.lo \ cmdline/processor.lo cmdline/conversion.lo $(am__objects_1) libdballe_la_OBJECTS = $(am_libdballe_la_OBJECTS) libdballe_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(libdballe_la_LDFLAGS) $(LDFLAGS) -o $@ PROGRAMS = $(noinst_PROGRAMS) am_dump_core_info_OBJECTS = core/dump-core-info.$(OBJEXT) dump_core_info_OBJECTS = $(am_dump_core_info_OBJECTS) am__DEPENDENCIES_1 = dump_core_info_DEPENDENCIES = libdballe.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__tut_test_SOURCES_DIST = core/tests/tut-main.cpp \ core/tests/aliases.cc core/tests/defs.cc core/tests/rawmsg.cc \ core/tests/file.cc core/tests/record.cc core/csv-tut.cc \ core/matcher-tut.cc core/match-wreport-tut.cc \ core/test-utils-core.cc msg/test-utils-msg.cc \ msg/tests/vars.cc msg/tests/context.cc msg/msg-tut.cc \ msg/msgs-tut.cc msg/tests/aof_codec.cc msg/tests/wr_import.cc \ msg/tests/wr_export.cc msg/tests/wr_codec.cc \ msg/tests/wr_codec_generic.cc msg/tests/lua.cc \ msg/test-utils-lua.cc db/test-utils-db.cc db/tests/querybuf.cc \ db/tests/repinfo.cc db/tests/station.cc db/tests/context.cc \ db/tests/data.cc db/tests/attr.cc db/tests/db.cc \ db/tests/db_import.cc db/tests/db_export.cc \ cmdline/dbadb-tut.cc @LUA_TRUE@am__objects_2 = msg/tests/lua.$(OBJEXT) \ @LUA_TRUE@ msg/test-utils-lua.$(OBJEXT) @DO_DBALLE_DB_TRUE@am__objects_3 = db/test-utils-db.$(OBJEXT) \ @DO_DBALLE_DB_TRUE@ db/tests/querybuf.$(OBJEXT) \ @DO_DBALLE_DB_TRUE@ db/tests/repinfo.$(OBJEXT) \ @DO_DBALLE_DB_TRUE@ db/tests/station.$(OBJEXT) \ @DO_DBALLE_DB_TRUE@ db/tests/context.$(OBJEXT) \ @DO_DBALLE_DB_TRUE@ db/tests/data.$(OBJEXT) \ @DO_DBALLE_DB_TRUE@ db/tests/attr.$(OBJEXT) \ @DO_DBALLE_DB_TRUE@ db/tests/db.$(OBJEXT) \ @DO_DBALLE_DB_TRUE@ db/tests/db_import.$(OBJEXT) \ @DO_DBALLE_DB_TRUE@ db/tests/db_export.$(OBJEXT) \ @DO_DBALLE_DB_TRUE@ cmdline/dbadb-tut.$(OBJEXT) am_tut_test_OBJECTS = core/tests/tut-main.$(OBJEXT) \ core/tests/aliases.$(OBJEXT) core/tests/defs.$(OBJEXT) \ core/tests/rawmsg.$(OBJEXT) core/tests/file.$(OBJEXT) \ core/tests/record.$(OBJEXT) core/csv-tut.$(OBJEXT) \ core/matcher-tut.$(OBJEXT) core/match-wreport-tut.$(OBJEXT) \ core/test-utils-core.$(OBJEXT) msg/test-utils-msg.$(OBJEXT) \ msg/tests/vars.$(OBJEXT) msg/tests/context.$(OBJEXT) \ msg/msg-tut.$(OBJEXT) msg/msgs-tut.$(OBJEXT) \ msg/tests/aof_codec.$(OBJEXT) msg/tests/wr_import.$(OBJEXT) \ msg/tests/wr_export.$(OBJEXT) msg/tests/wr_codec.$(OBJEXT) \ msg/tests/wr_codec_generic.$(OBJEXT) $(am__objects_2) \ $(am__objects_3) tut_test_OBJECTS = $(am_tut_test_OBJECTS) tut_test_DEPENDENCIES = libdballe.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libdballe_la_SOURCES) $(dump_core_info_SOURCES) \ $(tut_test_SOURCES) DIST_SOURCES = $(am__libdballe_la_SOURCES_DIST) \ $(dump_core_info_SOURCES) $(am__tut_test_SOURCES_DIST) DATA = $(noinst_DATA) am__nobase_dist_dballeinclude_HEADERS_DIST = core/aliases.h \ core/verbose.h core/defs.h core/var.h core/rawmsg.h \ core/file.h core/arrayfile.h core/aoffile.h core/csv.h \ core/record.h core/matcher.h core/match-wreport.h msg/codec.h \ msg/context.h msg/vars.h msg/msg.h msg/msg-extravars.h \ msg/msgs.h msg/repinfo.h msg/aof_codec.h msg/wr_codec.h \ cmdline/cmdline.h cmdline/conversion.h cmdline/processor.h \ db/odbcworkarounds.h db/querybuf.h db/internals.h db/repinfo.h \ db/station.h db/context.h db/data.h db/attr.h db/cursor.h \ db/db.h cmdline/dbadb.h HEADERS = $(dist_noinst_HEADERS) $(nobase_dist_dballeinclude_HEADERS) ETAGS = etags CTAGS = ctags am__tty_colors = \ red=; grn=; lgn=; blu=; std= DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ -O0 CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FC = @FC@ FCFLAGS = @FCFLAGS@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBDBALLEF_VERSION_INFO = @LIBDBALLEF_VERSION_INFO@ LIBDBALLE_VERSION_INFO = @LIBDBALLE_VERSION_INFO@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LUA_CFLAGS = @LUA_CFLAGS@ LUA_LIBS = @LUA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ 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@ PKG_CONFIG = @PKG_CONFIG@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WIBBLE_CFLAGS = @WIBBLE_CFLAGS@ WIBBLE_LIBS = @WIBBLE_LIBS@ WREPORT_CFLAGS = @WREPORT_CFLAGS@ WREPORT_LIBS = @WREPORT_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ confdir = @confdir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ have_doxygen = @have_doxygen@ have_gperf = @have_gperf@ have_latex2html = @have_latex2html@ have_rst2html = @have_rst2html@ have_swig = @have_swig@ 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@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ tabledir = @tabledir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ #libdballe_la_LDFLAGS = -lstdc++ -version-info @LIBDBALLE_VERSION_INFO@ # filter.cc and sat.cc are here for now until I manage to turn them into a working system # toplevel EXTRA_DIST = core/aliases.gperf core/aliases.cc \ core/record_keyword.gperf core/record_keyword.cc msg/mkvars \ msg/vars.csv msg/vars.h msg/vars.gperf msg/vars.cc msg/vars.cc \ msg/msg-extravars.h core/vasprintf.h core/byteswap.h \ msg/wr_importers/base.h msg/aof_importers/common.h \ msg/filter.cc msg/wr_importers/sat.cc core/mkaliasdoc \ core/mkkeydoc msg/wr_exporters/exporters.dox msg/ltypes.txt \ msg/mklevels msg/mktranges mainpage.dox dballe.dox \ main-core.dox main-db.dox main-msg.dox CLEANFILES = core/aliases.dox core/aliases.tex core/record_keyword.dox \ core/record_keyword.dox core/record_keyword.rst \ core/record_keyword.tex msg/ltypes.dox msg/ltypes.tex \ msg/tranges.dox msg/tranges.tex INCLUDES = -DTABLE_DIR=\"$(tabledir)\" -I$(top_srcdir) -I$(top_builddir) $(WREPORT_CFLAGS) $(LUA_CFLAGS) BUILT_SOURCES = core/record_keyword.cc core/aliases.cc \ core/aliases-reverse.cc msg/vars.h msg/vars.cc msg/vars.gperf \ msg/msg-extravars.h # # Shared library # dballeincludedir = $(includedir)/dballe nobase_dist_dballeinclude_HEADERS = core/aliases.h core/verbose.h \ core/defs.h core/var.h core/rawmsg.h core/file.h \ core/arrayfile.h core/aoffile.h core/csv.h core/record.h \ core/matcher.h core/match-wreport.h msg/codec.h msg/context.h \ msg/vars.h msg/msg.h msg/msg-extravars.h msg/msgs.h \ msg/repinfo.h msg/aof_codec.h msg/wr_codec.h cmdline/cmdline.h \ cmdline/conversion.h cmdline/processor.h $(am__append_1) lib_LTLIBRARIES = libdballe.la libdballe_la_SOURCES = core/verbose.cc core/aliases.cc \ core/aliases-reverse.cc core/defs.cc core/var.cc core/file.cc \ core/arrayfile.cc core/aoffile.cc core/csv.cc \ core/record_keyword.cc core/record.cc core/matcher.cc \ core/match-wreport.cc msg/repinfo.cc msg/vars.cc \ msg/context.cc msg/msg.cc msg/msgs.cc msg/msg-lua.cc \ msg/codec.cc msg/aof_codec.cc msg/aof_importers/common.cc \ msg/aof_importers/synop.cc msg/aof_importers/dribu.cc \ msg/aof_importers/flight.cc msg/aof_importers/temp.cc \ msg/aof_importers/pilot.cc msg/wr_codec.cc \ msg/wr_importers/base.cc msg/wr_importers/synop.cc \ msg/wr_importers/temp.cc msg/wr_importers/metar.cc \ msg/wr_importers/flight.cc msg/wr_importers/generic.cc \ msg/wr_importers/pollution.cc msg/wr_exporters/synop.cc \ msg/wr_exporters/ship.cc msg/wr_exporters/buoy.cc \ msg/wr_exporters/metar.cc msg/wr_exporters/temp.cc \ msg/wr_exporters/flight.cc msg/wr_exporters/generic.cc \ msg/wr_exporters/pollution.cc cmdline/cmdline.cc \ cmdline/processor.cc cmdline/conversion.cc $(am__append_2) libdballe_la_LDFLAGS = -version-info @LIBDBALLE_VERSION_INFO@ $(WREPORT_LIBS) $(LUA_LIBS) TESTS_ENVIRONMENT = $(top_srcdir)/extra/runtest TESTS = $(check_PROGRAMS) dist_noinst_HEADERS = \ core/test-utils-core.h \ msg/test-utils-msg.h \ msg/test-utils-lua.h \ db/test-utils-db.h tut_test_SOURCES = core/tests/tut-main.cpp core/tests/aliases.cc \ core/tests/defs.cc core/tests/rawmsg.cc core/tests/file.cc \ core/tests/record.cc core/csv-tut.cc core/matcher-tut.cc \ core/match-wreport-tut.cc core/test-utils-core.cc \ msg/test-utils-msg.cc msg/tests/vars.cc msg/tests/context.cc \ msg/msg-tut.cc msg/msgs-tut.cc msg/tests/aof_codec.cc \ msg/tests/wr_import.cc msg/tests/wr_export.cc \ msg/tests/wr_codec.cc msg/tests/wr_codec_generic.cc \ $(am__append_3) $(am__append_4) tut_test_LDADD = \ libdballe.la \ $(WREPORT_LIBS) \ $(LUA_LIBS) \ $(WIBBLE_LIBS) dump_core_info_SOURCES = core/dump-core-info.cc dump_core_info_LDADD = \ libdballe.la \ $(WREPORT_LIBS) \ $(LUA_LIBS) \ $(WIBBLE_LIBS) # core # msg noinst_DATA = core/record_keyword.dox core/record_keyword.rst \ core/record_keyword.tex core/aliases.dox core/aliases.tex \ msg/ltypes.dox msg/ltypes.tex msg/tranges.dox msg/tranges.tex all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cc .cpp .lo .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) --foreign dballe/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign dballe/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-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done core/$(am__dirstamp): @$(MKDIR_P) core @: > core/$(am__dirstamp) core/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) core/$(DEPDIR) @: > core/$(DEPDIR)/$(am__dirstamp) core/verbose.lo: core/$(am__dirstamp) core/$(DEPDIR)/$(am__dirstamp) core/aliases.lo: core/$(am__dirstamp) core/$(DEPDIR)/$(am__dirstamp) core/aliases-reverse.lo: core/$(am__dirstamp) \ core/$(DEPDIR)/$(am__dirstamp) core/defs.lo: core/$(am__dirstamp) core/$(DEPDIR)/$(am__dirstamp) core/var.lo: core/$(am__dirstamp) core/$(DEPDIR)/$(am__dirstamp) core/file.lo: core/$(am__dirstamp) core/$(DEPDIR)/$(am__dirstamp) core/arrayfile.lo: core/$(am__dirstamp) core/$(DEPDIR)/$(am__dirstamp) core/aoffile.lo: core/$(am__dirstamp) core/$(DEPDIR)/$(am__dirstamp) core/csv.lo: core/$(am__dirstamp) core/$(DEPDIR)/$(am__dirstamp) core/record_keyword.lo: core/$(am__dirstamp) \ core/$(DEPDIR)/$(am__dirstamp) core/record.lo: core/$(am__dirstamp) core/$(DEPDIR)/$(am__dirstamp) core/matcher.lo: core/$(am__dirstamp) core/$(DEPDIR)/$(am__dirstamp) core/match-wreport.lo: core/$(am__dirstamp) \ core/$(DEPDIR)/$(am__dirstamp) msg/$(am__dirstamp): @$(MKDIR_P) msg @: > msg/$(am__dirstamp) msg/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) msg/$(DEPDIR) @: > msg/$(DEPDIR)/$(am__dirstamp) msg/repinfo.lo: msg/$(am__dirstamp) msg/$(DEPDIR)/$(am__dirstamp) msg/vars.lo: msg/$(am__dirstamp) msg/$(DEPDIR)/$(am__dirstamp) msg/context.lo: msg/$(am__dirstamp) msg/$(DEPDIR)/$(am__dirstamp) msg/msg.lo: msg/$(am__dirstamp) msg/$(DEPDIR)/$(am__dirstamp) msg/msgs.lo: msg/$(am__dirstamp) msg/$(DEPDIR)/$(am__dirstamp) msg/msg-lua.lo: msg/$(am__dirstamp) msg/$(DEPDIR)/$(am__dirstamp) msg/codec.lo: msg/$(am__dirstamp) msg/$(DEPDIR)/$(am__dirstamp) msg/aof_codec.lo: msg/$(am__dirstamp) msg/$(DEPDIR)/$(am__dirstamp) msg/aof_importers/$(am__dirstamp): @$(MKDIR_P) msg/aof_importers @: > msg/aof_importers/$(am__dirstamp) msg/aof_importers/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) msg/aof_importers/$(DEPDIR) @: > msg/aof_importers/$(DEPDIR)/$(am__dirstamp) msg/aof_importers/common.lo: msg/aof_importers/$(am__dirstamp) \ msg/aof_importers/$(DEPDIR)/$(am__dirstamp) msg/aof_importers/synop.lo: msg/aof_importers/$(am__dirstamp) \ msg/aof_importers/$(DEPDIR)/$(am__dirstamp) msg/aof_importers/dribu.lo: msg/aof_importers/$(am__dirstamp) \ msg/aof_importers/$(DEPDIR)/$(am__dirstamp) msg/aof_importers/flight.lo: msg/aof_importers/$(am__dirstamp) \ msg/aof_importers/$(DEPDIR)/$(am__dirstamp) msg/aof_importers/temp.lo: msg/aof_importers/$(am__dirstamp) \ msg/aof_importers/$(DEPDIR)/$(am__dirstamp) msg/aof_importers/pilot.lo: msg/aof_importers/$(am__dirstamp) \ msg/aof_importers/$(DEPDIR)/$(am__dirstamp) msg/wr_codec.lo: msg/$(am__dirstamp) msg/$(DEPDIR)/$(am__dirstamp) msg/wr_importers/$(am__dirstamp): @$(MKDIR_P) msg/wr_importers @: > msg/wr_importers/$(am__dirstamp) msg/wr_importers/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) msg/wr_importers/$(DEPDIR) @: > msg/wr_importers/$(DEPDIR)/$(am__dirstamp) msg/wr_importers/base.lo: msg/wr_importers/$(am__dirstamp) \ msg/wr_importers/$(DEPDIR)/$(am__dirstamp) msg/wr_importers/synop.lo: msg/wr_importers/$(am__dirstamp) \ msg/wr_importers/$(DEPDIR)/$(am__dirstamp) msg/wr_importers/temp.lo: msg/wr_importers/$(am__dirstamp) \ msg/wr_importers/$(DEPDIR)/$(am__dirstamp) msg/wr_importers/metar.lo: msg/wr_importers/$(am__dirstamp) \ msg/wr_importers/$(DEPDIR)/$(am__dirstamp) msg/wr_importers/flight.lo: msg/wr_importers/$(am__dirstamp) \ msg/wr_importers/$(DEPDIR)/$(am__dirstamp) msg/wr_importers/generic.lo: msg/wr_importers/$(am__dirstamp) \ msg/wr_importers/$(DEPDIR)/$(am__dirstamp) msg/wr_importers/pollution.lo: msg/wr_importers/$(am__dirstamp) \ msg/wr_importers/$(DEPDIR)/$(am__dirstamp) msg/wr_exporters/$(am__dirstamp): @$(MKDIR_P) msg/wr_exporters @: > msg/wr_exporters/$(am__dirstamp) msg/wr_exporters/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) msg/wr_exporters/$(DEPDIR) @: > msg/wr_exporters/$(DEPDIR)/$(am__dirstamp) msg/wr_exporters/synop.lo: msg/wr_exporters/$(am__dirstamp) \ msg/wr_exporters/$(DEPDIR)/$(am__dirstamp) msg/wr_exporters/ship.lo: msg/wr_exporters/$(am__dirstamp) \ msg/wr_exporters/$(DEPDIR)/$(am__dirstamp) msg/wr_exporters/buoy.lo: msg/wr_exporters/$(am__dirstamp) \ msg/wr_exporters/$(DEPDIR)/$(am__dirstamp) msg/wr_exporters/metar.lo: msg/wr_exporters/$(am__dirstamp) \ msg/wr_exporters/$(DEPDIR)/$(am__dirstamp) msg/wr_exporters/temp.lo: msg/wr_exporters/$(am__dirstamp) \ msg/wr_exporters/$(DEPDIR)/$(am__dirstamp) msg/wr_exporters/flight.lo: msg/wr_exporters/$(am__dirstamp) \ msg/wr_exporters/$(DEPDIR)/$(am__dirstamp) msg/wr_exporters/generic.lo: msg/wr_exporters/$(am__dirstamp) \ msg/wr_exporters/$(DEPDIR)/$(am__dirstamp) msg/wr_exporters/pollution.lo: msg/wr_exporters/$(am__dirstamp) \ msg/wr_exporters/$(DEPDIR)/$(am__dirstamp) cmdline/$(am__dirstamp): @$(MKDIR_P) cmdline @: > cmdline/$(am__dirstamp) cmdline/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) cmdline/$(DEPDIR) @: > cmdline/$(DEPDIR)/$(am__dirstamp) cmdline/cmdline.lo: cmdline/$(am__dirstamp) \ cmdline/$(DEPDIR)/$(am__dirstamp) cmdline/processor.lo: cmdline/$(am__dirstamp) \ cmdline/$(DEPDIR)/$(am__dirstamp) cmdline/conversion.lo: cmdline/$(am__dirstamp) \ cmdline/$(DEPDIR)/$(am__dirstamp) db/$(am__dirstamp): @$(MKDIR_P) db @: > db/$(am__dirstamp) db/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) db/$(DEPDIR) @: > db/$(DEPDIR)/$(am__dirstamp) db/querybuf.lo: db/$(am__dirstamp) db/$(DEPDIR)/$(am__dirstamp) db/internals.lo: db/$(am__dirstamp) db/$(DEPDIR)/$(am__dirstamp) db/repinfo.lo: db/$(am__dirstamp) db/$(DEPDIR)/$(am__dirstamp) db/station.lo: db/$(am__dirstamp) db/$(DEPDIR)/$(am__dirstamp) db/context.lo: db/$(am__dirstamp) db/$(DEPDIR)/$(am__dirstamp) db/data.lo: db/$(am__dirstamp) db/$(DEPDIR)/$(am__dirstamp) db/attr.lo: db/$(am__dirstamp) db/$(DEPDIR)/$(am__dirstamp) db/cursor.lo: db/$(am__dirstamp) db/$(DEPDIR)/$(am__dirstamp) db/db.lo: db/$(am__dirstamp) db/$(DEPDIR)/$(am__dirstamp) db/import.lo: db/$(am__dirstamp) db/$(DEPDIR)/$(am__dirstamp) db/export.lo: db/$(am__dirstamp) db/$(DEPDIR)/$(am__dirstamp) cmdline/dbadb.lo: cmdline/$(am__dirstamp) \ cmdline/$(DEPDIR)/$(am__dirstamp) libdballe.la: $(libdballe_la_OBJECTS) $(libdballe_la_DEPENDENCIES) $(EXTRA_libdballe_la_DEPENDENCIES) $(libdballe_la_LINK) -rpath $(libdir) $(libdballe_la_OBJECTS) $(libdballe_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list core/dump-core-info.$(OBJEXT): core/$(am__dirstamp) \ core/$(DEPDIR)/$(am__dirstamp) dump-core-info$(EXEEXT): $(dump_core_info_OBJECTS) $(dump_core_info_DEPENDENCIES) $(EXTRA_dump_core_info_DEPENDENCIES) @rm -f dump-core-info$(EXEEXT) $(CXXLINK) $(dump_core_info_OBJECTS) $(dump_core_info_LDADD) $(LIBS) core/tests/$(am__dirstamp): @$(MKDIR_P) core/tests @: > core/tests/$(am__dirstamp) core/tests/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) core/tests/$(DEPDIR) @: > core/tests/$(DEPDIR)/$(am__dirstamp) core/tests/tut-main.$(OBJEXT): core/tests/$(am__dirstamp) \ core/tests/$(DEPDIR)/$(am__dirstamp) core/tests/aliases.$(OBJEXT): core/tests/$(am__dirstamp) \ core/tests/$(DEPDIR)/$(am__dirstamp) core/tests/defs.$(OBJEXT): core/tests/$(am__dirstamp) \ core/tests/$(DEPDIR)/$(am__dirstamp) core/tests/rawmsg.$(OBJEXT): core/tests/$(am__dirstamp) \ core/tests/$(DEPDIR)/$(am__dirstamp) core/tests/file.$(OBJEXT): core/tests/$(am__dirstamp) \ core/tests/$(DEPDIR)/$(am__dirstamp) core/tests/record.$(OBJEXT): core/tests/$(am__dirstamp) \ core/tests/$(DEPDIR)/$(am__dirstamp) core/csv-tut.$(OBJEXT): core/$(am__dirstamp) \ core/$(DEPDIR)/$(am__dirstamp) core/matcher-tut.$(OBJEXT): core/$(am__dirstamp) \ core/$(DEPDIR)/$(am__dirstamp) core/match-wreport-tut.$(OBJEXT): core/$(am__dirstamp) \ core/$(DEPDIR)/$(am__dirstamp) core/test-utils-core.$(OBJEXT): core/$(am__dirstamp) \ core/$(DEPDIR)/$(am__dirstamp) msg/test-utils-msg.$(OBJEXT): msg/$(am__dirstamp) \ msg/$(DEPDIR)/$(am__dirstamp) msg/tests/$(am__dirstamp): @$(MKDIR_P) msg/tests @: > msg/tests/$(am__dirstamp) msg/tests/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) msg/tests/$(DEPDIR) @: > msg/tests/$(DEPDIR)/$(am__dirstamp) msg/tests/vars.$(OBJEXT): msg/tests/$(am__dirstamp) \ msg/tests/$(DEPDIR)/$(am__dirstamp) msg/tests/context.$(OBJEXT): msg/tests/$(am__dirstamp) \ msg/tests/$(DEPDIR)/$(am__dirstamp) msg/msg-tut.$(OBJEXT): msg/$(am__dirstamp) \ msg/$(DEPDIR)/$(am__dirstamp) msg/msgs-tut.$(OBJEXT): msg/$(am__dirstamp) \ msg/$(DEPDIR)/$(am__dirstamp) msg/tests/aof_codec.$(OBJEXT): msg/tests/$(am__dirstamp) \ msg/tests/$(DEPDIR)/$(am__dirstamp) msg/tests/wr_import.$(OBJEXT): msg/tests/$(am__dirstamp) \ msg/tests/$(DEPDIR)/$(am__dirstamp) msg/tests/wr_export.$(OBJEXT): msg/tests/$(am__dirstamp) \ msg/tests/$(DEPDIR)/$(am__dirstamp) msg/tests/wr_codec.$(OBJEXT): msg/tests/$(am__dirstamp) \ msg/tests/$(DEPDIR)/$(am__dirstamp) msg/tests/wr_codec_generic.$(OBJEXT): msg/tests/$(am__dirstamp) \ msg/tests/$(DEPDIR)/$(am__dirstamp) msg/tests/lua.$(OBJEXT): msg/tests/$(am__dirstamp) \ msg/tests/$(DEPDIR)/$(am__dirstamp) msg/test-utils-lua.$(OBJEXT): msg/$(am__dirstamp) \ msg/$(DEPDIR)/$(am__dirstamp) db/test-utils-db.$(OBJEXT): db/$(am__dirstamp) \ db/$(DEPDIR)/$(am__dirstamp) db/tests/$(am__dirstamp): @$(MKDIR_P) db/tests @: > db/tests/$(am__dirstamp) db/tests/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) db/tests/$(DEPDIR) @: > db/tests/$(DEPDIR)/$(am__dirstamp) db/tests/querybuf.$(OBJEXT): db/tests/$(am__dirstamp) \ db/tests/$(DEPDIR)/$(am__dirstamp) db/tests/repinfo.$(OBJEXT): db/tests/$(am__dirstamp) \ db/tests/$(DEPDIR)/$(am__dirstamp) db/tests/station.$(OBJEXT): db/tests/$(am__dirstamp) \ db/tests/$(DEPDIR)/$(am__dirstamp) db/tests/context.$(OBJEXT): db/tests/$(am__dirstamp) \ db/tests/$(DEPDIR)/$(am__dirstamp) db/tests/data.$(OBJEXT): db/tests/$(am__dirstamp) \ db/tests/$(DEPDIR)/$(am__dirstamp) db/tests/attr.$(OBJEXT): db/tests/$(am__dirstamp) \ db/tests/$(DEPDIR)/$(am__dirstamp) db/tests/db.$(OBJEXT): db/tests/$(am__dirstamp) \ db/tests/$(DEPDIR)/$(am__dirstamp) db/tests/db_import.$(OBJEXT): db/tests/$(am__dirstamp) \ db/tests/$(DEPDIR)/$(am__dirstamp) db/tests/db_export.$(OBJEXT): db/tests/$(am__dirstamp) \ db/tests/$(DEPDIR)/$(am__dirstamp) cmdline/dbadb-tut.$(OBJEXT): cmdline/$(am__dirstamp) \ cmdline/$(DEPDIR)/$(am__dirstamp) tut_test$(EXEEXT): $(tut_test_OBJECTS) $(tut_test_DEPENDENCIES) $(EXTRA_tut_test_DEPENDENCIES) @rm -f tut_test$(EXEEXT) $(CXXLINK) $(tut_test_OBJECTS) $(tut_test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f cmdline/cmdline.$(OBJEXT) -rm -f cmdline/cmdline.lo -rm -f cmdline/conversion.$(OBJEXT) -rm -f cmdline/conversion.lo -rm -f cmdline/dbadb-tut.$(OBJEXT) -rm -f cmdline/dbadb.$(OBJEXT) -rm -f cmdline/dbadb.lo -rm -f cmdline/processor.$(OBJEXT) -rm -f cmdline/processor.lo -rm -f core/aliases-reverse.$(OBJEXT) -rm -f core/aliases-reverse.lo -rm -f core/aliases.$(OBJEXT) -rm -f core/aliases.lo -rm -f core/aoffile.$(OBJEXT) -rm -f core/aoffile.lo -rm -f core/arrayfile.$(OBJEXT) -rm -f core/arrayfile.lo -rm -f core/csv-tut.$(OBJEXT) -rm -f core/csv.$(OBJEXT) -rm -f core/csv.lo -rm -f core/defs.$(OBJEXT) -rm -f core/defs.lo -rm -f core/dump-core-info.$(OBJEXT) -rm -f core/file.$(OBJEXT) -rm -f core/file.lo -rm -f core/match-wreport-tut.$(OBJEXT) -rm -f core/match-wreport.$(OBJEXT) -rm -f core/match-wreport.lo -rm -f core/matcher-tut.$(OBJEXT) -rm -f core/matcher.$(OBJEXT) -rm -f core/matcher.lo -rm -f core/record.$(OBJEXT) -rm -f core/record.lo -rm -f core/record_keyword.$(OBJEXT) -rm -f core/record_keyword.lo -rm -f core/test-utils-core.$(OBJEXT) -rm -f core/tests/aliases.$(OBJEXT) -rm -f core/tests/defs.$(OBJEXT) -rm -f core/tests/file.$(OBJEXT) -rm -f core/tests/rawmsg.$(OBJEXT) -rm -f core/tests/record.$(OBJEXT) -rm -f core/tests/tut-main.$(OBJEXT) -rm -f core/var.$(OBJEXT) -rm -f core/var.lo -rm -f core/verbose.$(OBJEXT) -rm -f core/verbose.lo -rm -f db/attr.$(OBJEXT) -rm -f db/attr.lo -rm -f db/context.$(OBJEXT) -rm -f db/context.lo -rm -f db/cursor.$(OBJEXT) -rm -f db/cursor.lo -rm -f db/data.$(OBJEXT) -rm -f db/data.lo -rm -f db/db.$(OBJEXT) -rm -f db/db.lo -rm -f db/export.$(OBJEXT) -rm -f db/export.lo -rm -f db/import.$(OBJEXT) -rm -f db/import.lo -rm -f db/internals.$(OBJEXT) -rm -f db/internals.lo -rm -f db/querybuf.$(OBJEXT) -rm -f db/querybuf.lo -rm -f db/repinfo.$(OBJEXT) -rm -f db/repinfo.lo -rm -f db/station.$(OBJEXT) -rm -f db/station.lo -rm -f db/test-utils-db.$(OBJEXT) -rm -f db/tests/attr.$(OBJEXT) -rm -f db/tests/context.$(OBJEXT) -rm -f db/tests/data.$(OBJEXT) -rm -f db/tests/db.$(OBJEXT) -rm -f db/tests/db_export.$(OBJEXT) -rm -f db/tests/db_import.$(OBJEXT) -rm -f db/tests/querybuf.$(OBJEXT) -rm -f db/tests/repinfo.$(OBJEXT) -rm -f db/tests/station.$(OBJEXT) -rm -f msg/aof_codec.$(OBJEXT) -rm -f msg/aof_codec.lo -rm -f msg/aof_importers/common.$(OBJEXT) -rm -f msg/aof_importers/common.lo -rm -f msg/aof_importers/dribu.$(OBJEXT) -rm -f msg/aof_importers/dribu.lo -rm -f msg/aof_importers/flight.$(OBJEXT) -rm -f msg/aof_importers/flight.lo -rm -f msg/aof_importers/pilot.$(OBJEXT) -rm -f msg/aof_importers/pilot.lo -rm -f msg/aof_importers/synop.$(OBJEXT) -rm -f msg/aof_importers/synop.lo -rm -f msg/aof_importers/temp.$(OBJEXT) -rm -f msg/aof_importers/temp.lo -rm -f msg/codec.$(OBJEXT) -rm -f msg/codec.lo -rm -f msg/context.$(OBJEXT) -rm -f msg/context.lo -rm -f msg/msg-lua.$(OBJEXT) -rm -f msg/msg-lua.lo -rm -f msg/msg-tut.$(OBJEXT) -rm -f msg/msg.$(OBJEXT) -rm -f msg/msg.lo -rm -f msg/msgs-tut.$(OBJEXT) -rm -f msg/msgs.$(OBJEXT) -rm -f msg/msgs.lo -rm -f msg/repinfo.$(OBJEXT) -rm -f msg/repinfo.lo -rm -f msg/test-utils-lua.$(OBJEXT) -rm -f msg/test-utils-msg.$(OBJEXT) -rm -f msg/tests/aof_codec.$(OBJEXT) -rm -f msg/tests/context.$(OBJEXT) -rm -f msg/tests/lua.$(OBJEXT) -rm -f msg/tests/vars.$(OBJEXT) -rm -f msg/tests/wr_codec.$(OBJEXT) -rm -f msg/tests/wr_codec_generic.$(OBJEXT) -rm -f msg/tests/wr_export.$(OBJEXT) -rm -f msg/tests/wr_import.$(OBJEXT) -rm -f msg/vars.$(OBJEXT) -rm -f msg/vars.lo -rm -f msg/wr_codec.$(OBJEXT) -rm -f msg/wr_codec.lo -rm -f msg/wr_exporters/buoy.$(OBJEXT) -rm -f msg/wr_exporters/buoy.lo -rm -f msg/wr_exporters/flight.$(OBJEXT) -rm -f msg/wr_exporters/flight.lo -rm -f msg/wr_exporters/generic.$(OBJEXT) -rm -f msg/wr_exporters/generic.lo -rm -f msg/wr_exporters/metar.$(OBJEXT) -rm -f msg/wr_exporters/metar.lo -rm -f msg/wr_exporters/pollution.$(OBJEXT) -rm -f msg/wr_exporters/pollution.lo -rm -f msg/wr_exporters/ship.$(OBJEXT) -rm -f msg/wr_exporters/ship.lo -rm -f msg/wr_exporters/synop.$(OBJEXT) -rm -f msg/wr_exporters/synop.lo -rm -f msg/wr_exporters/temp.$(OBJEXT) -rm -f msg/wr_exporters/temp.lo -rm -f msg/wr_importers/base.$(OBJEXT) -rm -f msg/wr_importers/base.lo -rm -f msg/wr_importers/flight.$(OBJEXT) -rm -f msg/wr_importers/flight.lo -rm -f msg/wr_importers/generic.$(OBJEXT) -rm -f msg/wr_importers/generic.lo -rm -f msg/wr_importers/metar.$(OBJEXT) -rm -f msg/wr_importers/metar.lo -rm -f msg/wr_importers/pollution.$(OBJEXT) -rm -f msg/wr_importers/pollution.lo -rm -f msg/wr_importers/synop.$(OBJEXT) -rm -f msg/wr_importers/synop.lo -rm -f msg/wr_importers/temp.$(OBJEXT) -rm -f msg/wr_importers/temp.lo distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@cmdline/$(DEPDIR)/cmdline.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@cmdline/$(DEPDIR)/conversion.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@cmdline/$(DEPDIR)/dbadb-tut.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@cmdline/$(DEPDIR)/dbadb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@cmdline/$(DEPDIR)/processor.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@core/$(DEPDIR)/aliases-reverse.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@core/$(DEPDIR)/aliases.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@core/$(DEPDIR)/aoffile.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@core/$(DEPDIR)/arrayfile.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@core/$(DEPDIR)/csv-tut.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@core/$(DEPDIR)/csv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@core/$(DEPDIR)/defs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@core/$(DEPDIR)/dump-core-info.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@core/$(DEPDIR)/file.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@core/$(DEPDIR)/match-wreport-tut.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@core/$(DEPDIR)/match-wreport.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@core/$(DEPDIR)/matcher-tut.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@core/$(DEPDIR)/matcher.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@core/$(DEPDIR)/record.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@core/$(DEPDIR)/record_keyword.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@core/$(DEPDIR)/test-utils-core.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@core/$(DEPDIR)/var.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@core/$(DEPDIR)/verbose.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@core/tests/$(DEPDIR)/aliases.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@core/tests/$(DEPDIR)/defs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@core/tests/$(DEPDIR)/file.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@core/tests/$(DEPDIR)/rawmsg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@core/tests/$(DEPDIR)/record.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@core/tests/$(DEPDIR)/tut-main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@db/$(DEPDIR)/attr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@db/$(DEPDIR)/context.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@db/$(DEPDIR)/cursor.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@db/$(DEPDIR)/data.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@db/$(DEPDIR)/db.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@db/$(DEPDIR)/export.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@db/$(DEPDIR)/import.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@db/$(DEPDIR)/internals.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@db/$(DEPDIR)/querybuf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@db/$(DEPDIR)/repinfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@db/$(DEPDIR)/station.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@db/$(DEPDIR)/test-utils-db.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@db/tests/$(DEPDIR)/attr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@db/tests/$(DEPDIR)/context.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@db/tests/$(DEPDIR)/data.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@db/tests/$(DEPDIR)/db.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@db/tests/$(DEPDIR)/db_export.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@db/tests/$(DEPDIR)/db_import.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@db/tests/$(DEPDIR)/querybuf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@db/tests/$(DEPDIR)/repinfo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@db/tests/$(DEPDIR)/station.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/$(DEPDIR)/aof_codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/$(DEPDIR)/codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/$(DEPDIR)/context.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/$(DEPDIR)/msg-lua.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/$(DEPDIR)/msg-tut.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/$(DEPDIR)/msg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/$(DEPDIR)/msgs-tut.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/$(DEPDIR)/msgs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/$(DEPDIR)/repinfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/$(DEPDIR)/test-utils-lua.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/$(DEPDIR)/test-utils-msg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/$(DEPDIR)/vars.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/$(DEPDIR)/wr_codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/aof_importers/$(DEPDIR)/common.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/aof_importers/$(DEPDIR)/dribu.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/aof_importers/$(DEPDIR)/flight.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/aof_importers/$(DEPDIR)/pilot.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/aof_importers/$(DEPDIR)/synop.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/aof_importers/$(DEPDIR)/temp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/tests/$(DEPDIR)/aof_codec.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/tests/$(DEPDIR)/context.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/tests/$(DEPDIR)/lua.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/tests/$(DEPDIR)/vars.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/tests/$(DEPDIR)/wr_codec.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/tests/$(DEPDIR)/wr_codec_generic.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/tests/$(DEPDIR)/wr_export.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/tests/$(DEPDIR)/wr_import.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/wr_exporters/$(DEPDIR)/buoy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/wr_exporters/$(DEPDIR)/flight.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/wr_exporters/$(DEPDIR)/generic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/wr_exporters/$(DEPDIR)/metar.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/wr_exporters/$(DEPDIR)/pollution.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/wr_exporters/$(DEPDIR)/ship.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/wr_exporters/$(DEPDIR)/synop.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/wr_exporters/$(DEPDIR)/temp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/wr_importers/$(DEPDIR)/base.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/wr_importers/$(DEPDIR)/flight.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/wr_importers/$(DEPDIR)/generic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/wr_importers/$(DEPDIR)/metar.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/wr_importers/$(DEPDIR)/pollution.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/wr_importers/$(DEPDIR)/synop.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@msg/wr_importers/$(DEPDIR)/temp.Plo@am__quote@ .cc.o: @am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cc.obj: @am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cc.lo: @am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< .cpp.o: @am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf cmdline/.libs cmdline/_libs -rm -rf core/.libs core/_libs -rm -rf db/.libs db/_libs -rm -rf msg/.libs msg/_libs -rm -rf msg/aof_importers/.libs msg/aof_importers/_libs -rm -rf msg/wr_exporters/.libs msg/wr_exporters/_libs -rm -rf msg/wr_importers/.libs msg/wr_importers/_libs install-nobase_dist_dballeincludeHEADERS: $(nobase_dist_dballeinclude_HEADERS) @$(NORMAL_INSTALL) test -z "$(dballeincludedir)" || $(MKDIR_P) "$(DESTDIR)$(dballeincludedir)" @list='$(nobase_dist_dballeinclude_HEADERS)'; test -n "$(dballeincludedir)" || list=; \ $(am__nobase_list) | while read dir files; do \ xfiles=; for file in $$files; do \ if test -f "$$file"; then xfiles="$$xfiles $$file"; \ else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \ test -z "$$xfiles" || { \ test "x$$dir" = x. || { \ echo "$(MKDIR_P) '$(DESTDIR)$(dballeincludedir)/$$dir'"; \ $(MKDIR_P) "$(DESTDIR)$(dballeincludedir)/$$dir"; }; \ echo " $(INSTALL_HEADER) $$xfiles '$(DESTDIR)$(dballeincludedir)/$$dir'"; \ $(INSTALL_HEADER) $$xfiles "$(DESTDIR)$(dballeincludedir)/$$dir" || exit $$?; }; \ done uninstall-nobase_dist_dballeincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(nobase_dist_dballeinclude_HEADERS)'; test -n "$(dballeincludedir)" || list=; \ $(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \ dir='$(DESTDIR)$(dballeincludedir)'; $(am__uninstall_files_from_dir) ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list=' $(TESTS) '; \ $(am__tty_colors); \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ col=$$red; res=XPASS; \ ;; \ *) \ col=$$grn; res=PASS; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xfail=`expr $$xfail + 1`; \ col=$$lgn; res=XFAIL; \ ;; \ *) \ failed=`expr $$failed + 1`; \ col=$$red; res=FAIL; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ col=$$blu; res=SKIP; \ fi; \ echo "$${col}$$res$${std}: $$tst"; \ done; \ if test "$$all" -eq 1; then \ tests="test"; \ All=""; \ else \ tests="tests"; \ All="All "; \ fi; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="$$All$$all $$tests passed"; \ else \ if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all $$tests failed"; \ else \ if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ if test "$$skip" -eq 1; then \ skipped="($$skip test was not run)"; \ else \ skipped="($$skip tests were not run)"; \ fi; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ if test "$$failed" -eq 0; then \ col="$$grn"; \ else \ col="$$red"; \ fi; \ echo "$${col}$$dashes$${std}"; \ echo "$${col}$$banner$${std}"; \ test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \ test -z "$$report" || echo "$${col}$$report$${std}"; \ echo "$${col}$$dashes$${std}"; \ test "$$failed" -eq 0; \ else :; fi 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 $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(dballeincludedir)"; 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) -rm -f cmdline/$(DEPDIR)/$(am__dirstamp) -rm -f cmdline/$(am__dirstamp) -rm -f core/$(DEPDIR)/$(am__dirstamp) -rm -f core/$(am__dirstamp) -rm -f core/tests/$(DEPDIR)/$(am__dirstamp) -rm -f core/tests/$(am__dirstamp) -rm -f db/$(DEPDIR)/$(am__dirstamp) -rm -f db/$(am__dirstamp) -rm -f db/tests/$(DEPDIR)/$(am__dirstamp) -rm -f db/tests/$(am__dirstamp) -rm -f msg/$(DEPDIR)/$(am__dirstamp) -rm -f msg/$(am__dirstamp) -rm -f msg/aof_importers/$(DEPDIR)/$(am__dirstamp) -rm -f msg/aof_importers/$(am__dirstamp) -rm -f msg/tests/$(DEPDIR)/$(am__dirstamp) -rm -f msg/tests/$(am__dirstamp) -rm -f msg/wr_exporters/$(DEPDIR)/$(am__dirstamp) -rm -f msg/wr_exporters/$(am__dirstamp) -rm -f msg/wr_importers/$(DEPDIR)/$(am__dirstamp) -rm -f msg/wr_importers/$(am__dirstamp) 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) clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \ clean-libtool clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf cmdline/$(DEPDIR) core/$(DEPDIR) core/tests/$(DEPDIR) db/$(DEPDIR) db/tests/$(DEPDIR) msg/$(DEPDIR) msg/aof_importers/$(DEPDIR) msg/tests/$(DEPDIR) msg/wr_exporters/$(DEPDIR) msg/wr_importers/$(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-nobase_dist_dballeincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES 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 cmdline/$(DEPDIR) core/$(DEPDIR) core/tests/$(DEPDIR) db/$(DEPDIR) db/tests/$(DEPDIR) msg/$(DEPDIR) msg/aof_importers/$(DEPDIR) msg/tests/$(DEPDIR) msg/wr_exporters/$(DEPDIR) msg/wr_importers/$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES \ uninstall-nobase_dist_dballeincludeHEADERS .MAKE: all check check-am install install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \ clean-libtool clean-noinstPROGRAMS ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags 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-libLTLIBRARIES install-man \ install-nobase_dist_dballeincludeHEADERS 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES \ uninstall-nobase_dist_dballeincludeHEADERS # # Autobuilt files # core/record_keyword.cc: core/record_keyword.gperf if ! gperf < $< > $@; then rm $@; /bin/false; fi core/aliases.cc: core/aliases.gperf if ! gperf < $< > $@; then rm $@; /bin/false; fi core/aliases-reverse.cc: core/aliases.gperf core/mkaliasdoc $(srcdir)/core/mkaliasdoc revsolver < $< > $@ msg/vars.h msg/vars.gperf msg/msg-extravars.h: msg/vars.csv msg/mkvars $(srcdir)/msg/mkvars msg < $< msg/vars.cc: msg/vars.gperf if ! gperf < $< > $@; then rm $@; /bin/false; fi core/record_keyword.rst: core/record_keyword.gperf core/mkkeydoc dump-core-info ./dump-core-info keywords | $(srcdir)/core/mkkeydoc rst > $@ core/record_keyword.dox: core/record_keyword.gperf core/mkkeydoc dump-core-info ./dump-core-info keywords | $(srcdir)/core/mkkeydoc dox > $@ core/record_keyword.tex: core/record_keyword.gperf core/mkkeydoc dump-core-info ./dump-core-info keywords | $(srcdir)/core/mkkeydoc tex > $@ core/aliases.dox: core/aliases.gperf core/mkaliasdoc $(srcdir)/core/mkaliasdoc dox < $< > $@ core/aliases.tex: core/aliases.gperf core/mkaliasdoc $(srcdir)/core/mkaliasdoc tex < $< > $@ msg/ltypes.dox: msg/ltypes.txt msg/mklevels $(srcdir)/msg/mklevels dox < $< > $@ msg/ltypes.tex: msg/ltypes.txt msg/mklevels $(srcdir)/msg/mklevels tex < $< > $@ msg/tranges.dox: msg/mktranges $(srcdir)/msg/mktranges dox < $< > $@ msg/tranges.tex: msg/mktranges $(srcdir)/msg/mktranges tex < $< > $@ # 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: dballe-5.18/dballe/db/0000755000175000017500000000000011754670141011511 500000000000000dballe-5.18/dballe/db/repinfo.cc0000644000175000017500000002547111464776350013422 00000000000000/* * db/repinfo - repinfo table management * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "repinfo.h" #include "internals.h" #include #include #include #include using namespace wreport; using namespace std; namespace dballe { namespace db { namespace repinfo { Cache::Cache(int id, const std::string& memo, const std::string& desc, int prio, const std::string& descriptor, int tablea) : id(id), memo(memo), desc(desc), prio(prio), descriptor(descriptor), tablea(tablea), new_prio(0), new_tablea(0) { } void Cache::make_new() { new_memo = memo; new_desc = desc; new_prio = prio; new_descriptor = descriptor; new_tablea = tablea; } bool Memoidx::operator<(const Memoidx& val) const { return memo < val.memo; } } Repinfo::Repinfo(Connection* conn) : conn(conn) { read_cache(); } Repinfo::~Repinfo() { } void Repinfo::read_cache() { db::Statement stm(*conn); DBALLE_SQL_C_UINT_TYPE id; char memo[20]; SQLLEN memo_ind; char description[255]; SQLLEN description_ind; DBALLE_SQL_C_SINT_TYPE prio; SQLLEN prio_ind; char descriptor[6]; SQLLEN descriptor_ind; DBALLE_SQL_C_UINT_TYPE tablea; SQLLEN tablea_ind; invalidate_cache(); stm.bind_out(1, id); stm.bind_out(2, memo, sizeof(memo), memo_ind); stm.bind_out(3, description, sizeof(description), description_ind); stm.bind_out(4, prio); stm.bind_out(5, descriptor, sizeof(descriptor), descriptor_ind); stm.bind_out(6, tablea); stm.exec_direct("SELECT id, memo, description, prio, descriptor, tablea FROM repinfo ORDER BY id"); /* Get the results and save them in the record */ while (stm.fetch()) cache_append(id, memo, description, prio, descriptor, tablea); /* Rebuild the memo index as well */ rebuild_memo_idx(); } void Repinfo::cache_append(unsigned id, const char* memo, const char* desc, int prio, const char* descriptor, int tablea) { /* Ensure that we are adding things in order */ if (!cache.empty() && cache.back().id >= id) error_consistency::throwf( "checking that value to append to repinfo cache (%u) " "is greather than the last value in che cache (%u)", id, (unsigned)cache.back().id); memo_idx.clear(); /* Enlarge buffer if needed */ cache.push_back(repinfo::Cache(id, memo, desc, prio, descriptor, tablea)); } void Repinfo::invalidate_cache() { cache.clear(); memo_idx.clear(); } void Repinfo::rebuild_memo_idx() const { memo_idx.clear(); memo_idx.resize(cache.size()); for (size_t i = 0; i < cache.size(); ++i) { memo_idx[i].memo = cache[i].memo; memo_idx[i].id = cache[i].id; } std::sort(memo_idx.begin(), memo_idx.end()); } int Repinfo::get_id(const char* memo) const { char lc_memo[20]; int i; for (i = 0; i < 19 && memo[i]; ++i) lc_memo[i] = tolower(memo[i]); lc_memo[i] = 0; if (memo_idx.empty()) rebuild_memo_idx(); int pos = cache_find_by_memo(lc_memo); if (pos == -1) error_notfound::throwf("looking for repinfo corresponding to '%s'", memo); return memo_idx[pos].id; } int Repinfo::cache_find_by_memo(const char* memo) const { /* Binary search the memo index */ int begin, end; begin = -1, end = cache.size(); while (end - begin > 1) { int cur = (end + begin) / 2; if (memo_idx[cur].memo > memo) end = cur; else begin = cur; } if (begin == -1 || memo_idx[begin].memo != memo) return -1; else return begin; } bool Repinfo::has_id(unsigned id) const { return cache_find_by_id(id) != -1; } int Repinfo::cache_find_by_id(unsigned id) const { /* Binary search the ID */ int begin, end; begin = -1, end = cache.size(); while (end - begin > 1) { int cur = (end + begin) / 2; if (cache[cur].id > id) end = cur; else begin = cur; } if (begin == -1 || cache[begin].id != id) return -1; else return begin; } const repinfo::Cache* Repinfo::get_by_id(unsigned id) const { int pos = cache_find_by_id(id); return pos == -1 ? NULL : &(cache[pos]); } const repinfo::Cache* Repinfo::get_by_memo(const char* memo) const { int pos = cache_find_by_memo(memo); if (pos == -1) return NULL; return get_by_id(memo_idx[pos].id); } #if 0 /* static void commit_cache_item(struct _dba_db_repinfo_cache* item) { if (item->memo != NULL) free(item->memo); item->memo = item->new_memo; item->new_memo = NULL; if (item->desc != NULL) free(item->desc); item->desc = item->new_desc; item->new_desc = NULL; if (item->descriptor != NULL) free(item->descriptor); item->descriptor = item->new_descriptor; item->new_descriptor = NULL; } */ #endif static inline void inplace_tolower(std::string& buf) { for (string::iterator i = buf.begin(); i != buf.end(); ++i) *i = tolower(*i); } namespace { struct fd_closer { FILE* fd; fd_closer(FILE* fd) : fd(fd) {} ~fd_closer() { fclose(fd); } }; } std::vector Repinfo::read_repinfo_file(const char* deffile) { if (deffile == 0) deffile = default_repinfo_file(); /* Open the input CSV file */ FILE* in = fopen(deffile, "r"); if (in == NULL) error_system::throwf("opening file %s", deffile); fd_closer closer(in); /* Read the CSV file */ vector newitems; vector columns; for (int line = 1; csv_read_next(in, columns); ++line) { int id, pos; if (columns.size() != 6) error_parse::throwf(deffile, line, "Expected 6 columns, got %zd", columns.size()); // Lowercase all rep_memos inplace_tolower(columns[1]); id = strtol(columns[0].c_str(), 0, 10); pos = cache_find_by_id(id); if (pos == -1) { /* New entry */ newitems.push_back(repinfo::Cache(id, columns[1], columns[2], strtol(columns[3].c_str(), 0, 10), columns[4], strtol(columns[5].c_str(), 0, 10))); newitems.back().make_new(); } else { /* Possible update on an existing entry */ cache[pos].new_memo = columns[1]; cache[pos].new_desc = columns[2]; cache[pos].new_prio = strtol(columns[3].c_str(), 0, 10); cache[pos].new_descriptor = columns[4]; cache[pos].new_tablea = strtol(columns[5].c_str(), 0, 10); } } /* Verify conflicts */ for (size_t i = 0; i < cache.size(); ++i) { /* Skip empty items or items that will be deleted */ if (cache[i].memo.empty() || cache[i].new_memo.empty()) continue; for (size_t j = i + 1; j < cache.size(); ++j) { /* Skip empty items or items that will be deleted */ if (cache[j].memo.empty() || cache[j].new_memo.empty()) continue; if (cache[j].new_prio == cache[i].new_prio) error_consistency::throwf("%s has the same priority (%d) as %s", cache[j].new_memo.c_str(), (int)cache[j].new_prio, cache[i].new_memo.c_str()); } for (vector::const_iterator j = newitems.begin(); j != newitems.end(); ++j) { if (j->new_prio == cache[i].new_prio) error_consistency::throwf("%s has the same priority (%d) as %s", j->new_memo.c_str(), (int)j->new_prio, cache[i].new_memo.c_str()); } } for (vector::const_iterator i = newitems.begin(); i != newitems.end(); ++i) { /*fprintf(stderr, "prio %d\n", cur->item.new_prio);*/ for (vector::const_iterator j = i + 1; j != newitems.end(); ++j) { if (i->new_prio == j->new_prio) error_consistency::throwf("%s has the same priority (%d) as %s", i->new_memo.c_str(), (int)i->new_prio, j->new_memo.c_str()); } } return newitems; } void Repinfo::update(const char* deffile, int* added, int* deleted, int* updated) { *added = *deleted = *updated = 0; // Read the new repinfo data from file vector newitems = read_repinfo_file(deffile); // Verify that we are not trying to delete a repinfo entry that is // used in some data context { DBALLE_SQL_C_UINT_TYPE id; DBALLE_SQL_C_UINT_TYPE count; db::Statement stm(*conn); stm.prepare("SELECT COUNT(1) FROM context WHERE id_report = ?"); stm.bind_in(1, id); stm.bind_out(1, count); for (size_t i = 0; i < cache.size(); ++i) { /* Ensure that we are not deleting a repinfo entry that is already in use */ if (!cache[i].memo.empty() && cache[i].new_memo.empty()) { id = cache[i].id; stm.execute(); if (!stm.fetch_expecting_one()) error_consistency::throwf("%s is in cache but not in the database (database externally modified?)", cache[i].memo.c_str()); if (count > 0) error_consistency::throwf( "trying to delete repinfo entry %u,%s which is currently in use", (unsigned)cache[i].id, cache[i].memo.c_str()); } } } /* Perform the changes */ /* Delete the items that were deleted */ { db::Statement stm(*conn); stm.prepare("DELETE FROM repinfo WHERE id=?"); for (size_t i = 0; i < cache.size(); ++i) if (!cache[i].memo.empty() && cache[i].new_memo.empty()) { stm.bind_in(1, cache[i].id); stm.execute_and_close(); /* clear_cache_item(&(ri->cache[i])); */ ++*deleted; } } /* Update the items that were modified */ { db::Statement stm(*conn); stm.prepare("UPDATE repinfo set memo=?, description=?, prio=?, descriptor=?, tablea=?" " WHERE id=?"); for (size_t i = 0; i < cache.size(); ++i) if (!cache[i].memo.empty() && !cache[i].new_memo.empty()) { stm.bind_in(1, cache[i].new_memo.c_str()); stm.bind_in(2, cache[i].new_desc.c_str()); stm.bind_in(3, cache[i].new_prio); stm.bind_in(4, cache[i].new_descriptor.c_str()); stm.bind_in(5, cache[i].new_tablea); stm.bind_in(6, cache[i].id); stm.execute_and_close(); /* commit_cache_item(&(ri->cache[i])); */ ++*updated; } } /* Insert the new items */ if (!newitems.empty()) { Statement stm(*conn); stm.prepare("INSERT INTO repinfo (id, memo, description, prio, descriptor, tablea)" " VALUES (?, ?, ?, ?, ?, ?)"); for (vector::const_iterator i = newitems.begin(); i != newitems.end(); ++i) { stm.bind_in(1, i->id); stm.bind_in(2, i->new_memo.c_str()); stm.bind_in(3, i->new_desc.c_str()); stm.bind_in(4, i->new_prio); stm.bind_in(5, i->new_descriptor.c_str()); stm.bind_in(6, i->new_tablea); stm.execute_and_close(); /* DBA_RUN_OR_GOTO(cleanup, cache_append(ri, id, memo, description, prio, descriptor, tablea)); */ ++*added; } } conn->commit(); /* Reread the cache */ read_cache(); } } // namespace db } // namespace dballe /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/db/odbcworkarounds.h0000644000175000017500000000266011445676541015023 00000000000000/* * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #ifndef DBALLE_DB_ODBC_WORKAROUNDS_H #define DBALLE_DB_ODBC_WORKAROUNDS_H #include /** @file * @ingroup db * * The ODBC specification is imperfect with regards to integer sizes on 64bit * platforms, and different ODBC drivers are currently interpreting it * differently. */ #if __WORDSIZE == 64 #define DBALLE_SQL_C_SINT_TYPE long #define DBALLE_SQL_C_UINT_TYPE unsigned long #define DBALLE_SQL_C_SINT SQL_C_SBIGINT #define DBALLE_SQL_C_UINT SQL_C_UBIGINT #else #define DBALLE_SQL_C_SINT_TYPE long #define DBALLE_SQL_C_UINT_TYPE unsigned long #define DBALLE_SQL_C_SINT SQL_C_SLONG #define DBALLE_SQL_C_UINT SQL_C_ULONG #endif #endif dballe-5.18/dballe/db/attr.h0000644000175000017500000000601611464770730012562 00000000000000/* * db/attr - attr table management * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #ifndef DBALLE_DB_ATTR_H #define DBALLE_DB_ATTR_H /** @file * @ingroup db * * Attribute table management used by the db module. */ #include #include #include #include namespace dballe { struct DB; namespace db { struct Connection; struct Statement; /** * Precompiled queries to manipulate the attr table */ struct Attr { /** DB connection. */ db::Connection& conn; /** Precompiled select statement */ db::Statement* sstm; /** Precompiled insert statement */ db::Statement* istm; /** Precompiled replace statement */ db::Statement* rstm; /** context id SQL parameter */ DBALLE_SQL_C_SINT_TYPE id_context; /** variable id SQL parameter */ wreport::Varcode id_var; /** attribute id SQL parameter */ wreport::Varcode type; /** attribute value SQL parameter */ char value[255]; /** attribute value indicator */ SQLLEN value_ind; Attr(Connection& conn); ~Attr(); /** * Set the input fields using the values in a wreport::Var * * @param var * The Var with the data to copy into ins */ void set(const wreport::Var& var); /** * Set the value input field from a string * * @param value * The value to copy into ins */ void set_value(const char* value); /** * Insert an entry into the attr table * * @param replace * If set to true, an existing attribute with the same context and * wreport::Varcode will be overwritten; else, trying to replace an * existing attribute will result in an error. */ void insert(bool replace); /** * Load from the database all the attributes for var * * @param var * wreport::Var to which the resulting attributes will be added * @return * The error indicator for the function (See @ref error.h) */ void load(wreport::Var& var); /** * Dump the entire contents of the table to an output stream */ void dump(FILE* out); private: // disallow copy Attr(const Attr&); Attr& operator=(const Attr&); }; } // namespace db } // namespace dballe /* vim:set ts=4 sw=4: */ #endif dballe-5.18/dballe/db/repinfo.h0000644000175000017500000001152711461302671013245 00000000000000/* * db/repinfo - repinfo table management * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #ifndef DBALLE_DB_REPINFO_H #define DBALLE_DB_REPINFO_H /** @file * @ingroup db * * Repinfo table management used by the db module. */ #include #include #include namespace dballe { namespace db { struct Connection; namespace repinfo { /** repinfo cache entry */ struct Cache { /** Report code */ DBALLE_SQL_C_UINT_TYPE id; /** Report name */ std::string memo; /** Report description */ std::string desc; /** Report priority */ DBALLE_SQL_C_SINT_TYPE prio; /** Report descriptor (currently unused) */ std::string descriptor; /** Report A table value (currently unused) */ DBALLE_SQL_C_UINT_TYPE tablea; /** New report name used when updating the repinfo table */ std::string new_memo; /** New report description used when updating the repinfo table */ std::string new_desc; /** New report priority used when updating the repinfo table */ DBALLE_SQL_C_SINT_TYPE new_prio; /** New report descriptor used when updating the repinfo table */ std::string new_descriptor; /** New report A table value used when updating the repinfo table */ DBALLE_SQL_C_UINT_TYPE new_tablea; Cache(int id, const std::string& memo, const std::string& desc, int prio, const std::string& descriptor, int tablea); void make_new(); }; /** reverse rep_memo -> rep_cod cache entry */ struct Memoidx { /** Report name */ std::string memo; /** Report code */ int id; bool operator<(const Memoidx& memo) const; }; } /** * Fast cached access to the repinfo table */ struct Repinfo { /** Cache of table entries */ std::vector cache; /** rep_memo -> rep_cod reverse index */ mutable std::vector memo_idx; /** * DB connection. The pointer is assumed always valid during the * lifetime of the object */ Connection* conn; Repinfo(Connection* conn); ~Repinfo(); /** * Invalidate the repinfo cache. To be called if the repinfo table is modified * externally; for example, when the table is recreated on database reset. */ void invalidate_cache(); /** * Update the report type information in the database using the data from the * given file. * * @param ri * dba_db_repinfo used to update the database * @param deffile * Pathname of the file to use for the update. The NULL value is accepted * and means to use the default configure repinfo.csv file. * @retval added * Number of entries that have been added during the update. * @retval deleted * Number of entries that have been deleted during the update. * @retval updated * Number of entries that have been updated during the update. */ void update(const char* deffile, int* added, int* deleted, int* updated); /** * Get the id of a repinfo entry given its name * * @param memo * The name to query * @return * The resulting id. It will always be a valid one, because the functions * fails if memo is not found. */ int get_id(const char* memo) const; /** * Check if the database contains the given rep_cod id * * @param id * id to check * @return * true if id exists, else false. */ bool has_id(unsigned id) const; /** * Get a repinfo cache entry by id. * * @param id * id to query * @return * The Cache structure found, or NULL if none was found. */ const repinfo::Cache* get_by_id(unsigned id) const; /** * Get a repinfo cache entry by name. * * @param memo * name to query * @return * The Cache structure found, or NULL if none was found. */ const repinfo::Cache* get_by_memo(const char* memo) const; protected: void read_cache(); void cache_append(unsigned id, const char* memo, const char* desc, int prio, const char* descriptor, int tablea); void rebuild_memo_idx() const; int cache_find_by_memo(const char* memo) const; int cache_find_by_id(unsigned id) const; std::vector read_repinfo_file(const char* deffile); private: // disallow copy Repinfo(const Repinfo&); Repinfo& operator=(const Repinfo&); }; } // namespace db } // namespace dballe /* vim:set ts=4 sw=4: */ #endif dballe-5.18/dballe/db/querybuf.h0000644000175000017500000000475311445666705013465 00000000000000/* * db/querybuf - Buffer used to build SQL queries * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #ifndef DBA_DB_QUERYBUF_H #define DBA_DB_QUERYBUF_H /** @file * @ingroup db * Implementation of an efficient string buffer for composing database queries */ #include namespace dballe { /// String buffer for composing database queries struct Querybuf : public std::string { bool list_first; char list_sep[10]; /** * @param reserve * Initial preallocated size for the buffer. If this is chosen * wisely, there is no need to reallocate space while composing the * query. */ Querybuf(size_t reserve = 512); ~Querybuf(); /// Reset the querybuf to contain the empty string void clear(); /** * Begin a list of items separated by the given separator. Items are added * using append_list(). * * @param sep * The separator to add between every list item */ void start_list(const char* sep); /** * Append a formatted string to the querybuf * * @param fmt * The string to append, which will be formatted in printf style */ void appendf(const char* fmt, ...) __attribute__((format(printf, 2, 3))); /** * Append a string to the querybuf, as part of a list. * * This function will prepend str with the current list separator, unless it is * the first item added to the list. * * @param str * The string to append */ void append_list(const char* str); /** * Append a formatted string to the querybuf, as part of a list. * * This function will prepend str with the current list separator, unless it is * the first item added to the list. * * @param str * The string to append */ void append_listf(const char* fmt, ...) __attribute__((format(printf, 2, 3))); }; } // namespace dballe #endif dballe-5.18/dballe/db/internals.h0000644000175000017500000001532211634656215013607 00000000000000/* * db/internals - Internal support infrastructure for the DB * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #ifndef DBALLE_DB_INTERNALS_H #define DBALLE_DB_INTERNALS_H /** @file * @ingroup db * * Database functions and data structures used by the db module, but not * exported as official API. */ #include #include #include #include /* * Define to true to enable the use of transactions during writes */ #define DBA_USE_TRANSACTIONS /* Define this to enable referential integrity */ #undef USE_REF_INT namespace dballe { namespace db { /** Trace macros internally used for debugging * @{ */ // #define TRACE_DB #ifdef TRACE_DB #define TRACE(...) fprintf(stderr, __VA_ARGS__) #define IFTRACE if (1) #else /** Ouput a trace message */ #define TRACE(...) do { } while (0) /** Prefix a block of code to compile only if trace is enabled */ #define IFTRACE if (0) #endif /** @} */ // Define this to get warnings when a Statement is closed but its data have not // all been read yet // #define DEBUG_WARN_OPEN_TRANSACTIONS /** * Report an ODBC error, using informations from the ODBC diagnostic record */ struct error_odbc : public wreport::error { std::string msg; /** * Copy informations from the ODBC diagnostic record to the dba error * report */ error_odbc(SQLSMALLINT handleType, SQLHANDLE handle, const std::string& msg); ~error_odbc() throw () {} wreport::ErrorCode code() const throw () { return wreport::WR_ERR_ODBC; } virtual const char* what() const throw () { return msg.c_str(); } static void throwf(SQLSMALLINT handleType, SQLHANDLE handle, const char* fmt, ...) WREPORT_THROWF_ATTRS(3, 4); }; /** * Supported SQL servers. */ enum ServerType { MYSQL, SQLITE, ORACLE, POSTGRES, }; /// ODBC environment struct Environment { SQLHENV od_env; Environment(); ~Environment(); static Environment& get(); private: // disallow copy Environment(const Environment&); Environment& operator=(const Environment&); }; /// Database connection struct Connection { /** ODBC database connection */ SQLHDBC od_conn; /** True if the connection is open */ bool connected; /** Type of SQL server we are connected to */ enum ServerType server_type; Connection(); ~Connection(); void connect(const char* dsn, const char* user, const char* password); void driver_connect(const char* config); std::string driver_name(); void set_autocommit(bool val); /// Commit a transaction void commit(); /// Rollback a transaction void rollback(); protected: void init_after_connect(); private: // disallow copy Connection(const Connection&); Connection& operator=(const Connection&); }; /// RAII transaction struct Transaction { Connection& conn; bool fired; Transaction(Connection& conn) : conn(conn), fired(false) {} ~Transaction() { if (!fired) rollback(); } void commit() { conn.commit(); fired = true; } void rollback() { conn.rollback(); fired = true; } }; /// ODBC statement struct Statement { //Connection& conn; SQLHSTMT stm; /// If non-NULL, ignore all errors with this code const char* ignore_error; #ifdef DEBUG_WARN_OPEN_TRANSACTIONS /// Debugging aids: dump query to stderr if destructor is called before fetch returned SQL_NO_DATA std::string debug_query; bool debug_reached_completion; #endif Statement(Connection& conn); ~Statement(); void bind_in(int idx, const DBALLE_SQL_C_SINT_TYPE& val); void bind_in(int idx, const DBALLE_SQL_C_SINT_TYPE& val, const SQLLEN& ind); void bind_in(int idx, const DBALLE_SQL_C_UINT_TYPE& val); void bind_in(int idx, const DBALLE_SQL_C_UINT_TYPE& val, const SQLLEN& ind); void bind_in(int idx, const unsigned short& val); void bind_in(int idx, const char* val); void bind_in(int idx, const char* val, const SQLLEN& ind); void bind_in(int idx, const SQL_TIMESTAMP_STRUCT& val); void bind_out(int idx, DBALLE_SQL_C_SINT_TYPE& val); void bind_out(int idx, DBALLE_SQL_C_SINT_TYPE& val, SQLLEN& ind); void bind_out(int idx, DBALLE_SQL_C_UINT_TYPE& val); void bind_out(int idx, DBALLE_SQL_C_UINT_TYPE& val, SQLLEN& ind); void bind_out(int idx, unsigned short& val); void bind_out(int idx, char* val, SQLLEN buflen); void bind_out(int idx, char* val, SQLLEN buflen, SQLLEN& ind); void bind_out(int idx, SQL_TIMESTAMP_STRUCT& val); void prepare(const char* query); void prepare(const char* query, int qlen); /// @return SQLExecute's result int execute(); /// @return SQLExecute's result int exec_direct(const char* query); /// @return SQLExecute's result int exec_direct(const char* query, int qlen); /// @return SQLExecute's result int execute_and_close(); /// @return SQLExecute's result int exec_direct_and_close(const char* query); /// @return SQLExecute's result int exec_direct_and_close(const char* query, int qlen); /** * @return the number of columns in the result set (or 0 if the statement * did not return columns) */ int columns_count(); bool fetch(); bool fetch_expecting_one(); void close_cursor(); size_t rowcount(); void set_cursor_forward_only(); protected: bool error_is_ignored(); bool is_error(int sqlres); private: // disallow copy Statement(const Statement&); Statement& operator=(const Statement&); }; /// ODBC statement to read a sequence struct Sequence : public Statement { DBALLE_SQL_C_SINT_TYPE out; Sequence(Connection& conn, const char* name); ~Sequence(); /// Read the current value of the sequence const DBALLE_SQL_C_SINT_TYPE& read(); private: // disallow copy Sequence(const Sequence&); Sequence& operator=(const Sequence&); }; /// Return the default repinfo file pathname const char* default_repinfo_file(); } // namespace db } // namespace dballe /* vim:set ts=4 sw=4: */ #endif dballe-5.18/dballe/db/db.cc0000644000175000017500000013250211754230676012335 00000000000000/* * dballe/db - Archive for point-based meteorological data * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "db.h" #include "internals.h" #include "repinfo.h" #include "station.h" #include "context.h" #include "data.h" #include "cursor.h" #include "attr.h" #include #include #include #include #include #include #include #include using namespace std; using namespace wreport; namespace dballe { /* * Database init queries */ static const char* init_tables[] = { // Delete 'pseudoana' to clean up pre-5.0 databases "attr", "data", "context", "station", "repinfo", "pseudoana" }; static const char* init_sequences[] = { // Delete 'seq_pseudoana' to clean up pre-5.0 databases "seq_context", "seq_station", "seq_pseudoana" }; static const char* init_functions[] = { /* "identity (val anyelement, val1 anyelement)", */ }; #ifdef DBA_USE_TRANSACTIONS #define TABLETYPE "TYPE=InnoDB;" #else #define TABLETYPE ";" #endif static const char* init_queries_mysql[] = { "CREATE TABLE repinfo (" " id SMALLINT PRIMARY KEY," " memo VARCHAR(20) NOT NULL," " description VARCHAR(255) NOT NULL," " prio INTEGER NOT NULL," " descriptor CHAR(6) NOT NULL," " tablea INTEGER NOT NULL," " UNIQUE INDEX (prio)," " UNIQUE INDEX (memo)" ") " TABLETYPE, "CREATE TABLE station (" " id INTEGER auto_increment PRIMARY KEY," " lat INTEGER NOT NULL," " lon INTEGER NOT NULL," " ident CHAR(64)," " UNIQUE INDEX(lat, lon, ident(8))," " INDEX(lon)" ") " TABLETYPE, "CREATE TABLE context (" " id INTEGER auto_increment PRIMARY KEY," " id_ana INTEGER NOT NULL," " id_report SMALLINT NOT NULL," " datetime DATETIME NOT NULL," " ltype1 INTEGER NOT NULL," " l1 INTEGER NOT NULL," " ltype2 INTEGER NOT NULL," " l2 INTEGER NOT NULL," " ptype INTEGER NOT NULL," " p1 INTEGER NOT NULL," " p2 INTEGER NOT NULL," " UNIQUE INDEX (id_ana, datetime, ltype1, l1, ltype2, l2, ptype, p1, p2, id_report)," " INDEX (id_ana)," " INDEX (id_report)," " INDEX (datetime)," " INDEX (ltype1, l1, ltype2, l2)," " INDEX (ptype, p1, p2)" #ifdef USE_REF_INT " , FOREIGN KEY (id_ana) REFERENCES station (id) ON DELETE CASCADE," " FOREIGN KEY (id_report) REFERENCES repinfo (id) ON DELETE CASCADE" #endif ") " TABLETYPE, "CREATE TABLE data (" " id_context INTEGER NOT NULL," " id_var SMALLINT NOT NULL," " value VARCHAR(255) NOT NULL," " INDEX (id_context)," " UNIQUE INDEX(id_var, id_context)" #ifdef USE_REF_INT " , FOREIGN KEY (id_context) REFERENCES context (id) ON DELETE CASCADE" #endif ") " TABLETYPE, "CREATE TABLE attr (" " id_context INTEGER NOT NULL," " id_var SMALLINT NOT NULL," " type SMALLINT NOT NULL," " value VARCHAR(255) NOT NULL," " INDEX (id_context, id_var)," " UNIQUE INDEX (id_context, id_var, type)" #ifdef USE_REF_INT " , FOREIGN KEY (id_context, id_var) REFERENCES data (id_context, id_var) ON DELETE CASCADE" #endif ") " TABLETYPE, }; static const char* init_queries_postgres[] = { "CREATE TABLE repinfo (" " id INTEGER PRIMARY KEY," " memo VARCHAR(30) NOT NULL," " description VARCHAR(255) NOT NULL," " prio INTEGER NOT NULL," " descriptor CHAR(6) NOT NULL," " tablea INTEGER NOT NULL" ") ", "CREATE UNIQUE INDEX ri_memo_uniq ON repinfo(memo)", "CREATE UNIQUE INDEX ri_prio_uniq ON repinfo(prio)", "CREATE SEQUENCE seq_station", "CREATE TABLE station (" " id INTEGER PRIMARY KEY," " lat INTEGER NOT NULL," " lon INTEGER NOT NULL," " ident VARCHAR(64)" ") ", "CREATE UNIQUE INDEX pa_uniq ON station(lat, lon, ident)", "CREATE INDEX pa_lon ON station(lon)", "CREATE SEQUENCE seq_context", "CREATE TABLE context (" " id SERIAL PRIMARY KEY," " id_ana INTEGER NOT NULL," " id_report INTEGER NOT NULL," " datetime TIMESTAMP NOT NULL," " ltype1 INTEGER NOT NULL," " l1 INTEGER NOT NULL," " ltype2 INTEGER NOT NULL," " l2 INTEGER NOT NULL," " ptype INTEGER NOT NULL," " p1 INTEGER NOT NULL," " p2 INTEGER NOT NULL" #ifdef USE_REF_INT " , FOREIGN KEY (id_ana) REFERENCES station (id) ON DELETE CASCADE," " FOREIGN KEY (id_report) REFERENCES repinfo (id) ON DELETE CASCADE" #endif ") ", "CREATE UNIQUE INDEX co_uniq ON context(id_ana, datetime, ltype1, l1, ltype2, l2, ptype, p1, p2, id_report)", "CREATE INDEX co_ana ON context(id_ana)", "CREATE INDEX co_report ON context(id_report)", "CREATE INDEX co_dt ON context(datetime)", "CREATE INDEX co_lt ON context(ltype1, l1, ltype2, l2)", "CREATE INDEX co_pt ON context(ptype, p1, p2)", "CREATE TABLE data (" " id_context INTEGER NOT NULL," " id_var INTEGER NOT NULL," " value VARCHAR(255) NOT NULL" #ifdef USE_REF_INT " , FOREIGN KEY (id_context) REFERENCES context (id) ON DELETE CASCADE" #endif ") ", /* * Not a good idea: it works on ALL inserts, even on those that should fail "CREATE RULE data_insert_or_update AS " " ON INSERT TO data " " WHERE (new.id_context, new.id_var) IN ( " " SELECT id_context, id_var " " FROM data " " WHERE id_context=new.id_context AND id_var=new.id_var) " " DO INSTEAD " " UPDATE data SET value=new.value " " WHERE id_context=new.id_context AND id_var=new.id_var", */ "CREATE INDEX da_co ON data(id_context)", "CREATE UNIQUE INDEX da_uniq ON data(id_var, id_context)", "CREATE TABLE attr (" " id_context INTEGER NOT NULL," " id_var INTEGER NOT NULL," " type INTEGER NOT NULL," " value VARCHAR(255) NOT NULL" #ifdef USE_REF_INT " , FOREIGN KEY (id_context, id_var) REFERENCES data (id_context, id_var) ON DELETE CASCADE" #endif ") ", "CREATE INDEX at_da ON attr(id_context, id_var)", "CREATE UNIQUE INDEX at_uniq ON attr(id_context, id_var, type)", /*"CREATE FUNCTION identity (val anyelement, val1 anyelement, OUT val anyelement) AS 'select $2' LANGUAGE sql STRICT", "CREATE AGGREGATE anyval ( basetype=anyelement, sfunc='identity', stype='anyelement' )",*/ }; static const char* init_queries_sqlite[] = { "CREATE TABLE repinfo (" " id INTEGER PRIMARY KEY," " memo VARCHAR(30) NOT NULL," " description VARCHAR(255) NOT NULL," " prio INTEGER NOT NULL," " descriptor CHAR(6) NOT NULL," " tablea INTEGER NOT NULL," " UNIQUE (prio)," " UNIQUE (memo)" ") ", "CREATE TABLE station (" " id INTEGER PRIMARY KEY," " lat INTEGER NOT NULL," " lon INTEGER NOT NULL," " ident CHAR(64)," " UNIQUE (lat, lon, ident)" ") ", "CREATE INDEX pa_lon ON station(lon)", "CREATE TABLE context (" " id INTEGER PRIMARY KEY," " id_ana INTEGER NOT NULL," " id_report INTEGER NOT NULL," " datetime TEXT NOT NULL," " ltype1 INTEGER NOT NULL," " l1 INTEGER NOT NULL," " ltype2 INTEGER NOT NULL," " l2 INTEGER NOT NULL," " ptype INTEGER NOT NULL," " p1 INTEGER NOT NULL," " p2 INTEGER NOT NULL," " UNIQUE (id_ana, datetime, ltype1, l1, ltype2, l2, ptype, p1, p2, id_report)" #ifdef USE_REF_INT " , FOREIGN KEY (id_ana) REFERENCES station (id) ON DELETE CASCADE," " FOREIGN KEY (id_report) REFERENCES repinfo (id) ON DELETE CASCADE" #endif ") ", "CREATE INDEX co_ana ON context(id_ana)", "CREATE INDEX co_report ON context(id_report)", "CREATE INDEX co_dt ON context(datetime)", "CREATE INDEX co_lt ON context(ltype1, l1, ltype2, l2)", "CREATE INDEX co_pt ON context(ptype, p1, p2)", "CREATE TABLE data (" " id_context INTEGER NOT NULL," " id_var INTEGER NOT NULL," " value VARCHAR(255) NOT NULL," " UNIQUE (id_var, id_context)" #ifdef USE_REF_INT " , FOREIGN KEY (id_context) REFERENCES context (id) ON DELETE CASCADE" #endif ") ", "CREATE INDEX da_co ON data(id_context)", "CREATE TABLE attr (" " id_context INTEGER NOT NULL," " id_var INTEGER NOT NULL," " type INTEGER NOT NULL," " value VARCHAR(255) NOT NULL," " UNIQUE (id_context, id_var, type)" #ifdef USE_REF_INT " , FOREIGN KEY (id_context, id_var) REFERENCES data (id_context, id_var) ON DELETE CASCADE" #endif ") ", "CREATE INDEX at_da ON attr(id_context, id_var)", }; static const char* init_queries_oracle[] = { "CREATE TABLE repinfo (" " id INTEGER PRIMARY KEY," " memo VARCHAR2(30) NOT NULL," " description VARCHAR2(255) NOT NULL," " prio INTEGER NOT NULL," " descriptor CHAR(6) NOT NULL," " tablea INTEGER NOT NULL," " UNIQUE (prio)," " UNIQUE (memo)" ") ", "CREATE TABLE station (" " id INTEGER PRIMARY KEY," " lat INTEGER NOT NULL," " lon INTEGER NOT NULL," " ident VARCHAR2(64)," " UNIQUE (lat, lon, ident)" ") ", "CREATE INDEX pa_lon ON station(lon)", "CREATE SEQUENCE seq_station", "CREATE TABLE context (" " id INTEGER PRIMARY KEY," " id_ana INTEGER NOT NULL," " id_report INTEGER NOT NULL," " datetime DATE NOT NULL," " ltype1 INTEGER NOT NULL," " l1 INTEGER NOT NULL," " ltype2 INTEGER NOT NULL," " l2 INTEGER NOT NULL," " ptype INTEGER NOT NULL," " p1 INTEGER NOT NULL," " p2 INTEGER NOT NULL," " UNIQUE (id_ana, datetime, ltype1, l1, ltype2, l2, ptype, p1, p2, id_report)" #ifdef USE_REF_INT " , FOREIGN KEY (id_ana) REFERENCES station (id) ON DELETE CASCADE," " FOREIGN KEY (id_report) REFERENCES repinfo (id) ON DELETE CASCADE" #endif ") ", "CREATE INDEX co_ana ON context(id_ana)", "CREATE INDEX co_report ON context(id_report)", "CREATE INDEX co_dt ON context(datetime)", "CREATE INDEX co_lt ON context(ltype1, l1, ltype2, l2)", "CREATE INDEX co_pt ON context(ptype, p1, p2)", "CREATE SEQUENCE seq_context", "CREATE TABLE data (" " id_context INTEGER NOT NULL," " id_var INTEGER NOT NULL," " value VARCHAR2(255) NOT NULL," " UNIQUE (id_var, id_context)" #ifdef USE_REF_INT " , FOREIGN KEY (id_context) REFERENCES context (id) ON DELETE CASCADE" #endif ") ", "CREATE INDEX da_co ON data(id_context)", "CREATE TABLE attr (" " id_context INTEGER NOT NULL," " id_var INTEGER NOT NULL," " type INTEGER NOT NULL," " value VARCHAR2(255) NOT NULL," " UNIQUE (id_context, id_var, type)" #ifdef USE_REF_INT " , FOREIGN KEY (id_context, id_var) REFERENCES data (id_context, id_var) ON DELETE CASCADE" #endif ") ", "CREATE INDEX at_da ON attr(id_context, id_var)", }; /* * DB implementation */ // First part of initialising a dba_db DB::DB() : conn(0), m_repinfo(0), m_station(0), m_context(0), m_data(0), m_attr(0), stm_last_insert_id(0), seq_station(0), seq_context(0) { /* Allocate the ODBC connection handle */ conn = new db::Connection; /* Set the connection timeout */ /* SQLSetConnectAttr(pc.od_conn, SQL_LOGIN_TIMEOUT, (SQLPOINTER *)5, 0); */ } DB::~DB() { if (m_attr) delete m_attr; if (m_data) delete m_data; if (m_context) delete m_context; if (m_station) delete m_station; if (m_repinfo) delete m_repinfo; if (seq_context) delete seq_context; if (seq_station) delete seq_station; if (stm_last_insert_id) delete stm_last_insert_id; if (conn) delete conn; } #if 0 void dba_db_delete(dba_db db) { assert(db); if (db->attr != NULL) dba_db_attr_delete(db->attr); if (db->data != NULL) dba_db_data_delete(db->data); if (db->context != NULL) dba_db_context_delete(db->context); if (db->station != NULL) dba_db_station_delete(db->station); } #endif void DB::connect(const char* dsn, const char* user, const char* password) { /* Connect to the DSN */ conn->connect(dsn, user, password); init_after_connect(); } void DB::connect_generic(const char* config) { conn->driver_connect(config); init_after_connect(); } void DB::connect_from_file(const char* pathname) { // Access sqlite file directly string buf; if (pathname[0] != '/') { char cwd[PATH_MAX]; buf = "Driver=SQLite3;Database="; buf += getcwd(cwd, PATH_MAX); buf += "/"; buf += pathname; buf += ";"; } else { buf = "Driver=SQLite3;Database="; buf += pathname; buf += ";"; } connect_generic(buf.c_str()); } void DB::connect_test() { const char* envurl = getenv("DBA_DB"); if (envurl != NULL) connect_from_url(envurl); else connect_from_file("test.sqlite"); } void DB::connect_from_url(const char* url) { if (strncmp(url, "sqlite://", 9) == 0) { connect_from_file(url + 9); return; } if (strncmp(url, "sqlite:", 7) == 0) { connect_from_file(url + 7); return; } if (strncmp(url, "odbc://", 7) == 0) { string buf(url + 7); size_t pos = buf.find('@'); if (pos == string::npos) { connect(buf.c_str(), "", ""); // odbc://dsn return; } // Split the string at '@' string userpass = buf.substr(0, pos); string dsn = buf.substr(pos + 1); pos = userpass.find(':'); if (pos == string::npos) { connect(dsn.c_str(), userpass.c_str(), ""); // odbc://user@dsn return; } string user = userpass.substr(0, pos); string pass = userpass.substr(pos + 1); connect(dsn.c_str(), user.c_str(), pass.c_str()); // odbc://user:pass@dsn return; } if (strncmp(url, "test:", 5) == 0) { connect_test(); return; } error_consistency::throwf("unknown url \"%s\"", url); } bool DB::is_url(const char* str) { if (strncmp(str, "sqlite:", 7) == 0) return true; if (strncmp(str, "odbc://", 7) == 0) return true; if (strncmp(str, "test:", 5) == 0) return true; return false; } db::Repinfo& DB::repinfo() { if (m_repinfo == NULL) m_repinfo = new db::Repinfo(conn); return *m_repinfo; } db::Station& DB::station() { if (m_station == NULL) m_station = new db::Station(*this); return *m_station; } db::Context& DB::context() { if (m_context == NULL) m_context = new db::Context(*this); return *m_context; } db::Data& DB::data() { if (m_data == NULL) m_data = new db::Data(*conn); return *m_data; } db::Attr& DB::attr() { if (m_attr == NULL) m_attr = new db::Attr(*conn); return *m_attr; } void DB::init_after_connect() { #ifdef DBA_USE_TRANSACTIONS /* Set manual commit */ if (conn->server_type == db::SQLITE) { if (getenv("DBA_INSECURE_SQLITE") != NULL) { run_sql("PRAGMA synchronous = OFF"); run_sql("PRAGMA journal_mode = OFF"); run_sql("PRAGMA legacy_file_format = 0"); } else { run_sql("PRAGMA journal_mode = MEMORY"); run_sql("PRAGMA legacy_file_format = 0"); } } else conn->set_autocommit(false); #endif switch (conn->server_type) { case db::ORACLE: case db::POSTGRES: seq_station = new db::Sequence(*conn, "seq_station"); seq_context = new db::Sequence(*conn, "seq_context"); break; case db::MYSQL: stm_last_insert_id = new db::Statement(*conn); stm_last_insert_id->bind_out(1, m_last_insert_id); stm_last_insert_id->prepare("SELECT LAST_INSERT_ID()"); break; case db::SQLITE: stm_last_insert_id = new db::Statement(*conn); stm_last_insert_id->bind_out(1, m_last_insert_id); stm_last_insert_id->prepare("SELECT LAST_INSERT_ROWID()"); break; } } void DB::run_sql(const char* query) { db::Statement stm(*conn); stm.exec_direct(query); } #define DBA_ODBC_MISSING_TABLE_POSTGRES "42P01" #define DBA_ODBC_MISSING_TABLE_MYSQL "42S01" #define DBA_ODBC_MISSING_TABLE_SQLITE "HY000" #define DBA_ODBC_MISSING_TABLE_ORACLE "42S02" void DB::drop_table_if_exists(const char* name) { db::Statement stm(*conn); char buf[100]; int len; if (conn->server_type == db::MYSQL) { len = snprintf(buf, 100, "DROP TABLE IF EXISTS %s", name); stm.exec_direct_and_close(buf, len); } else { switch (conn->server_type) { case db::MYSQL: stm.ignore_error = DBA_ODBC_MISSING_TABLE_MYSQL; break; case db::SQLITE: stm.ignore_error = DBA_ODBC_MISSING_TABLE_SQLITE; break; case db::ORACLE: stm.ignore_error = DBA_ODBC_MISSING_TABLE_ORACLE; break; case db::POSTGRES: stm.ignore_error = DBA_ODBC_MISSING_TABLE_POSTGRES; break; default: stm.ignore_error = DBA_ODBC_MISSING_TABLE_POSTGRES; break; } len = snprintf(buf, 100, "DROP TABLE %s", name); stm.exec_direct_and_close(buf, len); } conn->commit(); } #define DBA_ODBC_MISSING_SEQUENCE_ORACLE "HY000" #define DBA_ODBC_MISSING_SEQUENCE_POSTGRES "42P01" void DB::drop_sequence_if_exists(const char* name) { const char* ignore_code; switch (conn->server_type) { case db::ORACLE: ignore_code = DBA_ODBC_MISSING_SEQUENCE_ORACLE; break; case db::POSTGRES: ignore_code = DBA_ODBC_MISSING_SEQUENCE_POSTGRES; break; default: // No sequences in MySQL, SQLite or unknown databases return; } db::Statement stm(*conn); stm.ignore_error = ignore_code; char buf[100]; int len = snprintf(buf, 100, "DROP SEQUENCE %s", name); stm.exec_direct(buf, len); conn->commit(); } #define DBA_ODBC_MISSING_FUNCTION_POSTGRES "42883" void DB::delete_tables() { /* Drop existing tables */ for (size_t i = 0; i < sizeof(init_tables) / sizeof(init_tables[0]); ++i) drop_table_if_exists(init_tables[i]); /* Drop existing sequences */ for (size_t i = 0; i < sizeof(init_sequences) / sizeof(init_sequences[0]); ++i) drop_sequence_if_exists(init_sequences[i]); #if 0 /* Allocate statement handle */ DBA_RUN_OR_GOTO(cleanup, dba_db_statement_create(db, &stm)); /* Drop existing functions */ for (i = 0; i < sizeof(init_functions) / sizeof(init_functions[0]); i++) { char buf[200]; int len; switch (db->server_type) { case MYSQL: case SQLITE: case ORACLE: /* No functions used by MySQL, SQLite and Oracle */ break; case POSTGRES: len = snprintf(buf, 100, "DROP FUNCTION %s CASCADE", init_functions[i]); res = SQLExecDirect(stm, (unsigned char*)buf, len); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { err = dba_db_error_odbc_except(DBA_ODBC_MISSING_FUNCTION_POSTGRES, SQL_HANDLE_STMT, stm, "Removing old function %s", init_functions[i]); if (err != DBA_OK) goto cleanup; } DBA_RUN_OR_GOTO(cleanup, dba_db_commit(db)); break; default: /* No sequences in unknown databases */ break; } } #endif } void DB::reset(const char* repinfo_file) { /* Open the input CSV file */ /* FILE* in = fopen(repinfo_file, "r"); if (in == NULL) return dba_error_system("opening file %s", repinfo_file); */ /* Drop existing tables */ delete_tables(); /* Invalidate the repinfo cache if we have a repinfo structure active */ if (m_repinfo) m_repinfo->invalidate_cache(); /* Allocate statement handle */ db::Statement stm(*conn); const char** queries = NULL; int query_count = 0; switch (conn->server_type) { case db::MYSQL: queries = init_queries_mysql; query_count = sizeof(init_queries_mysql) / sizeof(init_queries_mysql[0]); break; case db::SQLITE: queries = init_queries_sqlite; query_count = sizeof(init_queries_sqlite) / sizeof(init_queries_sqlite[0]); break; case db::ORACLE: queries = init_queries_oracle; query_count = sizeof(init_queries_oracle) / sizeof(init_queries_oracle[0]); break; case db::POSTGRES: queries = init_queries_postgres; query_count = sizeof(init_queries_postgres) / sizeof(init_queries_postgres[0]); break; default: queries = init_queries_postgres; query_count = sizeof(init_queries_postgres) / sizeof(init_queries_postgres[0]); break; } /* Create tables */ for (int i = 0; i < query_count; i++) stm.exec_direct_and_close(queries[i]); /* Populate the tables with values */ { int added, deleted, updated; repinfo().update(repinfo_file, &added, &deleted, &updated); /* fprintf(stderr, "%d added, %d deleted, %d updated\n", added, deleted, updated); */ /* DBALLE_SQL_C_UINT_TYPE id; char memo[30]; char description[255]; DBALLE_SQL_C_UINT_TYPE prio; char descriptor[6]; DBALLE_SQL_C_UINT_TYPE tablea; int i; char* columns[7]; int line; res = SQLPrepare(stm, (unsigned char*) "INSERT INTO repinfo (id, memo, description, prio, descriptor, tablea)" " VALUES (?, ?, ?, ?, ?, ?)", SQL_NTS); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { err = dba_db_error_odbc(SQL_HANDLE_STMT, stm, "compiling query to insert into 'repinfo'"); goto cleanup; } SQLBindParameter(stm, 1, SQL_PARAM_INPUT, DBALLE_SQL_C_SINT, SQL_INTEGER, 0, 0, &id, 0, 0); SQLBindParameter(stm, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 0, 0, memo, 0, 0); SQLBindParameter(stm, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 0, 0, description, 0, 0); SQLBindParameter(stm, 4, SQL_PARAM_INPUT, DBALLE_SQL_C_SINT, SQL_INTEGER, 0, 0, &prio, 0, 0); SQLBindParameter(stm, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 0, 0, descriptor, 0, 0); SQLBindParameter(stm, 6, SQL_PARAM_INPUT, DBALLE_SQL_C_SINT, SQL_INTEGER, 0, 0, &tablea, 0, 0); for (line = 0; (i = dba_csv_read_next(in, columns, 7)) != 0; line++) { if (i != 6) { err = dba_error_parse(repinfo_file, line, "Expected 6 columns, got %d", i); goto cleanup; } id = strtol(columns[0], 0, 10); strncpy(memo, columns[1], 30); memo[29] = 0; strncpy(description, columns[2], 255); description[254] = 0; prio = strtol(columns[3], 0, 10); strncpy(descriptor, columns[4], 6); descriptor[5] = 0; tablea = strtol(columns[5], 0, 10); res = SQLExecute(stm); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { err = dba_db_error_odbc(SQL_HANDLE_STMT, stm, "inserting new data into 'repinfo'"); goto cleanup; } for (i = 0; i < 6; i++) free(columns[i]); } */ } conn->commit(); } void DB::update_repinfo(const char* repinfo_file, int* added, int* deleted, int* updated) { repinfo().update(repinfo_file, added, deleted, updated); } int DB::get_rep_cod(Record& rec) { db::Repinfo& ri = repinfo(); if (const char* memo = rec.key_peek_value(DBA_KEY_REP_MEMO)) { int id = ri.get_id(memo); rec.key(DBA_KEY_REP_COD).seti(id); return id; } else if (const Var* var = rec.key_peek(DBA_KEY_REP_COD)) { int id = var->enqi(); if (!ri.has_id(id)) error_notfound::throwf("rep_cod %d does not exist in the database", id); return id; } else throw error_notfound("input record has neither rep_cod nor rep_memo"); } int DB::rep_cod_from_memo(const char* memo) { return repinfo().get_id(memo); } const std::string& DB::rep_memo_from_cod(int rep_cod) { const db::repinfo::Cache* c = repinfo().get_by_id(rep_cod); if (c == NULL) error_notfound::throwf("looking for rep_memo corresponding to rep_cod '%d'", rep_cod); return c->memo; } bool DB::check_rep_cod(int rep_cod) { return repinfo().has_id(rep_cod); } #if 0 static dba_err update_station_extra_info(dba_db db, dba_record rec, int id_ana) { dba_var var; /* Don't do anything if rec doesn't have any extra data */ if ( dba_record_key_peek_value(rec, DBA_KEY_HEIGHT) == NULL && dba_record_key_peek_value(rec, DBA_KEY_HEIGHTBARO) == NULL && dba_record_key_peek_value(rec, DBA_KEY_NAME) == NULL && dba_record_key_peek_value(rec, DBA_KEY_BLOCK) == NULL && dba_record_key_peek_value(rec, DBA_KEY_STATION) == NULL) return dba_error_ok(); /* Get the id of the ana context */ db->context->id_ana = id_ana; db->context->id_report = -1; DBA_RUN_OR_RETURN(dba_db_context_obtain_ana(db->context, &(db->data->id_context))); /* Insert or update the data that we find in record */ if ((var = dba_record_key_peek(rec, DBA_KEY_BLOCK)) != NULL) { db->data->id_var = DBA_VAR(0, 1, 1); dba_db_data_set_value(db->data, dba_var_value(var)); DBA_RUN_OR_RETURN(dba_db_data_insert(db->data, 1)); } if ((var = dba_record_key_peek(rec, DBA_KEY_STATION)) != NULL) { db->data->id_var = DBA_VAR(0, 1, 2); dba_db_data_set_value(db->data, dba_var_value(var)); DBA_RUN_OR_RETURN(dba_db_data_insert(db->data, 1)); } if ((var = dba_record_key_peek(rec, DBA_KEY_NAME)) != NULL) { db->data->id_var = DBA_VAR(0, 1, 19); dba_db_data_set_value(db->data, dba_var_value(var)); DBA_RUN_OR_RETURN(dba_db_data_insert(db->data, 1)); } if ((var = dba_record_key_peek(rec, DBA_KEY_HEIGHT)) != NULL) { db->data->id_var = DBA_VAR(0, 7, 1); dba_db_data_set_value(db->data, dba_var_value(var)); DBA_RUN_OR_RETURN(dba_db_data_insert(db->data, 1)); } if ((var = dba_record_key_peek(rec, DBA_KEY_HEIGHTBARO)) != NULL) { db->data->id_var = DBA_VAR(0, 7, 31); dba_db_data_set_value(db->data, dba_var_value(var)); DBA_RUN_OR_RETURN(dba_db_data_insert(db->data, 1)); } return dba_error_ok(); } #endif int DB::last_station_insert_id() { if (seq_station) return seq_station->read(); else { stm_last_insert_id->execute(); if (!stm_last_insert_id->fetch_expecting_one()) throw error_consistency("no last insert ID value returned from database"); return m_last_insert_id; } } int DB::last_context_insert_id() { if (seq_context) return seq_context->read(); else { stm_last_insert_id->execute(); if (!stm_last_insert_id->fetch_expecting_one()) throw error_consistency("no last insert ID value returned from database"); return m_last_insert_id; } } // Normalise longitude values to the [-180..180[ interval static inline int normalon(int lon) { return ((lon + 18000000) % 36000000) - 18000000; } int DB::obtain_station(Record& rec, bool can_add) { // Look if the record already knows the ID if (const char* val = rec.key_peek_value(DBA_KEY_ANA_ID)) return strtol(val, 0, 10); db::Station& s = station(); // Look for the key data in the record if (const Var* var = rec.key_peek(DBA_KEY_LAT)) s.lat = var->enqi(); else throw error_notfound("no latitude in record when trying to insert a station in the database"); if (const Var* var = rec.key_peek(DBA_KEY_LON)) s.lon = normalon(var->enqi()); else throw error_notfound("no longitude in record when trying to insert a station in the database"); s.set_ident(NULL); if (const Var* var = rec.key_peek(DBA_KEY_MOBILE)) if (var->enqi()) { if (const char* val = rec.key_peek_value(DBA_KEY_IDENT)) s.set_ident(val); else throw error_notfound("no mobile station identifier in record when trying to insert a mobile station in the database"); } // Check for an existing station with these data int id = s.get_id(); /* If not found, insert a new one */ if (id == -1) { if (can_add) id = s.insert(); else throw error_consistency("trying to insert a station entry when it is forbidden"); } // Set the new ana_id in the record rec.key(DBA_KEY_ANA_ID).seti(id); return id; } int DB::obtain_context(Record& rec) { // Look if the record already knows the ID if (const char* val = rec.key_peek_value(DBA_KEY_CONTEXT_ID)) return strtol(val, 0, 10); db::Context& c = context(); /* Retrieve data */ c.id_station = obtain_station(rec, false); /* Get the ID of the report */ c.id_report = get_rep_cod(rec); /* Also input the seconds, defaulting to 0 if not found */ const Var* year = rec.key_peek(DBA_KEY_YEAR); const Var* month = rec.key_peek(DBA_KEY_MONTH); const Var* day = rec.key_peek(DBA_KEY_DAY); const Var* hour = rec.key_peek(DBA_KEY_HOUR); const Var* min = rec.key_peek(DBA_KEY_MIN); const Var* sec = rec.key_peek(DBA_KEY_SEC); /* Datetime needs to be computed */ if (year && month && day && hour && min) { c.date.year = year->enqi(); c.date.month = month->enqi(); c.date.day = day->enqi(); c.date.hour = hour->enqi(); c.date.minute = min->enqi(); c.date.second = sec ? sec->enqi() : 0; } else throw error_notfound("datetime informations not found among context information"); if (const Var* var = rec.key_peek(DBA_KEY_LEVELTYPE1)) c.ltype1 = var->enqi(); else c.ltype1 = MISSING_INT; if (const Var* var = rec.key_peek(DBA_KEY_L1)) c.l1 = var->enqi(); else c.l1 = MISSING_INT; if (const Var* var = rec.key_peek(DBA_KEY_LEVELTYPE2)) c.ltype2 = var->enqi(); else c.ltype2 = MISSING_INT; if (const Var* var = rec.key_peek(DBA_KEY_L2)) c.l2 = var->enqi(); else c.l2 = MISSING_INT; if (const Var* var = rec.key_peek(DBA_KEY_PINDICATOR)) c.pind = var->enqi(); else c.pind = MISSING_INT; if (const Var* var = rec.key_peek(DBA_KEY_P1)) c.p1 = var->enqi(); else c.p1 = MISSING_INT; if (const Var* var = rec.key_peek(DBA_KEY_P2)) c.p2 = var->enqi(); else c.p2 = MISSING_INT; // Check for an existing context with these data int id = c.get_id(); /* If there is an existing record, use its ID and don't do an INSERT */ if (id == -1) id = c.insert(); // Set the new context id in the record rec.key(DBA_KEY_CONTEXT_ID).seti(id); return id; } void DB::insert(Record& rec, bool can_replace, bool station_can_add) { db::Data& d = data(); /* Check for the existance of non-context data, otherwise it's all * useless. Not inserting data is fine in case of setcontextana */ const char* s_year; if (rec.vars().empty() && !(((s_year = rec.key_peek_value(DBA_KEY_YEAR)) != NULL) && strcmp(s_year, "1000") == 0)) throw error_notfound("no variables found in input record"); db::Transaction t(*conn); // Insert the station data, and get the ID int id_station = obtain_station(rec, station_can_add); // Insert the context data, and get the ID d.id_context = obtain_context(rec); // Insert all the variables we find for (vector::const_iterator i = rec.vars().begin(); i != rec.vars().end(); ++i) { /* Datum to be inserted, linked to id_station and all the other IDs */ d.set(**i); if (can_replace) d.insert_or_overwrite(); else d.insert_or_fail(); } t.commit(); } void DB::remove(const Record& rec) { db::Transaction t(*conn); db::Cursor c(*this); // Compile the DELETE query for the data db::Statement stmd(*conn); stmd.bind_in(1, c.out_context_id); stmd.bind_in(2, c.out_varcode); stmd.prepare("DELETE FROM data WHERE id_context=? AND id_var=?"); // Compile the DELETE query for the attributes db::Statement stma(*conn); stma.bind_in(1, c.out_context_id); stma.bind_in(2, c.out_varcode); stma.prepare("DELETE FROM attr WHERE id_context=? AND id_var=?"); // Get the list of data to delete c.query(rec, DBA_DB_WANT_CONTEXT_ID | DBA_DB_WANT_VAR_NAME, DBA_DB_MODIFIER_UNSORTED | DBA_DB_MODIFIER_STREAM); /* Iterate all the results, deleting them */ while (c.next()) { stmd.execute_and_close(); stma.execute_and_close(); } t.commit(); } void DB::remove_orphans() { static const char* cclean_mysql = "delete c from context c left join data d on d.id_context = c.id where d.id_context is NULL"; static const char* pclean_mysql = "delete p from station p left join context c on c.id_ana = p.id where c.id is NULL"; static const char* cclean_sqlite = "delete from context where id in (select c.id from context c left join data d on d.id_context = c.id where d.id_context is NULL)"; static const char* pclean_sqlite = "delete from station where id in (select p.id from station p left join context c on c.id_ana = p.id where c.id is NULL)"; static const char* cclean = NULL; static const char* pclean = NULL; switch (conn->server_type) { case db::MYSQL: cclean = cclean_mysql; pclean = pclean_mysql; break; case db::SQLITE: cclean = cclean_sqlite; pclean = pclean_sqlite; break; case db::ORACLE: cclean = cclean_sqlite; pclean = pclean_sqlite; break; case db::POSTGRES: cclean = cclean_sqlite; pclean = pclean_sqlite; break; default: cclean = cclean_mysql; pclean = pclean_mysql; break; } db::Transaction t(*conn); // Delete orphan contexts db::Statement stm(*conn); stm.exec_direct_and_close(cclean); #if 0 /* Done with context */ res = SQLCloseCursor(stm); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) return dba_db_error_odbc(SQL_HANDLE_STMT, stm, "closing dba_db_remove_orphans cursor"); #endif // Delete orphan stations stm.exec_direct_and_close(pclean); t.commit(); } #if 0 #ifdef DBA_USE_DELETE_USING dba_err dba_db_remove(dba_db db, dba_record rec) { const char* query = "DELETE FROM d, a" " USING station AS pa, context AS c, repinfo AS ri, data AS d" " LEFT JOIN attr AS a ON a.id_context = d.id_context AND a.id_var = d.id_var" " WHERE d.id_context = c.id AND c.id_ana = pa.id AND c.id_report = ri.id"; dba_err err; SQLHSTMT stm; int res; int pseq = 1; assert(db); /* Allocate statement handle */ DBA_RUN_OR_RETURN(dba_db_statement_create(db, &stm)); /* Write the SQL query */ /* Initial query */ dba_querybuf_reset(db->querybuf); DBA_RUN_OR_GOTO(dba_delete_failed, dba_querybuf_append(db->querybuf, query)); /* Bind select fields */ DBA_RUN_OR_GOTO(dba_delete_failed, dba_db_prepare_select(db, rec, stm, &pseq)); /*fprintf(stderr, "QUERY: %s\n", db->querybuf);*/ /* Perform the query */ res = SQLExecDirect(stm, (unsigned char*)dba_querybuf_get(db->querybuf), dba_querybuf_size(db->querybuf)); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { err = dba_db_error_odbc(SQL_HANDLE_STMT, stm, "performing DBALLE query \"%s\"", dba_querybuf_get(db->querybuf)); goto dba_delete_failed; } SQLFreeHandle(SQL_HANDLE_STMT, stm); return dba_error_ok(); /* Exit point with cleanup after error */ dba_delete_failed: SQLFreeHandle(SQL_HANDLE_STMT, stm); return err; } #else dba_err dba_db_remove(dba_db db, dba_record rec) { const char* query = "SELECT d.id FROM station AS pa, context AS c, data AS d, repinfo AS ri" " WHERE d.id_context = c.id AND c.id_ana = pa.id AND c.id_report = ri.id"; dba_err err = DBA_OK; SQLHSTMT stm; SQLHSTMT stm1; SQLHSTMT stm2; SQLINTEGER id; int res; assert(db); /* Allocate statement handles */ DBA_RUN_OR_RETURN(dba_db_statement_create(db, &stm)); res = SQLAllocHandle(SQL_HANDLE_STMT, db->od_conn, &stm1); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { SQLFreeHandle(SQL_HANDLE_STMT, stm); return dba_db_error_odbc(SQL_HANDLE_STMT, stm1, "Allocating new statement handle"); } res = SQLAllocHandle(SQL_HANDLE_STMT, db->od_conn, &stm2); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { SQLFreeHandle(SQL_HANDLE_STMT, stm); SQLFreeHandle(SQL_HANDLE_STMT, stm1); return dba_db_error_odbc(SQL_HANDLE_STMT, stm2, "Allocating new statement handle"); } /* Write the SQL query */ /* Initial query */ dba_querybuf_reset(db->querybuf); DBA_RUN_OR_GOTO(cleanup, dba_querybuf_append(db->querybuf, query)); /* Bind select fields */ DBA_RUN_OR_GOTO(cleanup, dba_db_prepare_select(db, rec, stm)); /* Bind output field */ SQLBindCol(stm, 1, SQL_C_SLONG, &id, sizeof(id), NULL); /*fprintf(stderr, "QUERY: %s\n", db->querybuf);*/ /* Perform the query */ TRACE("Performing query %s\n", dba_querybuf_get(db->querybuf)); res = SQLExecDirect(stm, dba_querybuf_get(db->querybuf), dba_querybuf_size(db->querybuf)); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { err = dba_db_error_odbc(SQL_HANDLE_STMT, stm, "performing DBALLE query \"%s\"", dba_querybuf_get(db->querybuf)); goto cleanup; } /* Compile the DELETE query for the data */ res = SQLPrepare(stm1, (unsigned char*)"DELETE FROM data WHERE id=?", SQL_NTS); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { err = dba_db_error_odbc(SQL_HANDLE_STMT, stm1, "compiling query to delete data entries"); goto cleanup; } /* Bind parameters */ SQLBindParameter(stm1, 1, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &id, 0, 0); /* Compile the DELETE query for the associated QC */ res = SQLPrepare(stm2, (unsigned char*)"DELETE FROM attr WHERE id_data=?", SQL_NTS); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { err = dba_db_error_odbc(SQL_HANDLE_STMT, stm2, "compiling query to delete entries related to QC data"); goto cleanup; } /* Bind parameters */ SQLBindParameter(stm2, 1, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &id, 0, 0); /* Fetch the IDs and delete them */ while (SQLFetch(stm) != SQL_NO_DATA) { /*fprintf(stderr, "Deleting %d\n", id);*/ res = SQLExecute(stm1); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { err = dba_db_error_odbc(SQL_HANDLE_STMT, stm1, "deleting entry %d from the 'data' table", id); goto cleanup; } res = SQLExecute(stm2); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { err = dba_db_error_odbc(SQL_HANDLE_STMT, stm2, "deleting QC data related to 'data' entry %d", id); goto cleanup; } } /* Exit point with cleanup after error */ cleanup: SQLFreeHandle(SQL_HANDLE_STMT, stm); SQLFreeHandle(SQL_HANDLE_STMT, stm1); SQLFreeHandle(SQL_HANDLE_STMT, stm2); return err == DBA_OK ? dba_error_ok() : err; } #endif #endif std::auto_ptr DB::query(const Record& query, unsigned int wanted, unsigned int modifiers) { auto_ptr res(new db::Cursor(*this)); res->query(query, wanted, modifiers); return res; } std::auto_ptr DB::query_stations(const Record& rec) { /* Perform the query, limited to station values */ return query(rec, DBA_DB_WANT_ANA_ID | DBA_DB_WANT_COORDS | DBA_DB_WANT_IDENT, DBA_DB_MODIFIER_ANAEXTRA | DBA_DB_MODIFIER_DISTINCT); } std::auto_ptr DB::query_data(const Record& rec) { /* Perform the query */ return query(rec, DBA_DB_WANT_ANA_ID | DBA_DB_WANT_CONTEXT_ID | DBA_DB_WANT_COORDS | DBA_DB_WANT_IDENT | DBA_DB_WANT_LEVEL | DBA_DB_WANT_TIMERANGE | DBA_DB_WANT_DATETIME | DBA_DB_WANT_VAR_NAME | DBA_DB_WANT_VAR_VALUE | DBA_DB_WANT_REPCOD, 0); } unsigned DB::query_attrs(int id_context, wreport::Varcode id_var, const std::vector& qcs, Record& attrs) { // Create the query Querybuf query(200); if (qcs.empty()) /* If qcs is null, query all QC data */ query.append( "SELECT type, value" " FROM attr" " WHERE id_context = ? AND id_var = ?"); else { query.append( "SELECT type, value" " FROM attr" " WHERE id_context = ? AND id_var = ? AND type IN ("); query.start_list(", "); for (vector::const_iterator i = qcs.begin(); i != qcs.end(); ++i) query.append_listf("%hd", *i); query.append(")"); } // Perform the query DBALLE_SQL_C_SINT_TYPE in_id_context = id_context; Varcode out_type; char out_value[255]; db::Statement stm(*conn); stm.bind_in(1, in_id_context); stm.bind_in(2, id_var); stm.bind_out(1, out_type); stm.bind_out(2, out_value, 255); TRACE("attr read query: %s with ctx %d var %01d%02d%03d\n", query.c_str(), (int)in_id_context, WR_VAR_F(id_var), WR_VAR_X(id_var), WR_VAR_Y(id_var)); stm.exec_direct(query.c_str()); // Retrieve results attrs.clear(); // Fetch the results int count; for (count = 0; stm.fetch(); ++count) attrs.var(out_type).setc(out_value); return count; } void DB::attr_insert_or_replace(int id_context, wreport::Varcode id_var, const Record& attrs, bool can_replace) { db::Attr& a = attr(); a.id_context = id_context; a.id_var = id_var; // Begin the transaction db::Transaction t(*conn); /* Insert all found variables */ for (vector::const_iterator i = attrs.vars().begin(); i != attrs.vars().end(); ++i) { a.set(**i); a.insert(can_replace); } t.commit(); } void DB::attr_insert(int id_context, wreport::Varcode id_var, const Record& attrs) { return attr_insert_or_replace(id_context, id_var, attrs, true); } void DB::attr_insert_new(int id_context, wreport::Varcode id_var, const Record& attrs) { return attr_insert_or_replace(id_context, id_var, attrs, false); } void DB::attr_remove(int id_context, wreport::Varcode id_var, const std::vector& qcs) { // Create the query Querybuf query(500); if (qcs.empty()) query.append("DELETE FROM attr WHERE id_context = ? AND id_var = ?"); else { query.append("DELETE FROM attr WHERE id_context = ? AND id_var = ? AND type IN ("); query.start_list(", "); for (vector::const_iterator i = qcs.begin(); i != qcs.end(); ++i) query.append_listf("%hd", *i); query.append(")"); } // dba_verbose(DBA_VERB_DB_SQL, "Performing query %s for id %d,B%02d%03d\n", query, id_context, DBA_VAR_X(id_var), DBA_VAR_Y(id_var)); DBALLE_SQL_C_SINT_TYPE in_id_context = id_context; db::Statement stm(*conn); stm.bind_in(1, in_id_context); stm.bind_in(2, id_var); stm.exec_direct_and_close(query.c_str()); } void DB::dump(FILE* out) { station().dump(out); context().dump(out); data().dump(out); attr().dump(out); } #if 0 { /* List DSNs */ char dsn[100], desc[100]; short int len_dsn, len_desc, next; for (next = SQL_FETCH_FIRST; SQLDataSources(pc.od_env, next, dsn, sizeof(dsn), &len_dsn, desc, sizeof(desc), &len_desc) == SQL_SUCCESS; next = SQL_FETCH_NEXT) printf("DSN %s (%s)\n", dsn, desc); } #endif #if 0 for (res = SQLFetch(pc.od_stm); res != SQL_NO_DATA; res = SQLFetch(pc.od_stm)) { printf("Result: %d\n", i); } #endif } // namespace dballe /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/db/export.cc0000644000175000017500000001711511634656356013277 00000000000000/* * db/export - Export Msg data from the database * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "db.h" #include "cursor.h" #include "internals.h" #include "attr.h" #include #include #include #include #if 0 #include "querybuf.h" #include #endif using namespace wreport; using namespace std; namespace dballe { void DB::fill_ana_layer(Msg& msg, int id_station, int id_report) { // Perform the query static const char query[] = "SELECT d.id_var, d.value, a.type, a.value" " FROM context c, data d" " LEFT JOIN attr a ON a.id_context = d.id_context AND a.id_var = d.id_var" " WHERE d.id_context = c.id AND c.id_ana = ? AND c.id_report = ?" " AND c.datetime = {ts '1000-01-01 00:00:00.000'} AND c.ltype1 = 257" " ORDER BY d.id_var, a.type"; db::Statement stm(*conn); DBALLE_SQL_C_SINT_TYPE in_id_station = id_station; stm.bind_in(1, in_id_station); DBALLE_SQL_C_SINT_TYPE in_id_report = id_report; stm.bind_in(2, in_id_report); DBALLE_SQL_C_SINT_TYPE out_varcode; stm.bind_out(1, out_varcode); char out_value[255]; stm.bind_out(2, out_value, sizeof(out_value)); DBALLE_SQL_C_SINT_TYPE out_attr_varcode; SQLLEN out_attr_varcode_ind; stm.bind_out(3, out_attr_varcode, out_attr_varcode_ind); char out_attr_value[255]; SQLLEN out_attr_value_ind; stm.bind_out(4, out_attr_value, sizeof(out_attr_value), out_attr_value_ind); TRACE("fill_ana_layer Performing query: %s with idst %d idrep %d\n", query, id_station, id_report); stm.exec_direct(query); // Retrieve results Varcode last_varcode = 0; auto_ptr var; while (stm.fetch()) { TRACE("fill_ana_layer Got B%02ld%03ld %s\n", WR_VAR_X(out_varcode), WR_VAR_Y(out_varcode), out_value); // First process the variable, possibly inserting the old one in the message if (last_varcode != out_varcode) { TRACE("fill_ana_layer new var\n"); if (var.get()) { TRACE("fill_ana_layer inserting old var B%02d%03d\n", WR_VAR_X(var->code()), WR_VAR_Y(var->code())); msg.set(var, Level(257), Trange()); } var = newvar(out_varcode, out_value); last_varcode = out_varcode; } if (out_attr_varcode_ind != -1) { TRACE("fill_ana_layer new attribute\n"); var->seta(newvar(out_attr_varcode, out_attr_value)); } } if (var.get()) { TRACE("fill_ana_layer inserting leftover old var B%02d%03d\n", WR_VAR_X(var->code()), WR_VAR_Y(var->code())); msg.set(var, Level(257), Trange()); } } static inline int sqltimecmp(const SQL_TIMESTAMP_STRUCT* a, const SQL_TIMESTAMP_STRUCT* b) { return memcmp(a, b, sizeof(SQL_TIMESTAMP_STRUCT)); } void DB::export_msgs(const Record& rec, MsgConsumer& consumer) { db::Attr& at = attr(); // Message being built auto_ptr msg; db::Transaction t(*conn); // The big export query db::Cursor cur(*this); cur.query(rec, DBA_DB_WANT_ANA_ID | DBA_DB_WANT_CONTEXT_ID | DBA_DB_WANT_COORDS | DBA_DB_WANT_IDENT | DBA_DB_WANT_LEVEL | DBA_DB_WANT_TIMERANGE | DBA_DB_WANT_DATETIME | DBA_DB_WANT_VAR_NAME | DBA_DB_WANT_VAR_VALUE | DBA_DB_WANT_REPCOD, DBA_DB_MODIFIER_SORT_FOR_EXPORT); /* DBA_DB_MODIFIER_STREAM)); */ // Current context information used to detect context changes SQL_TIMESTAMP_STRUCT last_datetime; last_datetime.year = 0; char last_ident[70]; last_ident[0] = 0; int last_lat = -1; int last_lon = -1; int last_rep_cod = -1; // Retrieve results while (cur.next()) { TRACE("Got B%02d%03d %ld,%ld, %ld,%ld %ld,%ld,%ld %s\n", WR_VAR_X(cur.out_varcode), WR_VAR_Y(cur.out_varcode), cur.out_ltype1, cur.out_l1, cur.out_ltype2, cur.out_l2, cur.out_pind, cur.out_p1, cur.out_p2, cur.out_value); bool ident_differs; if (cur.out_ident_ind != SQL_NULL_DATA) ident_differs = strncmp(last_ident, cur.out_ident, cur.out_ident_ind) != 0; else ident_differs = last_ident[0] != 0; /* Create the variable that we got on this iteration */ auto_ptr var(newvar(cur.out_varcode, cur.out_value)); /* Load the attributes from the database */ at.id_context = cur.out_context_id; at.load(*var); /* See if we have the start of a new message */ if (cur.out_lat != last_lat || cur.out_lon != last_lon || sqltimecmp(&(cur.out_datetime), &last_datetime) != 0 || ident_differs || cur.out_rep_cod != last_rep_cod) { TRACE("New message\n"); if (msg.get() != NULL) { TRACE("Sending old message to consumer\n"); if (msg->type == MSG_PILOT || msg->type == MSG_TEMP || msg->type == MSG_TEMP_SHIP) { auto_ptr copy(new Msg); msg->sounding_pack_levels(*copy); /* DBA_RUN_OR_GOTO(cleanup, dba_msg_sounding_reverse_levels(msg)); */ consumer(copy); msg.release(); } else consumer(msg); } // Start writing a new message msg.reset(new Msg); // Fill in report information { const char* memo = rep_memo_from_cod(cur.out_rep_cod).c_str(); msg->set_rep_memo(memo); msg->type = Msg::type_from_repmemo(memo); } // Fill in the basic station values msg->seti(WR_VAR(0, 5, 1), cur.out_lat, -1, Level(257), Trange()); msg->seti(WR_VAR(0, 6, 1), cur.out_lon, -1, Level(257), Trange()); if (cur.out_ident_ind != SQL_NULL_DATA) msg->set_ident(cur.out_ident); // Fill in datetime msg->set_year(cur.out_datetime.year); msg->set_month(cur.out_datetime.month); msg->set_day(cur.out_datetime.day); msg->set_hour(cur.out_datetime.hour); msg->set_minute(cur.out_datetime.minute); // Fill in extra station info fill_ana_layer(*msg, cur.out_ana_id, cur.out_rep_cod); // Update current context information last_datetime = cur.out_datetime; last_lat = cur.out_lat; last_lon = cur.out_lon; if (cur.out_ident_ind != SQL_NULL_DATA) strncpy(last_ident, cur.out_ident, cur.out_ident_ind); else last_ident[0] = 0; last_rep_cod = cur.out_rep_cod; } TRACE("Inserting var B%02d%03d (%s)\n", WR_VAR_X(var->code()), WR_VAR_Y(var->code()), var->value()); msg->set(var, Level(cur.out_ltype1, cur.out_l1, cur.out_ltype2, cur.out_l2), Trange(cur.out_pind, cur.out_p1, cur.out_p2)); } if (msg.get() != NULL) { TRACE("Inserting leftover old message\n"); if (msg->type == MSG_PILOT || msg->type == MSG_TEMP || msg->type == MSG_TEMP_SHIP) { auto_ptr copy(new Msg); msg->sounding_pack_levels(*copy); /* DBA_RUN_OR_GOTO(cleanup, dba_msg_sounding_reverse_levels(msg)); */ consumer(copy); msg.release(); } else consumer(msg); } /* Useful for Oracle to end the session */ t.commit(); } } // namespace dballe /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/db/station.cc0000644000175000017500000001255411464770361013433 00000000000000/* * db/station - station table management * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "station.h" #include "internals.h" #include "db.h" #include #include using namespace wreport; namespace dballe { namespace db { Station::Station(DB& db) : db(db), sfstm(0), smstm(0), sstm(0), istm(0), ustm(0), dstm(0) { const char* select_fixed_query = "SELECT id FROM station WHERE lat=? AND lon=? AND ident IS NULL"; const char* select_mobile_query = "SELECT id FROM station WHERE lat=? AND lon=? AND ident=?"; const char* select_query = "SELECT lat, lon, ident FROM station WHERE id=?"; const char* insert_query = "INSERT INTO station (lat, lon, ident)" " VALUES (?, ?, ?);"; const char* update_query = "UPDATE station SET lat=?, lon=?, ident=? WHERE id=?"; const char* remove_query = "DELETE FROM station WHERE id=?"; /* Override queries for some databases */ switch (db.conn->server_type) { case ORACLE: insert_query = "INSERT INTO station (id, lat, lon, ident) VALUES (seq_station.NextVal, ?, ?, ?)"; break; case POSTGRES: insert_query = "INSERT INTO station (id, lat, lon, ident) VALUES (nextval('seq_station'), ?, ?, ?)"; break; default: break; } /* Create the statement for select fixed */ sfstm = new Statement(*db.conn); sfstm->bind_in(1, lat); sfstm->bind_in(2, lon); sfstm->bind_out(1, id); sfstm->prepare(select_fixed_query); /* Create the statement for select mobile */ smstm = new Statement(*db.conn); smstm->bind_in(1, lat); smstm->bind_in(2, lon); smstm->bind_in(3, ident, ident_ind); smstm->bind_out(1, id); smstm->prepare(select_mobile_query); /* Create the statement for select station data */ sstm = new Statement(*db.conn); sstm->bind_in(1, id); sstm->bind_out(1, lat); sstm->bind_out(2, lon); sstm->bind_out(3, ident, sizeof(ident), ident_ind); sstm->prepare(select_query); /* Create the statement for insert */ istm = new Statement(*db.conn); istm->bind_in(1, lat); istm->bind_in(2, lon); istm->bind_in(3, ident, ident_ind); istm->prepare(insert_query); /* Create the statement for update */ ustm = new Statement(*db.conn); ustm->bind_in(1, lat); ustm->bind_in(2, lon); ustm->bind_in(3, ident, ident_ind); ustm->bind_in(4, id); ustm->prepare(update_query); /* Create the statement for remove */ dstm = new Statement(*db.conn); dstm->bind_in(1, id); dstm->prepare(remove_query); } Station::~Station() { if (sfstm) delete sfstm; if (smstm) delete smstm; if (sstm) delete sstm; if (istm) delete istm; if (ustm) delete ustm; if (dstm) delete dstm; } void Station::set_ident(const char* val) { if (val) { int len = strlen(val); if (len > 64) len = 64; memcpy(ident, val, len); ident[len] = 0; ident_ind = len; } else { ident[0] = 0; ident_ind = SQL_NULL_DATA; } } int Station::get_id() { db::Statement* stm = ident_ind == SQL_NULL_DATA ? sfstm : smstm; stm->execute(); int res; if (stm->fetch_expecting_one()) res = id; else res = -1; return res; } void Station::get_data(int qid) { id = qid; sstm->execute(); if (!sstm->fetch_expecting_one()) error_notfound::throwf("looking for information for station id %d", qid); if (ident_ind == SQL_NULL_DATA) ident[0] = 0; } int Station::insert() { istm->execute_and_close(); return db.last_station_insert_id(); } void Station::update() { ustm->execute_and_close(); } void Station::remove() { dstm->execute_and_close(); } void Station::dump(FILE* out) { DBALLE_SQL_C_SINT_TYPE id; DBALLE_SQL_C_SINT_TYPE lat; DBALLE_SQL_C_SINT_TYPE lon; char ident[64]; SQLLEN ident_ind; Statement stm(*db.conn); stm.bind_out(1, id); stm.bind_out(2, lat); stm.bind_out(3, lon); stm.bind_out(4, ident, 64, ident_ind); stm.exec_direct("SELECT id, lat, lon, ident FROM station"); int count; fprintf(out, "dump of table station:\n"); for (count = 0; stm.fetch(); ++count) if (ident_ind == SQL_NULL_DATA) fprintf(out, " %d, %.5f, %.5f\n", (int)id, lat/100000.0, lon/100000.0); else fprintf(out, " %d, %.5f, %.5f, %.*s\n", (int)id, lat/10000.0, lon/10000.0, (int)ident_ind, ident); fprintf(out, "%d element%s in table station\n", count, count != 1 ? "s" : ""); stm.close_cursor(); } } // namespace db } // namespace dballe /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/db/test-utils-db.cc0000644000175000017500000000226511445763502014446 00000000000000/* * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "test-utils-db.h" #include #include #include #include namespace dballe { namespace tests { db_test::db_test() : db(NULL) { db = new DB; db->connect_test(); db->reset(); } db_test::~db_test() { if (db != NULL) delete db; } void db_test::use_db() { if (db == NULL) throw tut::no_such_test(); } } // namespace tests } // namespace dballe dballe-5.18/dballe/db/tests/0000755000175000017500000000000011754670141012653 500000000000000dballe-5.18/dballe/db/tests/repinfo.cc0000644000175000017500000000501511636650607014551 00000000000000/* * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "db/test-utils-db.h" #include "db/repinfo.h" using namespace dballe; using namespace std; namespace tut { struct repinfo_shar : public dballe::tests::db_test { db::Repinfo* ri; repinfo_shar() { if (!has_db()) return; ri = &db->repinfo(); } }; TESTGRP(repinfo); /* Test simple queries */ template<> template<> void to::test<1>() { use_db(); ensure_equals(ri->get_id("synop"), 1); ensure_equals(ri->get_id("generic"), 255); ensure_equals(ri->has_id(1), true); ensure_equals(ri->has_id(199), false); } /* Test update */ template<> template<> void to::test<2>() { use_db(); ensure_equals(ri->get_id("synop"), 1); int added, deleted, updated; ri->update(NULL, &added, &deleted, &updated); ensure_equals(added, 0); ensure_equals(deleted, 0); ensure_equals(updated, 13); ensure_equals(ri->get_id("synop"), 1); } /* Test update from a file that was known to fail */ template<> template<> void to::test<3>() { use_db(); ensure_equals(ri->get_id("synop"), 1); int added, deleted, updated; ri->update((string(getenv("DBA_TESTDATA")) + "/test-repinfo1.csv").c_str(), &added, &deleted, &updated); ensure_equals(added, 2); ensure_equals(deleted, 10); ensure_equals(updated, 3); ensure_equals(ri->get_id("synop"), 1); ensure_equals(ri->get_id("FIXspnpo"), 200); } /* Test update from a file with a negative priority */ template<> template<> void to::test<4>() { use_db(); ensure_equals(ri->get_by_memo("generic")->prio, 1000); int added, deleted, updated; ri->update((string(getenv("DBA_TESTDATA")) + "/test-repinfo2.csv").c_str(), &added, &deleted, &updated); ensure_equals(added, 2); ensure_equals(deleted, 10); ensure_equals(updated, 3); ensure_equals(ri->get_by_memo("generic")->prio, -5); } } /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/db/tests/db.cc0000644000175000017500000010453011643272221013464 00000000000000/* * Copyright (C) 2005--2011 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "db/test-utils-db.h" #include "db/querybuf.h" #include "db/db.h" #include "db/cursor.h" #include "db/internals.h" using namespace dballe; using namespace wreport; using namespace std; namespace tut { // Print all the results, returning the count of results printed static int print_results(db::Cursor& cur) { Record result; fprintf(stderr, "%d results:\n", (int)cur.count); int i; for (i = 0; cur.next(); ++i) { fprintf(stderr, " * Result %d:\n", i); cur.to_record(result); result.print(stderr); } return i; } struct db_shar : public dballe::tests::db_test { // Records with test data Record sampleAna; Record extraAna; Record sampleBase; Record sample0; Record sample00; Record sample01; Record sample1; Record sample10; Record sample11; // Work records Record insert; Record query; Record result; Record qc; db_shar() // : insert(NULL), query(NULL), result(NULL), qc(NULL) { if (!has_db()) return; // Common data (ana) sampleAna.set(DBA_KEY_LAT, 12.34560); sampleAna.set(DBA_KEY_LON, 76.54320); sampleAna.set(DBA_KEY_MOBILE, 0); // Extra ana info extraAna.set(WR_VAR(0, 7, 30), 42); // Height extraAna.set(WR_VAR(0, 7, 31), 234); // Heightbaro extraAna.set(WR_VAR(0, 1, 1), 1); // Block extraAna.set(WR_VAR(0, 1, 2), 52); // Station extraAna.set(WR_VAR(0, 1, 19), "Cippo Lippo"); // Name // Common data sampleBase.set(DBA_KEY_YEAR, 1945); sampleBase.set(DBA_KEY_MONTH, 4); sampleBase.set(DBA_KEY_DAY, 25); sampleBase.set(DBA_KEY_HOUR, 8); sampleBase.set(DBA_KEY_LEVELTYPE1, 10); sampleBase.set(DBA_KEY_L1, 11); sampleBase.set(DBA_KEY_LEVELTYPE2, 15); sampleBase.set(DBA_KEY_L2, 22); sampleBase.set(DBA_KEY_PINDICATOR, 20); sampleBase.set(DBA_KEY_P1, 111); // Specific data sample0.set(DBA_KEY_MIN, 0); sample0.set(DBA_KEY_P2, 122); sample0.set(DBA_KEY_REP_COD, 1); sample0.set(DBA_KEY_PRIORITY, 101); sample00.set(WR_VAR(0, 1, 11), "DB-All.e!"); sample01.set(WR_VAR(0, 1, 12), 300); sample1.set(DBA_KEY_MIN, 30); sample1.set(DBA_KEY_P2, 123); sample1.set(DBA_KEY_REP_COD, 2); sample1.set(DBA_KEY_PRIORITY, 81); sample10.set(WR_VAR(0, 1, 11), "Arpa-Sim!"); sample11.set(WR_VAR(0, 1, 12), 400); /* static struct test_data tdata3_patch[] = { { "mobile", "1" }, { "ident", "Cippo" }, }; */ } ~db_shar() { } void populate_database(); }; TESTGRP(db); void db_shar::populate_database() { /* Start with an empty database */ db->reset(); /* Insert the ana station */ insert.clear(); insert.set_ana_context(); insert.key(DBA_KEY_REP_MEMO).setc("synop"); insert.add(sampleAna); insert.add(extraAna); /* Insert the anagraphical record */ db->insert(insert, false, true); /* Insert the ana info also for rep_cod 2 */ insert.key(DBA_KEY_REP_MEMO).setc("metar"); insert.unset(DBA_KEY_CONTEXT_ID); db->insert(insert, false, true); // Insert a record insert.clear(); insert.add(sampleAna); insert.add(sampleBase); insert.add(sample0); insert.add(sample00); insert.add(sample01); db->insert(insert, false, false); // Insert another record (similar but not the same) insert.clear(); insert.add(sampleAna); insert.add(sampleBase); insert.add(sample1); insert.add(sample10); insert.add(sample11); db->insert(insert, false, false); } // Ensure that reset will work on an empty database template<> template<> void to::test<1>() { use_db(); db->delete_tables(); db->reset(); // Run twice to see if it is idempotent db->reset(); } // Test insert template<> template<> void to::test<2>() { use_db(); db->reset(); // Prepare a record to insert insert.clear(); insert.add(sampleAna); insert.add(sampleBase); insert.add(sample0); insert.add(sample00); insert.add(sample01); // Check if adding a nonexisting station when not allowed causes an error try { db->insert(insert, false, false); ensure(false); } catch (error_consistency& e) { ensure_contains(e.what(), "insert a station entry when it is forbidden"); } /* Insert the record */ db->insert(insert, false, true); /* Check if duplicate updates are allowed by insert */ db->insert(insert, true, false); /* Check if duplicate updates are trapped by insert_new */ try { db->insert(insert, false, false); ensure(false); } catch (db::error_odbc& e) { // ensure_contains(e.what(), "uplicate"); } } // Test ana_query template<> template<> void to::test<3>() { use_db(); populate_database(); /* CHECKED(dba_ana_count(db, &count)); fail_unless(count == 1); */ query.clear(); /* Iterate the anagraphic database */ auto_ptr cur = db->query_stations(query); ensure_equals(cur->remaining(), 1); /* There should be an item */ ensure(cur->next()); cur->to_record(result); /* Check that the result matches */ ensure(result.contains(sampleAna)); //ensureTestRecEquals(result, extraAna); /* There should be only one item */ ensure_equals(cur->remaining(), 0); ensure(!cur->next()); } // Try many possible queries template<> template<> void to::test<4>() { use_db(); populate_database(); /* Try a query using a KEY query parameter */ #define TRY_QUERY(param, value, expected_count) do {\ query.clear(); \ query.set(param, value); \ auto_ptr cur = db->query_data(query); \ ensure_equals(cur->remaining(), expected_count); \ int count; \ if (0) count = print_results(*cur); \ else for (count = 0; cur->next(); ++count) ; \ ensure_equals(count, expected_count); \ } while (0) /* Try a query using a longitude range */ #define TRY_QUERY2(lonmin, lonmax, expected_count) do {\ query.clear(); \ query.key(DBA_KEY_LONMIN).setd(lonmin); \ query.key(DBA_KEY_LONMAX).setd(lonmax); \ auto_ptr cur = db->query_data(query); \ ensure_equals(cur->remaining(), expected_count); \ int count; \ if (0) count = print_results(*cur); \ else for (count = 0; cur->next(); ++count) ; \ ensure_equals(count, expected_count); \ } while (0) TRY_QUERY(DBA_KEY_ANA_ID, "1", 4); TRY_QUERY(DBA_KEY_ANA_ID, "2", 0); TRY_QUERY(DBA_KEY_YEAR, 1000, 10); TRY_QUERY(DBA_KEY_YEAR, 1001, 0); TRY_QUERY(DBA_KEY_YEARMIN, 1999, 0); TRY_QUERY(DBA_KEY_YEARMIN, 1945, 4); TRY_QUERY(DBA_KEY_YEARMAX, 1944, 0); TRY_QUERY(DBA_KEY_YEARMAX, 1945, 4); TRY_QUERY(DBA_KEY_YEARMAX, 2030, 4); TRY_QUERY(DBA_KEY_YEAR, 1944, 0); TRY_QUERY(DBA_KEY_YEAR, 1945, 4); TRY_QUERY(DBA_KEY_YEAR, 1946, 0); TRY_QUERY(WR_VAR(0, 1, 1), 1, 4); TRY_QUERY(WR_VAR(0, 1, 1), 2, 0); TRY_QUERY(WR_VAR(0, 1, 2), 52, 4); TRY_QUERY(WR_VAR(0, 1, 2), 53, 0); TRY_QUERY(DBA_KEY_ANA_FILTER, "block=1", 4); TRY_QUERY(DBA_KEY_ANA_FILTER, "B01001=1", 4); TRY_QUERY(DBA_KEY_ANA_FILTER, "block>1", 0); TRY_QUERY(DBA_KEY_ANA_FILTER, "B01001>1", 0); TRY_QUERY(DBA_KEY_ANA_FILTER, "block<=1", 4); TRY_QUERY(DBA_KEY_ANA_FILTER, "B01001<=1", 4); TRY_QUERY(DBA_KEY_ANA_FILTER, "0<=B01001<=2", 4); TRY_QUERY(DBA_KEY_ANA_FILTER, "1<=B01001<=1", 4); TRY_QUERY(DBA_KEY_ANA_FILTER, "2<=B01001<=4", 0); TRY_QUERY(DBA_KEY_DATA_FILTER, "B01011=DB-All.e!", 2); TRY_QUERY(DBA_KEY_DATA_FILTER, "B01012=300", 2); TRY_QUERY(DBA_KEY_DATA_FILTER, "B01012>=300", 4); TRY_QUERY(DBA_KEY_DATA_FILTER, "B01012>300", 2); TRY_QUERY(DBA_KEY_DATA_FILTER, "B01012<400", 2); TRY_QUERY(DBA_KEY_DATA_FILTER, "B01012<=400", 4); /* TRY_QUERY(i, DBA_KEY_MONTHMIN, 1); TRY_QUERY(i, DBA_KEY_MONTHMAX, 12); TRY_QUERY(i, DBA_KEY_MONTH, 5); */ /* TRY_QUERY(i, DBA_KEY_DAYMIN, 1); TRY_QUERY(i, DBA_KEY_DAYMAX, 12); TRY_QUERY(i, DBA_KEY_DAY, 5); */ /* TRY_QUERY(i, DBA_KEY_HOURMIN, 1); TRY_QUERY(i, DBA_KEY_HOURMAX, 12); TRY_QUERY(i, DBA_KEY_HOUR, 5); */ /* TRY_QUERY(i, DBA_KEY_MINUMIN, 1); TRY_QUERY(i, DBA_KEY_MINUMAX, 12); TRY_QUERY(i, DBA_KEY_MIN, 5); */ /* TRY_QUERY(i, DBA_KEY_SECMIN, 1); TRY_QUERY(i, DBA_KEY_SECMAX, 12); TRY_QUERY(i, DBA_KEY_SEC, 5); */ TRY_QUERY(DBA_KEY_LATMIN, 11.0, 4); TRY_QUERY(DBA_KEY_LATMIN, 12.34560, 4); TRY_QUERY(DBA_KEY_LATMIN, 13.0, 0); TRY_QUERY(DBA_KEY_LATMAX, 11.0, 0); TRY_QUERY(DBA_KEY_LATMAX, 12.34560, 4); TRY_QUERY(DBA_KEY_LATMAX, 13.0, 4); TRY_QUERY2(75., 77., 4); TRY_QUERY2(76.54320, 76.54320, 4); TRY_QUERY2(76.54330, 77., 0); TRY_QUERY2(77., 76.54330, 4); TRY_QUERY2(77., 76.54320, 4); TRY_QUERY2(77., -10, 0); TRY_QUERY(DBA_KEY_MOBILE, 0, 4); TRY_QUERY(DBA_KEY_MOBILE, 1, 0); //TRY_QUERY(c, DBA_KEY_IDENT_SELECT, "pippo"); TRY_QUERY(DBA_KEY_PINDICATOR, 20, 4); TRY_QUERY(DBA_KEY_PINDICATOR, 21, 0); TRY_QUERY(DBA_KEY_P1, 111, 4); TRY_QUERY(DBA_KEY_P1, 112, 0); TRY_QUERY(DBA_KEY_P2, 121, 0); TRY_QUERY(DBA_KEY_P2, 122, 2); TRY_QUERY(DBA_KEY_P2, 123, 2); TRY_QUERY(DBA_KEY_LEVELTYPE1, 10, 4); TRY_QUERY(DBA_KEY_LEVELTYPE1, 11, 0); TRY_QUERY(DBA_KEY_LEVELTYPE2, 15, 4); TRY_QUERY(DBA_KEY_LEVELTYPE2, 16, 0); TRY_QUERY(DBA_KEY_L1, 11, 4); TRY_QUERY(DBA_KEY_L1, 12, 0); TRY_QUERY(DBA_KEY_L2, 22, 4); TRY_QUERY(DBA_KEY_L2, 23, 0); TRY_QUERY(DBA_KEY_VAR, "B01011", 2); TRY_QUERY(DBA_KEY_VAR, "B01012", 2); TRY_QUERY(DBA_KEY_VAR, "B01013", 0); TRY_QUERY(DBA_KEY_REP_COD, 1, 2); TRY_QUERY(DBA_KEY_REP_COD, 2, 2); TRY_QUERY(DBA_KEY_REP_COD, 3, 0); TRY_QUERY(DBA_KEY_PRIORITY, 101, 2); TRY_QUERY(DBA_KEY_PRIORITY, 81, 2); TRY_QUERY(DBA_KEY_PRIORITY, 102, 0); TRY_QUERY(DBA_KEY_PRIOMIN, 70, 4); TRY_QUERY(DBA_KEY_PRIOMIN, 80, 4); TRY_QUERY(DBA_KEY_PRIOMIN, 90, 2); TRY_QUERY(DBA_KEY_PRIOMIN, 100, 2); TRY_QUERY(DBA_KEY_PRIOMIN, 110, 0); TRY_QUERY(DBA_KEY_PRIOMAX, 70, 0); TRY_QUERY(DBA_KEY_PRIOMAX, 81, 2); TRY_QUERY(DBA_KEY_PRIOMAX, 100, 2); TRY_QUERY(DBA_KEY_PRIOMAX, 101, 4); TRY_QUERY(DBA_KEY_PRIOMAX, 110, 4); } // Try a query checking all the steps template<> template<> void to::test<5>() { use_db(); populate_database(); // Prepare a query query.clear(); query.set(DBA_KEY_LATMIN, 10.0); // Make the query auto_ptr cur = db->query_data(query); ensure_equals(cur->remaining(), 4); // There should be at least one item ensure(cur->next()); ensure_equals(cur->remaining(), 3); cur->to_record(result); /* Check that the results match */ ensure(result.contains(sampleAna)); ensure(result.contains(sampleBase)); ensure(result.contains(sample0)); // result.print(stderr); // exit(0); ensure(cur->out_varcode == WR_VAR(0, 1, 11) || cur->out_varcode == WR_VAR(0, 1, 12)); if (cur->out_varcode == WR_VAR(0, 1, 11)) ensure(result.contains(sample00)); if (cur->out_varcode == WR_VAR(0, 1, 12)) ensure(result.contains(sample01)); // The item should have two data in it ensure(cur->next()); ensure_equals(cur->remaining(), 2); cur->to_record(result); // Variables from the previous to_record should be removed ensure_equals(result.vars().size(), 1u); ensure(cur->out_varcode == WR_VAR(0, 1, 11) || cur->out_varcode == WR_VAR(0, 1, 12)); if (cur->out_varcode == WR_VAR(0, 1, 11)) ensure(result.contains(sample00)); if (cur->out_varcode == WR_VAR(0, 1, 12)) ensure(result.contains(sample01)); // There should be also another item ensure(cur->next()); ensure_equals(cur->remaining(), 1); cur->to_record(result); // Check that the results matches ensure(result.contains(sampleAna)); ensure(result.contains(sampleBase)); ensure(result.contains(sample1)); ensure(cur->out_varcode == WR_VAR(0, 1, 11) || cur->out_varcode == WR_VAR(0, 1, 12)); if (cur->out_varcode == WR_VAR(0, 1, 11)) ensure(result.contains(sample10)); if (cur->out_varcode == WR_VAR(0, 1, 12)) ensure(result.contains(sample11)); // And finally the last item ensure(cur->next()); ensure_equals(cur->remaining(), 0); cur->to_record(result); ensure(cur->out_varcode == WR_VAR(0, 1, 11) || cur->out_varcode == WR_VAR(0, 1, 12)); if (cur->out_varcode == WR_VAR(0, 1, 11)) ensure(result.contains(sample10)); if (cur->out_varcode == WR_VAR(0, 1, 12)) ensure(result.contains(sample11)); // Now there should not be anything anymore ensure_equals(cur->remaining(), 0); ensure(!cur->next()); } // Try a query for best value template<> template<> void to::test<6>() { use_db(); populate_database(); //if (db->server_type == ORACLE || db->server_type == POSTGRES) // return; // Prepare a query query.clear(); query.set(DBA_KEY_LATMIN, 1000000); query.set(DBA_KEY_QUERY, "best"); // Make the query auto_ptr cur = db->query_data(query); ensure_equals(cur->remaining(), 4); // There should be four items ensure(cur->next()); ensure_equals(cur->remaining(), 3); ensure(cur->next()); ensure_equals(cur->remaining(), 2); ensure(cur->next()); ensure_equals(cur->remaining(), 1); ensure(cur->next()); ensure_equals(cur->remaining(), 0); // Now there should not be anything anymore ensure(!cur->next()); } // Check if deletion works template<> template<> void to::test<7>() { use_db(); populate_database(); // 4 items to begin with query.clear(); auto_ptr cur = db->query_data(query); ensure_equals(cur->remaining(), 4); cur->discard_rest(); query.clear(); query.set(DBA_KEY_YEARMIN, 1945); query.set(DBA_KEY_MONTHMIN, 4); query.set(DBA_KEY_DAYMIN, 25); query.set(DBA_KEY_HOURMIN, 8); query.set(DBA_KEY_MINUMIN, 10); db->remove(query); // 2 remaining after remove query.clear(); cur = db->query_data(query); ensure_equals(cur->remaining(), 2); cur->discard_rest(); // Did it remove the right ones? query.clear(); query.set(DBA_KEY_LATMIN, 1000000); cur = db->query_data(query); ensure_equals(cur->remaining(), 2); ensure(cur->next()); cur->to_record(result); ensure(result.contains(sampleAna)); ensure(result.contains(sampleBase)); ensure(cur->out_varcode == WR_VAR(0, 1, 11) || cur->out_varcode == WR_VAR(0, 1, 12)); if (cur->out_varcode == WR_VAR(0, 1, 11)) ensure(result.contains(sample00)); if (cur->out_varcode == WR_VAR(0, 1, 12)) ensure(result.contains(sample01)); /* The item should have two data in it */ ensure(cur->next()); cur->to_record(result); ensure(cur->out_varcode == WR_VAR(0, 1, 11) || cur->out_varcode == WR_VAR(0, 1, 12)); if (cur->out_varcode == WR_VAR(0, 1, 11)) ensure(result.contains(sample00)); if (cur->out_varcode == WR_VAR(0, 1, 12)) ensure(result.contains(sample01)); ensure(!cur->next()); } /* Test datetime queries */ template<> template<> void to::test<8>() { use_db(); /* Prepare test data */ Record base, a, b; base.set(DBA_KEY_LAT, 12.0); base.set(DBA_KEY_LON, 48.0); base.set(DBA_KEY_MOBILE, 0); /* base.set(DBA_KEY_HEIGHT, 42); base.set(DBA_KEY_HEIGHTBARO, 234); base.set(DBA_KEY_BLOCK, 1); base.set(DBA_KEY_STATION, 52); base.set(DBA_KEY_NAME, "Cippo Lippo"); */ base.set(DBA_KEY_LEVELTYPE1, 1); base.set(DBA_KEY_L1, 0); base.set(DBA_KEY_LEVELTYPE2, 1); base.set(DBA_KEY_L2, 0); base.set(DBA_KEY_PINDICATOR, 1); base.set(DBA_KEY_P1, 0); base.set(DBA_KEY_P2, 0); base.set(DBA_KEY_REP_COD, 1); base.set(DBA_KEY_PRIORITY, 101); base.set(WR_VAR(0, 1, 12), 500); base.set(DBA_KEY_YEAR, 2006); base.set(DBA_KEY_MONTH, 5); base.set(DBA_KEY_DAY, 15); base.set(DBA_KEY_HOUR, 12); base.set(DBA_KEY_MIN, 30); base.set(DBA_KEY_SEC, 0); #define WANTRESULT(ab) do { \ auto_ptr cur = db->query_data(query); \ ensure_equals(cur->remaining(), 1); \ ensure(cur->next()); \ cur->to_record(result); \ ensure_equals(cur->count, 0); \ ensure_varcode_equals(cur->out_varcode, WR_VAR(0, 1, 12)); \ ensure(result.contains(ab)); \ cur->discard_rest(); \ } while(0) /* Year */ db->reset(); insert.clear(); a = base; a.set(DBA_KEY_YEAR, 2005); insert.add(a); db->insert(insert, false, true); insert.clear(); b = base; b.set(DBA_KEY_YEAR, 2006); insert.add(b); db->insert(insert, false, false); query.clear(); query.set(DBA_KEY_YEARMIN, 2006); WANTRESULT(b); query.clear(); query.set(DBA_KEY_YEARMAX, 2005); WANTRESULT(a); query.clear(); query.set(DBA_KEY_YEAR, 2006); WANTRESULT(b); /* Month */ db->reset(); insert.clear(); a = base; a.set(DBA_KEY_YEAR, 2006); a.set(DBA_KEY_MONTH, 4); insert.add(a); db->insert(insert, false, true); insert.clear(); b = base; b.set(DBA_KEY_YEAR, 2006); b.set(DBA_KEY_MONTH, 5); insert.add(b); db->insert(insert, false, false); query.clear(); query.set(DBA_KEY_YEAR, 2006); query.set(DBA_KEY_MONTHMIN, 5); WANTRESULT(b); query.clear(); query.set(DBA_KEY_YEAR, 2006); query.set(DBA_KEY_MONTHMAX, 4); WANTRESULT(a); query.clear(); query.set(DBA_KEY_YEAR, 2006); query.set(DBA_KEY_MONTH, 5); WANTRESULT(b); /* Day */ db->reset(); insert.clear(); a = base; a.set(DBA_KEY_YEAR, 2006); a.set(DBA_KEY_MONTH, 5); a.set(DBA_KEY_DAY, 2); insert.add(a); db->insert(insert, false, true); insert.clear(); b = base; b.set(DBA_KEY_YEAR, 2006); b.set(DBA_KEY_MONTH, 5); b.set(DBA_KEY_DAY, 3); insert.add(b); db->insert(insert, false, false); query.clear(); query.set(DBA_KEY_YEAR, 2006); query.set(DBA_KEY_MONTH, 5); query.set(DBA_KEY_DAYMIN, 3); WANTRESULT(b); query.clear(); query.set(DBA_KEY_YEAR, 2006); query.set(DBA_KEY_MONTH, 5); query.set(DBA_KEY_DAYMAX, 2); WANTRESULT(a); query.clear(); query.set(DBA_KEY_YEAR, 2006); query.set(DBA_KEY_MONTH, 5); query.set(DBA_KEY_DAY, 3); WANTRESULT(b); /* Hour */ db->reset(); insert.clear(); a = base; a.set(DBA_KEY_YEAR, 2006); a.set(DBA_KEY_MONTH, 5); a.set(DBA_KEY_DAY, 3); a.set(DBA_KEY_HOUR, 12); insert.add(a); db->insert(insert, false, true); insert.clear(); b = base; b.set(DBA_KEY_YEAR, 2006); b.set(DBA_KEY_MONTH, 5); b.set(DBA_KEY_DAY, 3); b.set(DBA_KEY_HOUR, 13); insert.add(b); db->insert(insert, false, false); query.clear(); query.set(DBA_KEY_YEAR, 2006); query.set(DBA_KEY_MONTH, 5); query.set(DBA_KEY_DAY, 3); query.set(DBA_KEY_HOURMIN, 13); WANTRESULT(b); query.clear(); query.set(DBA_KEY_YEAR, 2006); query.set(DBA_KEY_MONTH, 5); query.set(DBA_KEY_DAY, 3); query.set(DBA_KEY_HOURMAX, 12); WANTRESULT(a); query.clear(); query.set(DBA_KEY_YEAR, 2006); query.set(DBA_KEY_MONTH, 5); query.set(DBA_KEY_DAY, 3); query.set(DBA_KEY_HOUR, 13); WANTRESULT(b); /* Minute */ db->reset(); insert.clear(); a = base; a.set(DBA_KEY_YEAR, 2006); a.set(DBA_KEY_MONTH, 5); a.set(DBA_KEY_DAY, 3); a.set(DBA_KEY_HOUR, 12); a.set(DBA_KEY_MIN, 29); insert.add(a); db->insert(insert, false, true); insert.clear(); b = base; b.set(DBA_KEY_YEAR, 2006); b.set(DBA_KEY_MONTH, 5); b.set(DBA_KEY_DAY, 3); b.set(DBA_KEY_HOUR, 12); b.set(DBA_KEY_MIN, 30); insert.add(b); db->insert(insert, false, false); query.clear(); query.set(DBA_KEY_YEAR, 2006); query.set(DBA_KEY_MONTH, 5); query.set(DBA_KEY_DAY, 3); query.set(DBA_KEY_HOUR, 12); query.set(DBA_KEY_MINUMIN, 30); WANTRESULT(b); query.clear(); query.set(DBA_KEY_YEAR, 2006); query.set(DBA_KEY_MONTH, 5); query.set(DBA_KEY_DAY, 3); query.set(DBA_KEY_HOUR, 12); query.set(DBA_KEY_MINUMAX, 29); WANTRESULT(a); query.clear(); query.set(DBA_KEY_YEAR, 2006); query.set(DBA_KEY_MONTH, 5); query.set(DBA_KEY_DAY, 3); query.set(DBA_KEY_HOUR, 12); query.set(DBA_KEY_MIN, 30); WANTRESULT(b); } // Test working with QC data template<> template<> void to::test<9>() { use_db(); populate_database(); query.clear(); query.set(DBA_KEY_LATMIN, 1000000); auto_ptr cur = db->query_data(query); // Move the cursor to B01011 bool found = false; while (cur->next()) if (cur->out_varcode == WR_VAR(0, 1, 11)) { cur->discard_rest(); found = true; break; } ensure(found); int context_id = cur->out_context_id; // Insert new attributes about this report qc.clear(); qc.set(WR_VAR(0, 33, 2), 2); qc.set(WR_VAR(0, 33, 3), 5); qc.set(WR_VAR(0, 33, 5), 33); db->attr_insert(context_id, WR_VAR(0, 1, 11), qc); // Query back the data qc.clear(); vector codes; ensure_equals(db->query_attrs(context_id, WR_VAR(0, 1, 11), codes, qc), 3); const Var* attr = qc.var_peek(WR_VAR(0, 33, 2)); ensure(attr != NULL); ensure_equals(attr->enqi(), 2); attr = qc.var_peek(WR_VAR(0, 33, 3)); ensure(attr != NULL); ensure_equals(attr->enqi(), 5); attr = qc.var_peek(WR_VAR(0, 33, 5)); ensure(attr != NULL); ensure_equals(attr->enqi(), 33); // Delete a couple of items codes.push_back(WR_VAR(0, 33, 2)); codes.push_back(WR_VAR(0, 33, 5)); db->attr_remove(context_id, WR_VAR(0, 1, 11), codes); // Deleting non-existing items should not fail. Also try creating a // query with just one item codes.clear(); codes.push_back(WR_VAR(0, 33, 2)); db->attr_remove(context_id, WR_VAR(0, 1, 11), codes); /* Query back the data */ qc.clear(); codes.clear(); codes.push_back(WR_VAR(0, 33, 2)); codes.push_back(WR_VAR(0, 33, 3)); codes.push_back(WR_VAR(0, 33, 5)); ensure_equals(db->query_attrs(context_id, WR_VAR(0, 1, 11), codes, qc), 1); ensure(qc.var_peek(WR_VAR(0, 33, 2)) == NULL); ensure(qc.var_peek(WR_VAR(0, 33, 5)) == NULL); attr = qc.var_peek(WR_VAR(0, 33, 3)); ensure(attr != NULL); ensure_equals(attr->enqi(), 5); /*dba_error_remove_callback(DBA_ERR_NONE, crash, 0);*/ } // Test ana queries template<> template<> void to::test<10>() { use_db(); populate_database(); query.clear(); query.set(DBA_KEY_REP_COD, 1); auto_ptr cur = db->query_stations(query); ensure_equals(cur->remaining(), 1); ensure(cur->next()); ensure(!cur->next()); } // Run a search for orphan elements template<> template<> void to::test<11>() { use_db(); db->remove_orphans(); } // Insert some attributes and try to read them again template<> template<> void to::test<12>() { use_db(); // Start with an empty database db->reset(); // Insert a data record insert.clear(); insert.add(sampleAna); insert.add(sampleBase); insert.add(sample0); insert.add(sample00); insert.add(sample01); db->insert(insert, false, true); ensure_equals(insert[DBA_KEY_ANA_ID].enqi(), 1); ensure_equals(insert[DBA_KEY_CONTEXT_ID].enqi(), 1); qc.clear(); qc.set(WR_VAR(0, 1, 7), 1); qc.set(WR_VAR(0, 2, 48), 2); qc.set(WR_VAR(0, 5, 40), 3); qc.set(WR_VAR(0, 5, 41), 4); qc.set(WR_VAR(0, 5, 43), 5); qc.set(WR_VAR(0, 33, 32), 6); qc.set(WR_VAR(0, 7, 24), 7); qc.set(WR_VAR(0, 5, 21), 8); qc.set(WR_VAR(0, 7, 25), 9); qc.set(WR_VAR(0, 5, 22), 10); db->attr_insert_new(1, WR_VAR(0, 1, 11), qc); qc.clear(); vector codes; int count = db->query_attrs(1, WR_VAR(0, 1, 11), codes, qc); ensure_equals(count, 10); // Check that all the attributes come out const vector vars = qc.vars(); ensure_equals(vars.size(), 10); ensure_varcode_equals(vars[0]->code(), WR_VAR(0, 1, 7)); ensure_var_equals(*vars[0], 1); ensure_varcode_equals(vars[1]->code(), WR_VAR(0, 2, 48)); ensure_var_equals(*vars[1], 2); ensure_varcode_equals(vars[2]->code(), WR_VAR(0, 5, 21)); ensure_var_equals(*vars[2], 8); ensure_varcode_equals(vars[3]->code(), WR_VAR(0, 5, 22)); ensure_var_equals(*vars[3], 10); ensure_varcode_equals(vars[4]->code(), WR_VAR(0, 5, 40)); ensure_var_equals(*vars[4], 3); ensure_varcode_equals(vars[5]->code(), WR_VAR(0, 5, 41)); ensure_var_equals(*vars[5], 4); ensure_varcode_equals(vars[6]->code(), WR_VAR(0, 5, 43)); ensure_var_equals(*vars[6], 5); ensure_varcode_equals(vars[7]->code(), WR_VAR(0, 7, 24)); ensure_var_equals(*vars[7], 7); ensure_varcode_equals(vars[8]->code(), WR_VAR(0, 7, 25)); ensure_var_equals(*vars[8], 9); ensure_varcode_equals(vars[9]->code(), WR_VAR(0, 33, 32)); ensure_var_equals(*vars[9], 6); } /* Query using lonmin > latmax */ template<> template<> void to::test<13>() { use_db(); // Start with an empty database db->reset(); // Insert a data record insert.clear(); insert.add(sampleAna); insert.add(sampleBase); insert.add(sample0); insert.add(sample00); insert.add(sample01); db->insert(insert, false, true); query.clear(); query.set(DBA_KEY_LATMIN, 10.0); query.set(DBA_KEY_LATMAX, 15.0); query.set(DBA_KEY_LONMIN, 70.0); query.set(DBA_KEY_LONMAX, -160.0); auto_ptr cur = db->query_data(query); ensure_equals(cur->remaining(), 2); cur->discard_rest(); } // This query caused problems template<> template<> void to::test<14>() { use_db(); populate_database(); query.clear(); query.set(DBA_KEY_ANA_FILTER, "B07030>1"); // Perform the query, limited to level values db::Cursor cur(*db); ensure_equals(cur.query(query, DBA_DB_WANT_ANA_ID, 0), 2); ensure(cur.next()); ensure(cur.next()); ensure(!cur.next()); } // Insert with undef leveltype2 and l2 template<> template<> void to::test<15>() { use_db(); populate_database(); insert.clear(); insert.add(sampleAna); insert.add(sampleBase); insert.add(sample0); insert.add(sample01); insert.set(DBA_KEY_LEVELTYPE1, 44); insert.set(DBA_KEY_L1, 55); insert.unset(DBA_KEY_LEVELTYPE2); insert.unset(DBA_KEY_L2); db->insert(insert, false, false); // Query it back query.clear(); query.set(DBA_KEY_LEVELTYPE1, 44); query.set(DBA_KEY_L1, 55); db::Cursor cur(*db); ensure_equals(cur.query(query, DBA_DB_WANT_VAR_VALUE | DBA_DB_WANT_LEVEL, 0), 1); ensure(cur.next()); result.clear(); cur.to_record(result); ensure(result.key_peek(DBA_KEY_LEVELTYPE1) != NULL); ensure_equals(result[DBA_KEY_LEVELTYPE1].enqi(), 44); ensure(result.key_peek(DBA_KEY_L1) != NULL); ensure_equals(result[DBA_KEY_L1].enqi(), 55); ensure(result.key_peek(DBA_KEY_LEVELTYPE2) != NULL); ensure_equals(result[DBA_KEY_LEVELTYPE2].enqi(), MISSING_INT); ensure(result.key_peek(DBA_KEY_L2) != NULL); ensure_equals(result[DBA_KEY_L2].enqi(), MISSING_INT); ensure(!cur.next()); } // Query with undef leveltype2 and l2 template<> template<> void to::test<16>() { use_db(); populate_database(); query.clear(); query.set(DBA_KEY_LEVELTYPE1, 10); query.set(DBA_KEY_L1, 11); db::Cursor cur(*db); ensure_equals(cur.query(query, DBA_DB_WANT_VAR_VALUE, 0), 4); cur.discard_rest(); } // Query with an incorrect attr_filter template<> template<> void to::test<17>() { use_db(); populate_database(); query.clear(); query.set(DBA_KEY_ATTR_FILTER, "B12001"); db::Cursor cur(*db); try { cur.query(query, DBA_DB_WANT_VAR_VALUE, 0); } catch (error_consistency& e) { ensure_contains(e.what(), "B12001 is not a valid filter"); } } /* Test querying priomax together with query=best */ template<> template<> void to::test<18>() { use_db(); // Start with an empty database db->reset(); // Prepare the common parts of some data insert.clear(); insert.set(DBA_KEY_LAT, 1); insert.set(DBA_KEY_LON, 1); insert.set(DBA_KEY_LEVELTYPE1, 1); insert.set(DBA_KEY_L1, 0); insert.set(DBA_KEY_PINDICATOR, 254); insert.set(DBA_KEY_P1, 0); insert.set(DBA_KEY_P2, 0); insert.set(DBA_KEY_YEAR, 2009); insert.set(DBA_KEY_MONTH, 11); insert.set(DBA_KEY_DAY, 11); insert.set(DBA_KEY_HOUR, 0); insert.set(DBA_KEY_MIN, 0); insert.set(DBA_KEY_SEC, 0); // 1,synop,synop,101,oss,0 // 2,metar,metar,81,oss,0 // 3,temp,sounding,98,oss,2 // 4,pilot,wind profile,80,oss,2 // 9,buoy,buoy,50,oss,31 // 10,ship,synop ship,99,oss,1 // 11,tempship,temp ship,100,oss,2 // 12,airep,airep,82,oss,4 // 13,amdar,amdar,97,oss,4 // 14,acars,acars,96,oss,4 // 42,pollution,pollution,199,oss,8 // 200,satellite,NOAA satellites,41,oss,255 // 255,generic,generic data,1000,?,255 static int rep_cods[] = { 1, 2, 3, 4, 9, 10, 11, 12, 13, 14, 42, 200, 255, -1 }; for (int* i = rep_cods; *i != -1; ++i) { insert.set(DBA_KEY_REP_COD, *i); insert.set(WR_VAR(0, 12, 101), *i); db->insert(insert, false, true); insert.unset(DBA_KEY_CONTEXT_ID); } // Query with querybest only { db::Cursor cur(*db); query.clear(); query.set(DBA_KEY_QUERY, "best"); query.set(DBA_KEY_YEAR, 2009); query.set(DBA_KEY_MONTH, 11); query.set(DBA_KEY_DAY, 11); query.set(DBA_KEY_HOUR, 0); query.set(DBA_KEY_MIN, 0); query.set(DBA_KEY_SEC, 0); query.set(DBA_KEY_VAR, "B12101"); ensure_equals(cur.query(query, DBA_DB_WANT_REPCOD | DBA_DB_WANT_VAR_VALUE, 0), 1); ensure(cur.next()); result.clear(); cur.to_record(result); ensure(result.key_peek(DBA_KEY_REP_COD) != NULL); ensure_equals(result[DBA_KEY_REP_COD].enqi(), 255); cur.discard_rest(); } // Query with querybest and priomax { db::Cursor cur(*db); query.clear(); query.set(DBA_KEY_PRIOMAX, 100); query.set(DBA_KEY_QUERY, "best"); query.set(DBA_KEY_YEAR, 2009); query.set(DBA_KEY_MONTH, 11); query.set(DBA_KEY_DAY, 11); query.set(DBA_KEY_HOUR, 0); query.set(DBA_KEY_MIN, 0); query.set(DBA_KEY_SEC, 0); query.set(DBA_KEY_VAR, "B12101"); ensure_equals(cur.query(query, DBA_DB_WANT_REPCOD | DBA_DB_WANT_VAR_VALUE, 0), 1); ensure(cur.next()); result.clear(); cur.to_record(result); ensure(result.key_peek(DBA_KEY_REP_COD) != NULL); ensure_equals(result[DBA_KEY_REP_COD].enqi(), 11); cur.discard_rest(); } } /* Test querying priomax together with query=best */ template<> template<> void to::test<19>() { use_db(); populate_database(); Record res; Record rec; auto_ptr cur = db->query(rec, DBA_DB_WANT_REPCOD, DBA_DB_MODIFIER_DISTINCT); while (cur->next()) { cur->to_record(res); ensure(res.key_peek_value(DBA_KEY_REP_MEMO) != 0); } } } /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/db/tests/station.cc0000644000175000017500000000565211636650604014574 00000000000000/* * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "db/test-utils-db.h" #include "db/station.h" #include using namespace dballe; using namespace std; namespace tut { struct station_shar : public dballe::tests::db_test { db::Station* st; station_shar() { if (!has_db()) return; st = &db->station(); } }; TESTGRP(station); /* Test dba_db_pseudoana_set_ident */ template<> template<> void to::test<1>() { use_db(); // Set to a valid value st->set_ident("ciao"); ensure_equals(st->ident, string("ciao")); ensure_equals(st->ident_ind, 4); // Set to NULL st->set_ident(NULL); ensure_equals(st->ident[0], 0); ensure_equals(st->ident_ind, SQL_NULL_DATA); } /* Insert some values and try to read them again */ template<> template<> void to::test<2>() { use_db(); // Insert a mobile station st->lat = 4500000; st->lon = 1100000; st->set_ident("ciao"); ensure_equals(st->insert(), 1); // Insert a fixed station st->lat = 4600000; st->lon = 1200000; st->set_ident(NULL); ensure_equals(st->insert(), 2); // Get the ID of the first station st->id = 0; st->lat = 4500000; st->lon = 1100000; st->set_ident("ciao"); ensure_equals(st->get_id(), 1); // Get the ID of the second station st->id = 0; st->lat = 4600000; st->lon = 1200000; st->set_ident(NULL); ensure_equals(st->get_id(), 2); // Get info on the first station st->get_data(1); ensure_equals(st->lat, 4500000); ensure_equals(st->lon, 1100000); ensure_equals(st->ident, string("ciao")); ensure_equals(st->ident_ind, 4); // Get info on the second station st->get_data(2); ensure_equals(st->lat, 4600000); ensure_equals(st->lon, 1200000); ensure_equals(st->ident[0], 0); // Update the second station st->id = 2; st->lat = 4700000; st->lon = 1300000; st->update(); // Get info on the first station: it should be unchanged st->get_data(1); ensure_equals(st->lat, 4500000); ensure_equals(st->lon, 1100000); ensure_equals(st->ident, string("ciao")); ensure_equals(st->ident_ind, 4); // Get info on the second station: it should be updated st->get_data(2); ensure_equals(st->lat, 4700000); ensure_equals(st->lon, 1300000); ensure_equals(st->ident[0], 0); } } /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/db/tests/context.cc0000644000175000017500000001161611636651041014570 00000000000000/* * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "db/test-utils-db.h" #include "db/context.h" #include "db/station.h" using namespace dballe; using namespace std; namespace tut { struct db_context_shar : public dballe::tests::db_test { db::Context* co; db_context_shar() { if (!has_db()) return; co = &db->context(); db::Station& st = db->station(); // Insert a mobile station st.lat = 4500000; st.lon = 1100000; st.set_ident("ciao"); int id = st.insert(); ensure_equals(id, 1); // Insert a fixed station st.lat = 4600000; st.lon = 1200000; st.set_ident(NULL); id = st.insert(); ensure_equals(id, 2); } }; TESTGRP(db_context); /* Insert some values and try to read them again */ template<> template<> void to::test<1>() { use_db(); // Insert a context co->id_station = 1; co->id_report = 1; co->date = dballe::tests::mkts(2001, 2, 3, 4, 5, 6); co->ltype1 = 1; co->l1 = 2; co->ltype2 = 0; co->l2 = 3; co->pind = 4; co->p1 = 5; co->p2 = 6; ensure_equals(co->insert(), 1); // Insert another context co->id_station = 2; co->id_report = 2; co->date = dballe::tests::mkts(2002, 3, 4, 5, 6, 7); co->ltype1 = 2; co->l1 = 3; co->ltype2 = 1; co->l2 = 4; co->pind = 5; co->p1 = 6; co->p2 = 7; ensure_equals(co->insert(), 2); // Get the ID of the first context co->id = 0; co->id_station = 1; co->id_report = 1; co->date = dballe::tests::mkts(2001, 2, 3, 4, 5, 6); co->ltype1 = 1; co->l1 = 2; co->ltype2 = 0; co->l2 = 3; co->pind = 4; co->p1 = 5; co->p2 = 6; ensure_equals(co->get_id(), 1); // Get the ID of the second context co->id = 0; co->id_station = 2; co->id_report = 2; co->date = dballe::tests::mkts(2002, 3, 4, 5, 6, 7); co->ltype1 = 2; co->l1 = 3; co->ltype2 = 1; co->l2 = 4; co->pind = 5; co->p1 = 6; co->p2 = 7; ensure_equals(co->get_id(), 2); // Get info on the first context co->get_data(1); ensure_equals(co->id_station, 1); ensure_equals(co->id_report, 1); ensure_equals(co->date, dballe::tests::mkts(2001, 2, 3, 4, 5, 6)); //ensure_equals(co->date_ind, 19); ensure_equals(co->ltype1, 1); ensure_equals(co->l1, 2); ensure_equals(co->ltype2, 0); ensure_equals(co->l2, 3); ensure_equals(co->pind, 4); ensure_equals(co->p1, 5); ensure_equals(co->p2, 6); // Get info on the second context co->get_data(2); ensure_equals(co->id_station, 2); ensure_equals(co->id_report, 2); ensure_equals(co->date, dballe::tests::mkts(2002, 3, 4, 5, 6, 7)); //ensure_equals(co->date_ind, 19); ensure_equals(co->ltype1, 2); ensure_equals(co->l1, 3); ensure_equals(co->ltype2, 1); ensure_equals(co->l2, 4); ensure_equals(co->pind, 5); ensure_equals(co->p1, 6); ensure_equals(co->p2, 7); #if 0 // Update the second context co->id = 2; co->id_station = 2; co->id_report = 2; co->date_ind = snprintf(co->date, 25, "%04d-%02d-%02d %02d:%02d:%02d", 2003, 4, 5, 6, 7, 8); co->ltype = 3; co->l1 = 4; co->l2 = 5; co->pind = 6; co->p1 = 7; co->p2 = 8; CHECKED(dba_db_context_update(co)); // Get info on the first station: it should be unchanged CHECKED(dba_db_context_get_data(pa, 1)); ensure_equals(pa->lat, 4500000); ensure_equals(pa->lon, 1100000); ensure_equals(pa->ident, string("ciao")); ensure_equals(pa->ident_ind, 4); // Get info on the second station: it should be updated CHECKED(dba_db_context_get_data(pa, 2)); ensure_equals(pa->lat, 4700000); ensure_equals(pa->lon, 1300000); ensure_equals(pa->ident[0], 0); #endif // Get a station metadata context entry for the first station co->id_station = 1; co->id_report = -1; ensure_equals(co->obtain_station_info(), 3); // Get a pseudoana context entry for the second station co->id_station = 2; co->id_report = -1; ensure_equals(co->obtain_station_info(), 4); // Get a pseudoana context entry for the first station again, to see that only one is created co->id_station = 1; co->id_report = -1; ensure_equals(co->obtain_station_info(), 3); // Get a pseudoana context entry for the second station again, to see that only one is created co->id_station = 2; co->id_report = -1; ensure_equals(co->obtain_station_info(), 4); } } /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/db/tests/querybuf.cc0000644000175000017500000000356311636650611014752 00000000000000/* * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "db/test-utils-db.h" #include "db/querybuf.h" using namespace dballe; using namespace std; namespace tut { struct querybuf_shar { querybuf_shar() { } ~querybuf_shar() { } }; TESTGRP(querybuf); /* Test querybuf */ template<> template<> void to::test<1>() { Querybuf buf(10); // A new querybuf contains the empty string ensure_equals(buf, string()); // Clearing should still be empty buf.clear(); ensure_equals(buf, string()); buf.append("ciao"); ensure_equals(buf, "ciao"); ensure_equals(buf.size(), 4); buf.appendf("%d %s", 42, "--"); ensure_equals(buf, "ciao42 --"); ensure_equals(buf.size(), 9); buf.clear(); ensure_equals(buf, string()); buf.append("123456789"); ensure_equals(buf, "123456789"); buf.clear(); buf.start_list(", "); buf.append_list("1"); buf.append_list("2"); buf.append_listf("%d", 3); ensure_equals(buf, "1, 2, 3"); } } /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/db/tests/data.cc0000644000175000017500000001412311636650467014024 00000000000000/* * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "db/test-utils-db.h" #include "db/data.h" #include "db/context.h" #include "db/station.h" #include "db/internals.h" using namespace dballe; using namespace std; namespace tut { struct data_shar : public dballe::tests::db_test { db::Data* da; data_shar() { if (!has_db()) return; da = &db->data(); db::Station& st = db->station(); db::Context& co = db->context(); // Insert a mobile station st.lat = 4500000; st.lon = 1100000; st.set_ident("ciao"); ensure_equals(st.insert(), 1); // Insert a fixed station st.lat = 4600000; st.lon = 1200000; st.set_ident(NULL); ensure_equals(st.insert(), 2); // Insert a context co.id_station = 1; co.id_report = 1; co.date = dballe::tests::mkts(2001, 2, 3, 4, 5, 6); co.ltype1 = 1; co.l1 = 2; co.ltype2 = 0; co.l2 = 3; co.pind = 4; co.p1 = 5; co.p2 = 6; ensure_equals(co.insert(), 1); // Insert another context co.id_station = 2; co.id_report = 2; co.date = dballe::tests::mkts(2002, 3, 4, 5, 6, 7); co.ltype1 = 2; co.l1 = 3; co.ltype2 = 1; co.l2 = 4; co.pind = 5; co.p1 = 6; co.p2 = 7; ensure_equals(co.insert(), 2); } }; TESTGRP(data); /* Test dba_db_data_set* */ template<> template<> void to::test<1>() { use_db(); // Test dba_db_data_set da->set(var(WR_VAR(0, 1, 2), 123)); ensure_varcode_equals(da->id_var, WR_VAR(0, 1, 2)); ensure_equals(da->value, string("123")); ensure_equals(da->value_ind, 3); // Test dba_db_data_set_value da->set_value("32"); ensure_varcode_equals(da->id_var, WR_VAR(0, 1, 2)); ensure_equals(da->value, string("32")); ensure_equals(da->value_ind, 2); } /* Insert some values and try to read them again */ template<> template<> void to::test<2>() { use_db(); // Insert a datum da->id_context = 1; da->id_var = WR_VAR(0, 1, 2); da->set_value("123"); da->insert_or_fail(); // Insert another datum da->id_context = 2; da->id_var = WR_VAR(0, 1, 2); da->set_value("234"); da->insert_or_fail(); // Reinsert a datum: it should fail da->id_context = 1; da->id_var = WR_VAR(0, 1, 2); da->set_value("123"); try { da->insert_or_fail(); ensure(false); } catch (db::error_odbc& e) { //ensure_contains(e.what(), "uplicate"); } // Reinsert the other datum: it should fail da->id_context = 2; da->id_var = WR_VAR(0, 1, 2); da->set_value("234"); try { da->insert_or_fail(); ensure(false); } catch (db::error_odbc& e) { //ensure_contains(e.what(), "uplicate"); } // Reinsert a datum with overwrite: it should work da->id_context = 1; da->id_var = WR_VAR(0, 1, 2); da->set_value("123"); da->insert_or_overwrite(); // Reinsert the other datum with overwrite: it should work da->id_context = 2; da->id_var = WR_VAR(0, 1, 2); da->set_value("234"); da->insert_or_overwrite(); // Insert a new datum with ignore: it should insert da->id_context = 3; da->id_var = WR_VAR(0, 1, 2); da->set_value("234"); ensure_equals(da->insert_or_ignore(), true); // Reinsert the same datum with ignore: it should ignore da->id_context = 3; da->id_var = WR_VAR(0, 1, 2); da->set_value("234"); ensure_equals(da->insert_or_ignore(), false); #if 0 // Get the ID of the first data co->id = 0; co->id_ana = 1; co->id_report = 1; co->date_ind = snprintf(co->date, 25, "%04d-%02d-%02d %02d:%02d:%02d", 2001, 2, 3, 4, 5, 6); co->ltype = 1; co->l1 = 2; co->l2 = 3; co->pind = 4; co->p1 = 5; co->p2 = 6; CHECKED(dba_db_data_get_id(co, &id)); ensure_equals(id, 1); // Get the ID of the second data co->id = 0; co->id_ana = 2; co->id_report = 2; co->date_ind = snprintf(co->date, 25, "%04d-%02d-%02d %02d:%02d:%02d", 2002, 3, 4, 5, 6, 7); co->ltype = 2; co->l1 = 3; co->l2 = 4; co->pind = 5; co->p1 = 6; co->p2 = 7; CHECKED(dba_db_data_get_id(co, &id)); ensure_equals(id, 2); // Get info on the first data CHECKED(dba_db_data_get_data(co, 1)); ensure_equals(co->id_ana, 1); ensure_equals(co->id_report, 1); ensure_equals(co->date, string("2001-02-03 04:05:06")); ensure_equals(co->date_ind, 19); ensure_equals(co->ltype, 1); ensure_equals(co->l1, 2); ensure_equals(co->l2, 3); ensure_equals(co->pind, 4); ensure_equals(co->p1, 5); ensure_equals(co->p2, 6); // Get info on the second data CHECKED(dba_db_data_get_data(co, 2)); ensure_equals(co->id_ana, 2); ensure_equals(co->id_report, 2); ensure_equals(co->date, string("2002-03-04 05:06:07")); ensure_equals(co->date_ind, 19); ensure_equals(co->ltype, 2); ensure_equals(co->l1, 3); ensure_equals(co->l2, 4); ensure_equals(co->pind, 5); ensure_equals(co->p1, 6); ensure_equals(co->p2, 7); #endif #if 0 // Update the second data co->id = 2; co->id_ana = 2; co->id_report = 2; co->date_ind = snprintf(co->date, 25, "%04d-%02d-%02d %02d:%02d:%02d", 2003, 4, 5, 6, 7, 8); co->ltype = 3; co->l1 = 4; co->l2 = 5; co->pind = 6; co->p1 = 7; co->p2 = 8; CHECKED(dba_db_data_update(co)); // Get info on the first station: it should be unchanged CHECKED(dba_db_data_get_data(pa, 1)); ensure_equals(pa->lat, 4500000); ensure_equals(pa->lon, 1100000); ensure_equals(pa->ident, string("ciao")); ensure_equals(pa->ident_ind, 4); // Get info on the second station: it should be updated CHECKED(dba_db_data_get_data(pa, 2)); ensure_equals(pa->lat, 4700000); ensure_equals(pa->lon, 1300000); ensure_equals(pa->ident[0], 0); #endif } } /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/db/tests/db_export.cc0000644000175000017500000001535111636650624015100 00000000000000/* * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "db/test-utils-db.h" #include "db/db.h" #include "core/record.h" using namespace dballe; using namespace wreport; using namespace std; namespace tut { struct db_export_shar : public dballe::tests::db_test { db_export_shar() { if (!has_db()) return; // Insert some data Record rec; rec.set(DBA_KEY_LAT, 12.34560); rec.set(DBA_KEY_LON, 76.54321); rec.set(DBA_KEY_MOBILE, 0); rec.set(DBA_KEY_YEAR, 1945); rec.set(DBA_KEY_MONTH, 4); rec.set(DBA_KEY_DAY, 25); rec.set(DBA_KEY_HOUR, 8); rec.set(DBA_KEY_MIN, 0); rec.set(DBA_KEY_LEVELTYPE1, 1); rec.set(DBA_KEY_L1, 2); rec.set(DBA_KEY_LEVELTYPE2, 0); rec.set(DBA_KEY_L2, 3); rec.set(DBA_KEY_PINDICATOR, 4); rec.set(DBA_KEY_P1, 5); rec.set(DBA_KEY_P2, 6); rec.set(DBA_KEY_REP_COD, 1); rec.set(WR_VAR(0, 1, 12), 500); db->insert(rec, false, true); rec.unset(DBA_KEY_ANA_ID); rec.unset(DBA_KEY_CONTEXT_ID); rec.set(DBA_KEY_DAY, 26); rec.set(WR_VAR(0, 1, 12), 400); db->insert(rec, false, true); rec.unset(DBA_KEY_ANA_ID); rec.unset(DBA_KEY_CONTEXT_ID); rec.set(DBA_KEY_MOBILE, 1); rec.set(DBA_KEY_IDENT, "ciao"); rec.set(WR_VAR(0, 1, 12), 300); db->insert(rec, false, true); rec.unset(DBA_KEY_ANA_ID); rec.unset(DBA_KEY_CONTEXT_ID); rec.set(DBA_KEY_REP_COD, 2); rec.set(WR_VAR(0, 1, 12), 200); db->insert(rec, false, true); } ~db_export_shar() { } }; TESTGRP(db_export); struct MsgCollector : public vector, public MsgConsumer { ~MsgCollector() { for (iterator i = begin(); i != end(); ++i) delete *i; } void operator()(auto_ptr msg) { push_back(msg.release()); } }; // Put some data in the database and check that it gets exported properly template<> template<> void to::test<1>() { use_db(); // Query back the data Record query; MsgCollector msgs; db->export_msgs(query, msgs); ensure_equals(msgs.size(), 4u); if (msgs[2]->type == MSG_METAR) { // Since the order here is not determined, enforce one Msg* tmp = msgs[2]; msgs[2] = msgs[3]; msgs[3] = tmp; } ensure_equals(msgs[0]->type, MSG_SYNOP); ensure_var_equals(want_var(*msgs[0], DBA_MSG_LATITUDE), 12.34560); ensure_var_equals(want_var(*msgs[0], DBA_MSG_LONGITUDE), 76.54321); ensure_msg_undef(*msgs[0], DBA_MSG_IDENT); ensure_var_equals(want_var(*msgs[0], DBA_MSG_YEAR), 1945); ensure_var_equals(want_var(*msgs[0], DBA_MSG_MONTH), 4); ensure_var_equals(want_var(*msgs[0], DBA_MSG_DAY), 25); ensure_var_equals(want_var(*msgs[0], DBA_MSG_HOUR), 8); ensure_var_equals(want_var(*msgs[0], DBA_MSG_MINUTE), 0); ensure_var_equals(want_var(*msgs[0], WR_VAR(0, 1, 12), Level(1, 2, 0, 3), Trange(4, 5, 6)), 500); ensure_equals(msgs[1]->type, MSG_SYNOP); ensure_var_equals(want_var(*msgs[1], DBA_MSG_LATITUDE), 12.34560); ensure_var_equals(want_var(*msgs[1], DBA_MSG_LONGITUDE), 76.54321); ensure_msg_undef(*msgs[1], DBA_MSG_IDENT); ensure_var_equals(want_var(*msgs[1], DBA_MSG_YEAR), 1945); ensure_var_equals(want_var(*msgs[1], DBA_MSG_MONTH), 4); ensure_var_equals(want_var(*msgs[1], DBA_MSG_DAY), 26); ensure_var_equals(want_var(*msgs[1], DBA_MSG_HOUR), 8); ensure_var_equals(want_var(*msgs[1], DBA_MSG_MINUTE), 0); ensure_var_equals(want_var(*msgs[1], WR_VAR(0, 1, 12), Level(1, 2, 0, 3), Trange(4, 5, 6)), 400); ensure_equals(msgs[2]->type, MSG_SYNOP); ensure_var_equals(want_var(*msgs[2], DBA_MSG_LATITUDE), 12.34560); ensure_var_equals(want_var(*msgs[2], DBA_MSG_LONGITUDE), 76.54321); ensure_var_equals(want_var(*msgs[2], DBA_MSG_IDENT), "ciao"); ensure_var_equals(want_var(*msgs[2], DBA_MSG_YEAR), 1945); ensure_var_equals(want_var(*msgs[2], DBA_MSG_MONTH), 4); ensure_var_equals(want_var(*msgs[2], DBA_MSG_DAY), 26); ensure_var_equals(want_var(*msgs[2], DBA_MSG_HOUR), 8); ensure_var_equals(want_var(*msgs[2], DBA_MSG_MINUTE), 0); ensure_var_equals(want_var(*msgs[2], WR_VAR(0, 1, 12), Level(1, 2, 0, 3), Trange(4, 5, 6)), 300); ensure_equals(msgs[3]->type, MSG_METAR); ensure_var_equals(want_var(*msgs[3], DBA_MSG_LATITUDE), 12.34560); ensure_var_equals(want_var(*msgs[3], DBA_MSG_LONGITUDE), 76.54321); ensure_var_equals(want_var(*msgs[3], DBA_MSG_IDENT), "ciao"); ensure_var_equals(want_var(*msgs[3], DBA_MSG_YEAR), 1945); ensure_var_equals(want_var(*msgs[3], DBA_MSG_MONTH), 4); ensure_var_equals(want_var(*msgs[3], DBA_MSG_DAY), 26); ensure_var_equals(want_var(*msgs[3], DBA_MSG_HOUR), 8); ensure_var_equals(want_var(*msgs[3], DBA_MSG_MINUTE), 0); ensure_var_equals(want_var(*msgs[3], WR_VAR(0, 1, 12), Level(1, 2, 0, 3), Trange(4, 5, 6)), 200); } // Text exporting of extra station information template<> template<> void to::test<2>() { use_db(); db->reset(); // Import some data in the station extra information context Record in; in.set(DBA_KEY_LAT, 45.0); in.set(DBA_KEY_LON, 11.0); in.set(DBA_KEY_REP_MEMO, "synop"); in.set_ana_context(); in.set(WR_VAR(0, 1, 1), 10); db->insert(in, false, true); // Import one real datum in.clear(); in.set(DBA_KEY_LAT, 45.0); in.set(DBA_KEY_LON, 11.0); in.set(DBA_KEY_REP_MEMO, "synop"); in.set(DBA_KEY_YEAR, 2000); in.set(DBA_KEY_MONTH, 1); in.set(DBA_KEY_DAY, 1); in.set(DBA_KEY_HOUR, 0); in.set(DBA_KEY_MIN, 0); in.set(DBA_KEY_SEC, 0); in.set(DBA_KEY_LEVELTYPE1, 103); in.set(DBA_KEY_L1, 2000); in.set(DBA_KEY_PINDICATOR, 254); in.set(DBA_KEY_P1, 0); in.set(DBA_KEY_P2, 0); in.set(WR_VAR(0, 12, 101), 290.0); db->insert(in, false, true); // Query back the data Record query; MsgCollector msgs; db->export_msgs(query, msgs); ensure_equals(msgs.size(), 1u); ensure_equals(msgs[0]->type, MSG_SYNOP); ensure_var_equals(want_var(*msgs[0], DBA_MSG_LATITUDE), 45.0); ensure_var_equals(want_var(*msgs[0], DBA_MSG_LONGITUDE), 11.0); ensure_msg_undef(*msgs[0], DBA_MSG_IDENT); ensure_var_equals(want_var(*msgs[0], DBA_MSG_BLOCK), 10); ensure_var_equals(want_var(*msgs[0], DBA_MSG_TEMP_2M), 290.0); } } // vim:set ts=4 sw=4: dballe-5.18/dballe/db/tests/attr.cc0000644000175000017500000001552011636650417014062 00000000000000/* * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "db/test-utils-db.h" #include "db/attr.h" #include "db/data.h" #include "db/context.h" #include "db/station.h" #include "db/internals.h" using namespace dballe; using namespace wreport; using namespace std; namespace tut { struct attr_shar : public dballe::tests::db_test { db::Attr* at; attr_shar() { if (!has_db()) return; at = &db->attr(); db::Station& st = db->station(); db::Context& co = db->context(); db::Data& da = db->data(); // Insert a mobile station st.lat = 4500000; st.lon = 1100000; st.set_ident("ciao"); ensure_equals(st.insert(), 1); // Insert a fixed station st.lat = 4600000; st.lon = 1200000; st.set_ident(NULL); ensure_equals(st.insert(), 2); // Insert a context co.id_station = 1; co.id_report = 1; co.date = dballe::tests::mkts(2001, 2, 3, 4, 5, 6); co.ltype1 = 1; co.l1 = 2; co.ltype2 = 0; co.l2 = 3; co.pind = 4; co.p1 = 5; co.p2 = 6; ensure_equals(co.insert(), 1); // Insert another context co.id_station = 2; co.id_report = 2; co.date = dballe::tests::mkts(2002, 3, 4, 5, 6, 7); co.ltype1 = 2; co.l1 = 3; co.ltype2 = 1; co.l2 = 4; co.pind = 5; co.p1 = 6; co.p2 = 7; ensure_equals(co.insert(), 2); // Insert a datum da.id_context = 1; da.id_var = WR_VAR(0, 1, 2); da.set_value("123"); da.insert_or_fail(); // Insert another datum da.id_context = 2; da.id_var = WR_VAR(0, 1, 2); da.set_value("234"); da.insert_or_fail(); } }; TESTGRP(attr); /* Test dba_db_data_set* */ template<> template<> void to::test<1>() { use_db(); // Test dba_db_attr_set at->set(var(WR_VAR(0, 1, 2), 123)); ensure_equals(at->value, string("123")); ensure_equals(at->value_ind, 3); // Test dba_db_attr_set_value at->set_value("32"); ensure_equals(at->value, string("32")); ensure_equals(at->value_ind, 2); } /* Insert some values and try to read them again */ template<> template<> void to::test<2>() { use_db(); // Insert a datum at->id_context = 1; at->id_var = WR_VAR(0, 1, 2); at->type = WR_VAR(0, 33, 7); at->set_value("50"); at->insert(false); // Insert another datum at->id_context = 2; at->id_var = WR_VAR(0, 1, 2); at->type = WR_VAR(0, 33, 7); at->set_value("75"); at->insert(false); // Reinsert a datum: it should fail at->id_context = 1; at->id_var = WR_VAR(0, 1, 2); at->type = WR_VAR(0, 33, 7); at->set_value("50"); try { at->insert(false); ensure(false); } catch (db::error_odbc& e) { //ensure_contains(e.what(), "uplicate"); } // Reinsert the other datum: it should fail at->id_context = 2; at->id_var = WR_VAR(0, 1, 2); at->type = WR_VAR(0, 33, 7); at->set_value("75"); try { at->insert(false); ensure(false); } catch (db::error_odbc& e) { //ensure_contains(e.what(), "uplicate"); } // Reinsert a datum with overwrite: it should work at->id_context = 1; at->id_var = WR_VAR(0, 1, 2); at->type = WR_VAR(0, 33, 7); at->set_value("50"); at->insert(true); // Reinsert the other datum with overwrite: it should work at->id_context = 2; at->id_var = WR_VAR(0, 1, 2); at->type = WR_VAR(0, 33, 7); at->set_value("75"); at->insert(true); // Load the attributes for the first variable { Var var(varinfo(WR_VAR(0, 1, 2))); at->id_context = 1; ensure(var.next_attr() == 0); at->load(var); ensure(var.next_attr() != 0); const Var* attr = var.next_attr(); ensure_equals(string(attr->value()), "50"); ensure(attr->next_attr() == NULL); } // Load the attributes for the second variable { Var var(varinfo(WR_VAR(0, 1, 2))); at->id_context = 2; ensure(var.next_attr() == 0); at->load(var); ensure(var.next_attr() != 0); const Var* attr = var.next_attr(); ensure_equals(string(attr->value()), "75"); ensure(attr->next_attr() == NULL); } #if 0 // Get the ID of the first data co->id = 0; co->id_ana = 1; co->id_report = 1; co->date_ind = snprintf(co->date, 25, "%04d-%02d-%02d %02d:%02d:%02d", 2001, 2, 3, 4, 5, 6); co->ltype = 1; co->l1 = 2; co->l2 = 3; co->pind = 4; co->p1 = 5; co->p2 = 6; CHECKED(dba_db_data_get_id(co, &id)); ensure_equals(id, 1); // Get the ID of the second data co->id = 0; co->id_ana = 2; co->id_report = 2; co->date_ind = snprintf(co->date, 25, "%04d-%02d-%02d %02d:%02d:%02d", 2002, 3, 4, 5, 6, 7); co->ltype = 2; co->l1 = 3; co->l2 = 4; co->pind = 5; co->p1 = 6; co->p2 = 7; CHECKED(dba_db_data_get_id(co, &id)); ensure_equals(id, 2); // Get info on the first data CHECKED(dba_db_data_get_data(co, 1)); ensure_equals(co->id_ana, 1); ensure_equals(co->id_report, 1); ensure_equals(co->date, string("2001-02-03 04:05:06")); ensure_equals(co->date_ind, 19); ensure_equals(co->ltype, 1); ensure_equals(co->l1, 2); ensure_equals(co->l2, 3); ensure_equals(co->pind, 4); ensure_equals(co->p1, 5); ensure_equals(co->p2, 6); // Get info on the second data CHECKED(dba_db_data_get_data(co, 2)); ensure_equals(co->id_ana, 2); ensure_equals(co->id_report, 2); ensure_equals(co->date, string("2002-03-04 05:06:07")); ensure_equals(co->date_ind, 19); ensure_equals(co->ltype, 2); ensure_equals(co->l1, 3); ensure_equals(co->l2, 4); ensure_equals(co->pind, 5); ensure_equals(co->p1, 6); ensure_equals(co->p2, 7); #endif #if 0 // Update the second data co->id = 2; co->id_ana = 2; co->id_report = 2; co->date_ind = snprintf(co->date, 25, "%04d-%02d-%02d %02d:%02d:%02d", 2003, 4, 5, 6, 7, 8); co->ltype = 3; co->l1 = 4; co->l2 = 5; co->pind = 6; co->p1 = 7; co->p2 = 8; CHECKED(dba_db_data_update(co)); // Get info on the first station: it should be unchanged CHECKED(dba_db_data_get_data(pa, 1)); ensure_equals(pa->lat, 4500000); ensure_equals(pa->lon, 1100000); ensure_equals(pa->ident, string("ciao")); ensure_equals(pa->ident_ind, 4); // Get info on the second station: it should be updated CHECKED(dba_db_data_get_data(pa, 2)); ensure_equals(pa->lat, 4700000); ensure_equals(pa->lon, 1300000); ensure_equals(pa->ident[0], 0); #endif } } /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/db/tests/db_import.cc0000644000175000017500000003653311636650621015073 00000000000000/* * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "db/test-utils-db.h" #include "db/db.h" #include "msg/msgs.h" #include "msg/context.h" #include "core/record.h" #include #include using namespace dballe; using namespace wreport; using namespace std; namespace tut { struct db_import_shar : public dballe::tests::db_test { Record query; db_import_shar() { if (!has_db()) return; } ~db_import_shar() { } }; TESTGRP(db_import); struct MsgCollector : public vector, public MsgConsumer { ~MsgCollector() { for (iterator i = begin(); i != end(); ++i) delete *i; } void operator()(auto_ptr msg) { push_back(msg.release()); } }; // Test import/export with all CREX samples template<> template<> void to::test<1>() { use_db(); const char** files = dballe::tests::crex_files; for (int i = 0; files[i] != NULL; ++i) { try { std::auto_ptr inmsgs = read_msgs(files[i], CREX); Msg& msg = *(*inmsgs)[0]; db->reset(); db->import_msg(msg, NULL, DBA_IMPORT_ATTRS | DBA_IMPORT_FULL_PSEUDOANA | DBA_IMPORT_DATETIME_ATTRS); // Explicitly set the rep_memo variable that is added during export msg.set_rep_memo(Msg::repmemo_from_type(msg.type)); query.clear(); query.set(DBA_KEY_REP_MEMO, Msg::repmemo_from_type(msg.type)); MsgCollector msgs; db->export_msgs(query, msgs); ensure_equals(msgs.size(), 1u); ensure(msgs[0] != NULL); /* if (string(files[i]).find("temp0") != string::npos) { dba_msg_print(msg, stderr); dba_msg_print(msgs[0], stderr); } */ notes::Collect c(cerr); int diffs = msg.diff(*msgs[0]); if (diffs) dballe::tests::track_different_msgs(msg, *msgs[0], "crex"); ensure_equals(diffs, 0); } catch (std::exception& e) { throw tut::failure(string("[") + files[i] + "] " + e.what()); } } } // Test import/export with all BUFR samples template<> template<> void to::test<2>() { use_db(); const char** files = dballe::tests::bufr_files; for (int i = 0; files[i] != NULL; i++) { try { std::auto_ptr inmsgs = read_msgs(files[i], BUFR); Msg& msg = *(*inmsgs)[0]; db->reset(); db->import_msg(msg, NULL, DBA_IMPORT_ATTRS | DBA_IMPORT_FULL_PSEUDOANA | DBA_IMPORT_DATETIME_ATTRS); query.clear(); query.set(DBA_KEY_REP_MEMO, Msg::repmemo_from_type(msg.type)); MsgCollector msgs; db->export_msgs(query, msgs); ensure_equals(msgs.size(), 1u); ensure(msgs[0] != NULL); // Explicitly set the rep_memo variable that is added during export msg.set_rep_memo(Msg::repmemo_from_type(msg.type)); /* if (string(files[i]).find("temp0") != string::npos) { dba_msg_print(msg, stderr); dba_msg_print(msgs[0], stderr); } */ notes::Collect c(cerr); int diffs = msg.diff(*msgs[0]); if (diffs) dballe::tests::track_different_msgs(msg, *msgs[0], "bufr"); ensure_equals(diffs, 0); } catch (std::exception& e) { throw tut::failure(string("[") + files[i] + "] " + e.what()); } } } // Test import/export with all AOF samples template<> template<> void to::test<3>() { use_db(); const char** files = dballe::tests::aof_files; for (int i = 0; files[i] != NULL; i++) { try { std::auto_ptr inmsgs = read_msgs(files[i], AOF); Msg& msg = *(*inmsgs)[0]; db->reset(); db->import_msg(msg, NULL, DBA_IMPORT_ATTRS | DBA_IMPORT_FULL_PSEUDOANA | DBA_IMPORT_DATETIME_ATTRS); // Explicitly set the rep_memo variable that is added during export msg.set_rep_memo(Msg::repmemo_from_type(msg.type)); // db->dump(stderr); query.clear(); query.set(DBA_KEY_REP_MEMO, Msg::repmemo_from_type(msg.type)); MsgCollector msgs; db->export_msgs(query, msgs); ensure_equals(msgs.size(), 1u); ensure(msgs[0] != NULL); /* if (string(files[i]).find("temp0") != string::npos) { dba_msg_print(msg, stderr); dba_msg_print(msgs[0], stderr); } */ notes::Collect c(cerr); int diffs = msg.diff(*msgs[0]); if (diffs) dballe::tests::track_different_msgs(msg, *msgs[0], "bufr"); ensure_equals(diffs, 0); } catch (std::exception& e) { throw tut::failure(string("[") + files[i] + "] " + e.what()); } } } // Check that multiple messages are correctly identified during export template<> template<> void to::test<4>() { use_db(); // msg1 has latitude 33.88 // msg2 has latitude 46.22 std::auto_ptr msgs1 = read_msgs("bufr/obs0-1.22.bufr", BUFR); std::auto_ptr msgs2 = read_msgs("bufr/obs0-3.504.bufr", BUFR); Msg& msg1 = *(*msgs1)[0]; Msg& msg2 = *(*msgs2)[0]; db->reset(); db->import_msg(msg1, NULL, DBA_IMPORT_ATTRS | DBA_IMPORT_FULL_PSEUDOANA | DBA_IMPORT_DATETIME_ATTRS); db->import_msg(msg2, NULL, DBA_IMPORT_ATTRS | DBA_IMPORT_FULL_PSEUDOANA | DBA_IMPORT_DATETIME_ATTRS); // Explicitly set the rep_memo variable that is added during export msg1.set_rep_memo(Msg::repmemo_from_type(msg1.type)); msg2.set_rep_memo(Msg::repmemo_from_type(msg2.type)); query.clear(); query.set(DBA_KEY_REP_MEMO, Msg::repmemo_from_type(msg1.type)); // fprintf(stderr, "Queried: %d\n", rep_cod_from_msg(msg1)); // Warning: this test used to fail on Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=397597 MsgCollector msgs; db->export_msgs(query, msgs); ensure_equals(msgs.size(), 2u); ensure(msgs[0] != NULL); ensure(msgs[1] != NULL); // Compare the two dba_msg notes::Collect c(cerr); int diffs = msg1.diff(*msgs[0]); if (diffs) dballe::tests::track_different_msgs(msg1, *msgs[0], "synop1"); ensure_equals(diffs, 0); diffs = msg2.diff(*msgs[1]); if (diffs) dballe::tests::track_different_msgs(msg2, *msgs[1], "synop2"); ensure_equals(diffs, 0); } #if 0 // Check that all imported messages are found on export template<> template<> void to::test<5>() { use_db(); msg_generator gen; CHECKED(dba_db_reset(db, NULL)); /* Fix the seed so that we always get predictable results */ srand(1); /* Import 100 random messages */ for (int i = 0; i < 100; i++) { dba_msg msg; CHECKED(dba_msg_create(&msg)); CHECKED(gen.fill_message(msg, rnd(0.8))); CHECKED(dba_import_msg(db, msg, NULL, DBA_IMPORT_ATTRS | DBA_IMPORT_FULL_PSEUDOANA | DBA_IMPORT_DATETIME_ATTRS)); dba_msg_delete(msg); } // Prepare the query dba_record query; CHECKED(dba_record_create(&query)); CHECKED(dba_record_key_seti(query, DBA_KEY_REP_COD, 255)); // Export vector msgs; CHECKED(dba_db_export(db, query, msg_collector, &msgs)); gen_ensure_equals(msgs.size(), 100u); for (vector::iterator i = msgs.begin(); i != msgs.end(); ++i) { gen_ensure(*i != NULL); dba_msg_delete(*i); } dba_record_delete(query); } static dba_err msg_counter(dba_msgs msgs, void* data) { (*(int*)data) += msgs->len; dba_msgs_delete(msgs); return dba_error_ok(); } // Check that the right messages are exported template<> template<> void to::test<6>() { use_db(); msg_vector msgs; // All the various input messages with unique data static const char* bufr_files[] = { "bufr/obs0-1.22.bufr", "bufr/obs0-3.504.bufr", "bufr/obs1-11.16.bufr", "bufr/obs1-13.36.bufr", "bufr/obs1-19.3.bufr", "bufr/synop-old-buoy.bufr", "bufr/obs1-9.2.bufr", "bufr/obs1-140.454.bufr", "bufr/obs2-101.16.bufr", "bufr/obs2-102.1.bufr", "bufr/obs2-91.2.bufr", "bufr/airep-old-4-142.bufr", "bufr/obs4-142.1.bufr", "bufr/obs4-144.4.bufr", "bufr/obs4-145.4.bufr", }; static const char* crex_files[] = { "crex/test-mare1.crex", "crex/test-synop0.crex", "crex/test-synop2.crex", "crex/test-temp0.crex", }; static const char* aof_files[] = { "aof/obs1-14.63.aof", "aof/obs1-21.1.aof", "aof/obs1-24.2104.aof", "aof/obs1-24.34.aof", "aof/obs2-144.2198.aof", "aof/obs4-165.2027.aof", "aof/obs5-35.61.aof", "aof/obs6-32.1573.aof", }; for (size_t i = 0; i < sizeof(bufr_files) / sizeof(const char*); i++) CHECKED(read_file(BUFR, bufr_files[i], msgs)); for (size_t i = 0; i < sizeof(crex_files) / sizeof(const char*); i++) CHECKED(read_file(CREX, crex_files[i], msgs)); for (size_t i = 0; i < sizeof(aof_files) / sizeof(const char*); i++) CHECKED(read_file(AOF, aof_files[i], msgs)); CHECKED(dba_db_reset(db, NULL)); map rep_cods; for (msg_vector::const_iterator i = msgs.begin(); i != msgs.end(); i++) { CHECKED(dba_import_msgs(db, *i, NULL, DBA_IMPORT_ATTRS | DBA_IMPORT_FULL_PSEUDOANA | DBA_IMPORT_DATETIME_ATTRS | DBA_IMPORT_OVERWRITE)); rep_cods[(*i)->msgs[0]->type]++; } dba_record query; CHECKED(dba_record_create(&query)); for (map::const_iterator i = rep_cods.begin(); i != rep_cods.end(); i++) { test_tag(dba_msg_type_name(i->first)); int count = 0; CHECKED(dba_record_key_setc(query, DBA_KEY_REP_MEMO, dba_msg_repmemo_from_type(i->first))); CHECKED(dba_db_export(db, query, msg_counter, &count)); gen_ensure_equals(count, i->second); } test_untag(); } static void clear_datetime_attrs(dba_msg msg) { for (int i = 0; i < msg->data_count; i++) { dba_msg_context ctx = msg->data[i]; if (ctx->ltype1 != 257) continue; for (int j = 0; j < ctx->data_count; j++) { dba_var var = ctx->data[j]; if (DBA_VAR_X(dba_var_code(var)) != 4) continue; dba_var_clear_attrs(var); } } } // Check a case when two AOF messages cannot be exported after import template<> template<> void to::test<7>() { use_db(); msg_vector msgs; const char* fname = "aof/err1.aof"; CHECKED(read_file(AOF, fname, msgs)); CHECKED(dba_db_reset(db, NULL)); //map rep_cods; for (msg_vector::const_iterator i = msgs.begin(); i != msgs.end(); i++) { CHECKED(dba_import_msgs(db, *i, NULL, DBA_IMPORT_ATTRS)); //rep_cods[(*i)->msgs[0]->type]++; } dba_record query; CHECKED(dba_record_create(&query)); msg_vector msgs1; CHECKED(dba_db_export(db, query, msgs_collector, &msgs1)); gen_ensure_equals(msgs1.size(), 2u); clear_datetime_attrs(msgs[0]->msgs[0]); clear_datetime_attrs(msgs[1]->msgs[0]); #if 0 fprintf(stderr, "msgs[0]\n"); dba_msg_print(msgs[0]->msgs[0], stderr); fprintf(stderr, "msgs[1]\n"); dba_msg_print(msgs[1]->msgs[0], stderr); fprintf(stderr, "msgs1[0]\n"); dba_msg_print(msgs1[0]->msgs[0], stderr); fprintf(stderr, "msgs1[1]\n"); dba_msg_print(msgs1[1]->msgs[0], stderr); #endif #if 0 // Compare the two dba_msg int diffs = 0; dba_msg_diff(msgs[0]->msgs[0], msgs1[0]->msgs[0], &diffs, stderr); if (diffs != 0) track_different_msgs(msgs[0], msgs1[0], "aof-reexported1"); gen_ensure_equals(diffs, 0); diffs = 0; dba_msg_diff(msgs[1]->msgs[0], msgs1[1]->msgs[0], &diffs, stderr); if (diffs != 0) track_different_msgs(msgs[1], msgs1[1], "aof-reexported2"); gen_ensure_equals(diffs, 0); #endif dba_rawmsg rmsg; CHECKED(dba_marshal_encode(msgs[0], BUFR, &rmsg)); dba_rawmsg_delete(rmsg); CHECKED(dba_marshal_encode(msgs[1], BUFR, &rmsg)); dba_rawmsg_delete(rmsg); CHECKED(dba_marshal_encode(msgs1[0], BUFR, &rmsg)); dba_rawmsg_delete(rmsg); CHECKED(dba_marshal_encode(msgs1[1], BUFR, &rmsg)); dba_rawmsg_delete(rmsg); dba_record_delete(query); #if 0 dba_record query; CHECKED(dba_record_create(&query)); for (map::const_iterator i = rep_cods.begin(); i != rep_cods.end(); i++) { test_tag(dba_msg_type_name(i->first)); int count = 0; CHECKED(dba_record_key_seti(query, DBA_KEY_REP_COD, dba_msg_repcod_from_type(i->first))); CHECKED(dba_db_export(db, query, msg_counter, &count)); gen_ensure_equals(count, i->second); } #endif } // Check a case when two messages imported get mangled and export exports // different messages template<> template<> void to::test<8>() { use_db(); msg_vector msgs; const char* fname = "bufr/synotemp.bufr"; CHECKED(read_file(BUFR, fname, msgs)); CHECKED(dba_db_reset(db, NULL)); //map rep_cods; for (msg_vector::const_iterator i = msgs.begin(); i != msgs.end(); i++) { CHECKED(dba_import_msgs(db, *i, NULL, DBA_IMPORT_ATTRS | DBA_IMPORT_FULL_PSEUDOANA | DBA_IMPORT_DATETIME_ATTRS)); //rep_cods[(*i)->msgs[0]->type]++; } dba_record query; CHECKED(dba_record_create(&query)); msg_vector msgs1; CHECKED(dba_db_export(db, query, msgs_collector, &msgs1)); gen_ensure_equals(msgs1.size(), 2u); //clear_datetime_attrs(msgs[0]->msgs[0]); //clear_datetime_attrs(msgs[1]->msgs[0]); #if 0 fprintf(stderr, "msgs[0]\n"); dba_msg_print(msgs[0]->msgs[0], stderr); fprintf(stderr, "msgs[1]\n"); dba_msg_print(msgs[1]->msgs[0], stderr); fprintf(stderr, "msgs1[0]\n"); dba_msg_print(msgs1[0]->msgs[0], stderr); fprintf(stderr, "msgs1[1]\n"); dba_msg_print(msgs1[1]->msgs[0], stderr); #endif // Explicitly set rep_memo so that the messages later match CHECKED(dba_msg_set_rep_memo(msgs[0]->msgs[0], rep_memo_from_msg(msgs[0]->msgs[0]), -1)); CHECKED(dba_msg_set_rep_memo(msgs[1]->msgs[0], rep_memo_from_msg(msgs[1]->msgs[0]), -1)); // Compare the two dba_msg int diffs = 0; dba_msg_diff(msgs[0]->msgs[0], msgs1[1]->msgs[0], &diffs, stderr); if (diffs != 0) track_different_msgs(msgs[0], msgs1[1], "synotemp-reexported1"); gen_ensure_equals(diffs, 0); diffs = 0; dba_msg_diff(msgs[1]->msgs[0], msgs1[0]->msgs[0], &diffs, stderr); if (diffs != 0) track_different_msgs(msgs[1], msgs1[0], "synotemp-reexported2"); gen_ensure_equals(diffs, 0); //dba_rawmsg rmsg; //CHECKED(dba_marshal_encode(msgs[0], BUFR, &rmsg)); //dba_rawmsg_delete(rmsg); //CHECKED(dba_marshal_encode(msgs[1], BUFR, &rmsg)); //dba_rawmsg_delete(rmsg); //CHECKED(dba_marshal_encode(msgs1[0], BUFR, &rmsg)); //dba_rawmsg_delete(rmsg); //CHECKED(dba_marshal_encode(msgs1[1], BUFR, &rmsg)); //dba_rawmsg_delete(rmsg); dba_record_delete(query); #if 0 dba_record query; CHECKED(dba_record_create(&query)); for (map::const_iterator i = rep_cods.begin(); i != rep_cods.end(); i++) { test_tag(dba_msg_type_name(i->first)); int count = 0; CHECKED(dba_record_key_seti(query, DBA_KEY_REP_COD, dba_msg_repcod_from_type(i->first))); CHECKED(dba_db_export(db, query, msg_counter, &count)); gen_ensure_equals(count, i->second); } #endif } #endif } // vim:set ts=4 sw=4: dballe-5.18/dballe/db/context.cc0000644000175000017500000001442011464767651013440 00000000000000/* * db/context - context table management * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "context.h" #include "internals.h" #include "db.h" #include #include #include #include using namespace wreport; using namespace std; namespace dballe { namespace db { Context::Context(DB& db) : db(db), sstm(0), sdstm(0), istm(0), dstm(0) { const char* select_query = "SELECT id FROM context WHERE id_ana=? AND id_report=? AND datetime=?" " AND ltype1=? AND l1=? AND ltype2=? AND l2=?" " AND ptype=? AND p1=? AND p2=?"; const char* select_data_query = "SELECT id_ana, id_report, datetime, ltype1, l1, ltype2, l2, ptype, p1, p2 FROM context WHERE id=?"; const char* insert_query = "INSERT INTO context VALUES (NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; const char* remove_query = "DELETE FROM context WHERE id=?"; /* Override queries for some databases */ switch (db.conn->server_type) { case ORACLE: insert_query = "INSERT INTO context VALUES (seq_context.NextVal, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; break; case POSTGRES: insert_query = "INSERT INTO context VALUES (nextval('seq_context'), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; break; default: break; } date.fraction = 0; /* Create the statement for select fixed */ sstm = new Statement(*db.conn); sstm->bind_in(1, id_station); sstm->bind_in(2, id_report); sstm->bind_in(3, date); sstm->bind_in(4, ltype1); sstm->bind_in(5, l1); sstm->bind_in(6, ltype2); sstm->bind_in(7, l2); sstm->bind_in(8, pind); sstm->bind_in(9, p1); sstm->bind_in(10, p2); sstm->bind_out(1, id); sstm->prepare(select_query); /* Create the statement for select data */ sdstm = new Statement(*db.conn); sdstm->bind_in(1, id); sdstm->bind_out(1, id_station); sdstm->bind_out(2, id_report); sdstm->bind_out(3, date); sdstm->bind_out(4, ltype1); sdstm->bind_out(5, l1); sdstm->bind_out(6, ltype2); sdstm->bind_out(7, l2); sdstm->bind_out(8, pind); sdstm->bind_out(9, p1); sdstm->bind_out(10, p2); sdstm->prepare(select_data_query); /* Create the statement for insert */ istm = new Statement(*db.conn); istm->bind_in(1, id_station); istm->bind_in(2, id_report); istm->bind_in(3, date); istm->bind_in(4, ltype1); istm->bind_in(5, l1); istm->bind_in(6, ltype2); istm->bind_in(7, l2); istm->bind_in(8, pind); istm->bind_in(9, p1); istm->bind_in(10, p2); istm->prepare(insert_query); /* Create the statement for remove */ dstm = new Statement(*db.conn); dstm->bind_in(1, id); dstm->prepare(remove_query); } Context::~Context() { if (sstm) delete sstm; if (sdstm) delete sdstm; if (istm) delete istm; if (dstm) delete dstm; } int Context::get_id() { sstm->execute(); /* Get the result */ int res; if (sstm->fetch_expecting_one()) res = id; else res = -1; return res; } void Context::get_data(int qid) { id = qid; sdstm->execute(); if (!sdstm->fetch_expecting_one()) error_notfound::throwf("no data found for context id %d", qid); } int Context::obtain_station_info() { /* Fill up the query parameters with the data for the anagraphical context */ date.year = 1000; date.month = 1; date.day = 1; date.hour = date.minute = date.second = 0; ltype1 = 257; l1 = ltype2 = l2 = MISSING_INT; pind = p1 = p2 = MISSING_INT; /* See if the context entry already exists */ int res = get_id(); /* If it doesn't exist yet, we create it */ if (res == -1) res = insert(); return res; } int Context::insert() { istm->execute_and_close(); return db.last_context_insert_id(); } void Context::remove() { dstm->execute_and_close(); } void Context::dump(FILE* out) { DBALLE_SQL_C_SINT_TYPE id; DBALLE_SQL_C_SINT_TYPE id_station; DBALLE_SQL_C_SINT_TYPE id_report; SQL_TIMESTAMP_STRUCT date; DBALLE_SQL_C_SINT_TYPE ltype1; DBALLE_SQL_C_SINT_TYPE l1; DBALLE_SQL_C_SINT_TYPE ltype2; DBALLE_SQL_C_SINT_TYPE l2; DBALLE_SQL_C_SINT_TYPE pind; DBALLE_SQL_C_SINT_TYPE p1; DBALLE_SQL_C_SINT_TYPE p2; Statement stm(*db.conn); stm.bind_out(1, id); stm.bind_out(2, id_station); stm.bind_out(3, id_report); stm.bind_out(4, date); stm.bind_out(5, ltype1); stm.bind_out(6, l1); stm.bind_out(7, ltype2); stm.bind_out(8, l2); stm.bind_out(9, pind); stm.bind_out(10, p1); stm.bind_out(11, p2); stm.exec_direct("SELECT id, id_ana, id_report, datetime, ltype1, l1, ltype2, l2, ptype, p1, p2 FROM context ORDER BY id"); int count; fprintf(out, " id st rep date lev tr\n"); for (count = 0; stm.fetch(); ++count) { fprintf(out, " %4d %4d %4d %04d-%02d-%02d %02d:%02d:%02d ", (int)id, (int)id_station, (int)id_report, (int)date.year, (int)date.month, (int)date.day, (int)date.hour, (int)date.minute, (int)date.second); { stringstream str; str << Level(ltype1, l1, ltype2, l2); fprintf(out, "%-20s ", str.str().c_str()); } { stringstream str; str << Trange(pind, p1, p2); fprintf(out, "%-10s\n", str.str().c_str()); } } fprintf(out, "%d element%s in table context\n", count, count != 1 ? "s" : ""); } } // namespace db } // namespace dballe /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/db/querybuf.cc0000644000175000017500000000356511674637230013616 00000000000000/* * db/querybuf - Buffer used to build SQL queries * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "querybuf.h" #include #include #include #include #include "dballe/core/vasprintf.h" using namespace std; namespace dballe { Querybuf::Querybuf(size_t reserve) { clear(); this->reserve(512); } Querybuf::~Querybuf() {} void Querybuf::clear() { string::clear(); list_first = true; list_sep[0] = 0; } void Querybuf::start_list(const char* sep) { list_first = true; strncpy(list_sep, sep, 10); list_sep[9] = 0; } void Querybuf::appendf(const char* fmt, ...) { va_list ap; va_start(ap, fmt); char* buf; int size = vasprintf(&buf, fmt, ap); append(buf, size); free(buf); va_end(ap); } void Querybuf::append_list(const char* str) { if (list_first) list_first = false; else append(list_sep); append(str); } void Querybuf::append_listf(const char* fmt, ...) { va_list ap; va_start(ap, fmt); if (list_first) list_first = false; else append(list_sep); char* buf; int size = vasprintf(&buf, fmt, ap); append(buf, size); free(buf); va_end(ap); } } /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/db/internals.cc0000644000175000017500000004176511674637240013760 00000000000000/* * db/internals - Internal support infrastructure for the DB * * Copyright (C) 2005--2009 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "internals.h" #include #include #include #include #include #include #include "dballe/core/vasprintf.h" #include using namespace std; using namespace wreport; namespace dballe { namespace db { error_odbc::error_odbc(SQLSMALLINT handleType, SQLHANDLE handle, const std::string& msg) { static const int strsize = 200; char stat[10], sqlmsg[strsize]; SQLINTEGER err; SQLSMALLINT mlen; SQLGetDiagRec(handleType, handle, 1, (unsigned char*)stat, &err, (unsigned char*)sqlmsg, strsize, &mlen); if (mlen > strsize) mlen = strsize; this->msg = msg; this->msg += ": "; this->msg += sqlmsg; } void error_odbc::throwf(SQLSMALLINT handleType, SQLHANDLE handle, const char* fmt, ...) { // Format the arguments va_list ap; va_start(ap, fmt); char* cmsg; vasprintf(&cmsg, fmt, ap); va_end(ap); // Convert to string std::string msg(cmsg); free(cmsg); throw error_odbc(handleType, handle, msg); } Environment::Environment() { // Allocate ODBC environment handle and register version int res = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &od_env); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) throw error_odbc(SQL_HANDLE_ENV, od_env, "Allocating main environment handle"); res = SQLSetEnvAttr(od_env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { error_odbc e(SQL_HANDLE_ENV, od_env, "Asking for ODBC version 3"); SQLFreeHandle(SQL_HANDLE_ENV, od_env); throw e; } } Environment::~Environment() { SQLFreeHandle(SQL_HANDLE_ENV, od_env); } Environment& Environment::get() { static Environment* env = NULL; if (!env) env = new Environment; return *env; } Connection::Connection() : connected(false) { /* Allocate the ODBC connection handle */ Environment& env = Environment::get(); int sqlres = SQLAllocHandle(SQL_HANDLE_DBC, env.od_env, &od_conn); if ((sqlres != SQL_SUCCESS) && (sqlres != SQL_SUCCESS_WITH_INFO)) throw error_odbc(SQL_HANDLE_DBC, od_conn, "Allocating new connection handle"); } Connection::~Connection() { if (connected) { // FIXME: It was commit with no reason, setting it to rollback, // needs checking it doesn't cause trouble SQLEndTran(SQL_HANDLE_DBC, od_conn, SQL_ROLLBACK); SQLDisconnect(od_conn); } SQLFreeHandle(SQL_HANDLE_DBC, od_conn); } void Connection::connect(const char* dsn, const char* user, const char* password) { /* Connect to the DSN */ int sqlres = SQLConnect(od_conn, (SQLCHAR*)dsn, SQL_NTS, (SQLCHAR*)user, SQL_NTS, (SQLCHAR*)(password == NULL ? "" : password), SQL_NTS); if ((sqlres != SQL_SUCCESS) && (sqlres != SQL_SUCCESS_WITH_INFO)) error_odbc::throwf(SQL_HANDLE_DBC, od_conn, "Connecting to DSN %s as user %s", dsn, user); connected = true; init_after_connect(); } void Connection::driver_connect(const char* config) { /* Connect to the DSN */ char sdcout[1024]; SQLSMALLINT outlen; int sqlres = SQLDriverConnect(od_conn, NULL, (SQLCHAR*)config, SQL_NTS, (SQLCHAR*)sdcout, 1024, &outlen, SQL_DRIVER_NOPROMPT); if ((sqlres != SQL_SUCCESS) && (sqlres != SQL_SUCCESS_WITH_INFO)) error_odbc::throwf(SQL_HANDLE_DBC, od_conn, "Connecting to DB using configuration %s", config); connected = true; init_after_connect(); } void Connection::init_after_connect() { /* Find out what kind of database we are working with */ string name = driver_name(); if (name.substr(0, 9) == "libmyodbc" || name.substr(0, 6) == "myodbc") server_type = MYSQL; else if (name.substr(0, 6) == "sqlite") server_type = SQLITE; else if (name.substr(0, 5) == "SQORA") server_type = ORACLE; else if (name.substr(0, 11) == "libpsqlodbc") server_type = POSTGRES; else { fprintf(stderr, "ODBC driver %s is unsupported: assuming it's similar to Postgres", name.c_str()); server_type = POSTGRES; } } std::string Connection::driver_name() { char drivername[50]; SQLSMALLINT len; int sqlres = SQLGetInfo(od_conn, SQL_DRIVER_NAME, (SQLPOINTER)drivername, 50, &len); if ((sqlres != SQL_SUCCESS) && (sqlres != SQL_SUCCESS_WITH_INFO)) throw error_odbc(SQL_HANDLE_DBC, od_conn, "Getting ODBC driver name"); return string(drivername, len); } void Connection::set_autocommit(bool val) { int sqlres = SQLSetConnectAttr(od_conn, SQL_ATTR_AUTOCOMMIT, (void*)(val ? SQL_AUTOCOMMIT_ON : SQL_AUTOCOMMIT_OFF), 0); if ((sqlres != SQL_SUCCESS) && (sqlres != SQL_SUCCESS_WITH_INFO)) error_odbc::throwf(SQL_HANDLE_DBC, od_conn, "%s ODBC autocommit", val ? "Enabling" : "Disabling"); } #ifdef DBA_USE_TRANSACTIONS void Connection::commit() { int sqlres = SQLEndTran(SQL_HANDLE_DBC, od_conn, SQL_COMMIT); if ((sqlres != SQL_SUCCESS) && (sqlres != SQL_SUCCESS_WITH_INFO)) throw error_odbc(SQL_HANDLE_DBC, od_conn, "Committing a transaction"); } void Connection::rollback() { int sqlres = SQLEndTran(SQL_HANDLE_DBC, od_conn, SQL_ROLLBACK); if ((sqlres != SQL_SUCCESS) && (sqlres != SQL_SUCCESS_WITH_INFO)) throw error_odbc(SQL_HANDLE_DBC, od_conn, "Rolling back a transaction"); } #else // TODO: lock and unlock tables instead void Connection::commit() {} void Connection::rollback() {} #endif Statement::Statement(Connection& conn) : /*conn(conn),*/ stm(NULL), ignore_error(NULL) #ifdef DEBUG_WARN_OPEN_TRANSACTIONS , debug_reached_completion(true) #endif { int sqlres = SQLAllocHandle(SQL_HANDLE_STMT, conn.od_conn, &stm); if ((sqlres != SQL_SUCCESS) && (sqlres != SQL_SUCCESS_WITH_INFO)) throw error_odbc(SQL_HANDLE_STMT, stm, "Allocating new statement handle"); } Statement::~Statement() { #ifdef DEBUG_WARN_OPEN_TRANSACTIONS if (!debug_reached_completion) { throw error_consistency("Statement " + debug_query + " destroyed before reaching completion"); close_cursor(); SQLCloseCursor(stm); } #endif SQLFreeHandle(SQL_HANDLE_STMT, stm); } bool Statement::error_is_ignored() { if (!ignore_error) return false; // Retrieve the current error code char stat[10]; SQLINTEGER err; SQLSMALLINT mlen; SQLGetDiagRec(SQL_HANDLE_STMT, stm, 1, (unsigned char*)stat, &err, NULL, 0, &mlen); // Ignore the given SQL error return memcmp(stat, ignore_error, 5) == 0; } bool Statement::is_error(int sqlres) { return (sqlres != SQL_SUCCESS) && (sqlres != SQL_SUCCESS_WITH_INFO) && (sqlres != SQL_NO_DATA) && !error_is_ignored(); } void Statement::bind_in(int idx, const DBALLE_SQL_C_SINT_TYPE& val) { // cast away const because the ODBC API is not const-aware SQLBindParameter(stm, idx, SQL_PARAM_INPUT, DBALLE_SQL_C_SINT, SQL_INTEGER, 0, 0, (DBALLE_SQL_C_SINT_TYPE*)&val, 0, 0); } void Statement::bind_in(int idx, const DBALLE_SQL_C_SINT_TYPE& val, const SQLLEN& ind) { // cast away const because the ODBC API is not const-aware SQLBindParameter(stm, idx, SQL_PARAM_INPUT, DBALLE_SQL_C_SINT, SQL_INTEGER, 0, 0, (DBALLE_SQL_C_SINT_TYPE*)&val, 0, (SQLLEN*)&ind); } void Statement::bind_in(int idx, const DBALLE_SQL_C_UINT_TYPE& val) { // cast away const because the ODBC API is not const-aware SQLBindParameter(stm, idx, SQL_PARAM_INPUT, DBALLE_SQL_C_UINT, SQL_INTEGER, 0, 0, (DBALLE_SQL_C_UINT_TYPE*)&val, 0, 0); } void Statement::bind_in(int idx, const DBALLE_SQL_C_UINT_TYPE& val, const SQLLEN& ind) { // cast away const because the ODBC API is not const-aware SQLBindParameter(stm, idx, SQL_PARAM_INPUT, DBALLE_SQL_C_UINT, SQL_INTEGER, 0, 0, (DBALLE_SQL_C_UINT_TYPE*)&val, 0, (SQLLEN*)&ind); } void Statement::bind_in(int idx, const unsigned short& val) { // cast away const because the ODBC API is not const-aware SQLBindParameter(stm, idx, SQL_PARAM_INPUT, SQL_C_USHORT, SQL_INTEGER, 0, 0, (unsigned short*)&val, 0, 0); } void Statement::bind_in(int idx, const char* val) { // cast away const because the ODBC API is not const-aware SQLBindParameter(stm, idx, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 0, 0, (char*)val, 0, 0); } void Statement::bind_in(int idx, const char* val, const SQLLEN& ind) { // cast away const because the ODBC API is not const-aware SQLBindParameter(stm, idx, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 0, 0, (char*)val, 0, (SQLLEN*)&ind); } void Statement::bind_in(int idx, const SQL_TIMESTAMP_STRUCT& val) { // cast away const because the ODBC API is not const-aware //if (conn.server_type == POSTGRES || conn.server_type == SQLITE) SQLBindParameter(stm, idx, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TIMESTAMP, 0, 0, (SQL_TIMESTAMP_STRUCT*)&val, 0, 0); //else //SQLBindParameter(stm, idx, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_DATETIME, 0, 0, (SQL_TIMESTAMP_STRUCT*)&val, 0, 0); } void Statement::bind_out(int idx, DBALLE_SQL_C_SINT_TYPE& val) { SQLBindCol(stm, idx, DBALLE_SQL_C_SINT, &val, sizeof(val), 0); } void Statement::bind_out(int idx, DBALLE_SQL_C_SINT_TYPE& val, SQLLEN& ind) { SQLBindCol(stm, idx, DBALLE_SQL_C_SINT, &val, sizeof(val), &ind); } void Statement::bind_out(int idx, DBALLE_SQL_C_UINT_TYPE& val) { SQLBindCol(stm, idx, DBALLE_SQL_C_UINT, &val, sizeof(val), 0); } void Statement::bind_out(int idx, DBALLE_SQL_C_UINT_TYPE& val, SQLLEN& ind) { SQLBindCol(stm, idx, DBALLE_SQL_C_UINT, &val, sizeof(val), &ind); } void Statement::bind_out(int idx, unsigned short& val) { SQLBindCol(stm, idx, SQL_C_USHORT, &val, sizeof(val), 0); } void Statement::bind_out(int idx, char* val, SQLLEN buflen) { SQLBindCol(stm, idx, SQL_C_CHAR, val, buflen, 0); } void Statement::bind_out(int idx, char* val, SQLLEN buflen, SQLLEN& ind) { SQLBindCol(stm, idx, SQL_C_CHAR, val, buflen, &ind); } void Statement::bind_out(int idx, SQL_TIMESTAMP_STRUCT& val) { SQLBindCol(stm, idx, SQL_C_TYPE_TIMESTAMP, &val, sizeof(val), 0); } bool Statement::fetch() { int sqlres = SQLFetch(stm); if (sqlres == SQL_NO_DATA) { #ifdef DEBUG_WARN_OPEN_TRANSACTIONS debug_reached_completion = true; #endif return false; } if (is_error(sqlres)) throw error_odbc(SQL_HANDLE_STMT, stm, "fetching data"); return true; } bool Statement::fetch_expecting_one() { if (!fetch()) return false; if (fetch()) throw error_consistency("expecting only one result from statement"); close_cursor(); return true; } size_t Statement::rowcount() { SQLLEN res; int sqlres = SQLRowCount(stm, &res); if (is_error(sqlres)) throw error_odbc(SQL_HANDLE_STMT, stm, "reading row count"); return res; } void Statement::set_cursor_forward_only() { int sqlres = SQLSetStmtAttr(stm, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER)SQL_CURSOR_FORWARD_ONLY, SQL_IS_INTEGER); if (is_error(sqlres)) throw error_odbc(SQL_HANDLE_STMT, stm, "setting SQL_CURSOR_FORWARD_ONLY"); } void Statement::close_cursor() { int sqlres = SQLCloseCursor(stm); if (is_error(sqlres)) throw error_odbc(SQL_HANDLE_STMT, stm, "closing cursor"); #ifdef DEBUG_WARN_OPEN_TRANSACTIONS debug_reached_completion = true; #endif } void Statement::prepare(const char* query) { #ifdef DEBUG_WARN_OPEN_TRANSACTIONS debug_query = query; #endif // Casting out 'const' because ODBC API is not const-conscious if (is_error(SQLPrepare(stm, (unsigned char*)query, SQL_NTS))) error_odbc::throwf(SQL_HANDLE_STMT, stm, "compiling query \"%s\"", query); } void Statement::prepare(const char* query, int qlen) { #ifdef DEBUG_WARN_OPEN_TRANSACTIONS debug_query = string(query, qlen); #endif // Casting out 'const' because ODBC API is not const-conscious if (is_error(SQLPrepare(stm, (unsigned char*)query, qlen))) error_odbc::throwf(SQL_HANDLE_STMT, stm, "compiling query \"%.*s\"", qlen, query); } int Statement::execute() { int sqlres = SQLExecute(stm); if (is_error(sqlres)) throw error_odbc(SQL_HANDLE_STMT, stm, "executing precompiled query"); #ifdef DEBUG_WARN_OPEN_TRANSACTIONS debug_reached_completion = false; #endif return sqlres; } int Statement::exec_direct(const char* query) { #ifdef DEBUG_WARN_OPEN_TRANSACTIONS debug_query = query; #endif // Casting out 'const' because ODBC API is not const-conscious int sqlres = SQLExecDirect(stm, (SQLCHAR*)query, SQL_NTS); if (is_error(sqlres)) error_odbc::throwf(SQL_HANDLE_STMT, stm, "executing query \"%s\"", query); #ifdef DEBUG_WARN_OPEN_TRANSACTIONS debug_reached_completion = false; #endif return sqlres; } int Statement::exec_direct(const char* query, int qlen) { #ifdef DEBUG_WARN_OPEN_TRANSACTIONS debug_query = string(query, qlen); #endif // Casting out 'const' because ODBC API is not const-conscious int sqlres = SQLExecDirect(stm, (SQLCHAR*)query, qlen); if (is_error(sqlres)) error_odbc::throwf(SQL_HANDLE_STMT, stm, "executing query \"%.*s\"", qlen, query); #ifdef DEBUG_WARN_OPEN_TRANSACTIONS debug_reached_completion = false; #endif return sqlres; } int Statement::execute_and_close() { int sqlres = SQLExecute(stm); if (is_error(sqlres)) throw error_odbc(SQL_HANDLE_STMT, stm, "executing precompiled query"); #ifdef DEBUG_WARN_OPEN_TRANSACTIONS debug_reached_completion = false; #endif // If the query raised an error that we are ignoring, closing the cursor // would raise invalid cursor state if (sqlres != SQL_ERROR && columns_count() > 0) close_cursor(); return sqlres; } int Statement::exec_direct_and_close(const char* query) { #ifdef DEBUG_WARN_OPEN_TRANSACTIONS debug_query = query; #endif // Casting out 'const' because ODBC API is not const-conscious int sqlres = SQLExecDirect(stm, (SQLCHAR*)query, SQL_NTS); if (is_error(sqlres)) error_odbc::throwf(SQL_HANDLE_STMT, stm, "executing query \"%s\"", query); #ifdef DEBUG_WARN_OPEN_TRANSACTIONS debug_reached_completion = false; #endif // If the query raised an error that we are ignoring, closing the cursor // would raise invalid cursor state if (sqlres != SQL_ERROR && columns_count() > 0) close_cursor(); return sqlres; } int Statement::exec_direct_and_close(const char* query, int qlen) { #ifdef DEBUG_WARN_OPEN_TRANSACTIONS debug_query = string(query, qlen); #endif // Casting out 'const' because ODBC API is not const-conscious int sqlres = SQLExecDirect(stm, (SQLCHAR*)query, qlen); if (is_error(sqlres)) error_odbc::throwf(SQL_HANDLE_STMT, stm, "executing query \"%.*s\"", qlen, query); #ifdef DEBUG_WARN_OPEN_TRANSACTIONS debug_reached_completion = false; #endif // If the query raised an error that we are ignoring, closing the cursor // would raise invalid cursor state if (sqlres != SQL_ERROR && columns_count() > 0) close_cursor(); return sqlres; } int Statement::columns_count() { SQLSMALLINT res; int sqlres = SQLNumResultCols(stm, &res); if (is_error(sqlres)) throw error_odbc(SQL_HANDLE_STMT, stm, "querying number of columns in the result set"); return res; } Sequence::Sequence(Connection& conn, const char* name) : Statement(conn) { char qbuf[100]; int qlen; bind_out(1, out); if (conn.server_type == ORACLE) qlen = snprintf(qbuf, 100, "SELECT %s.CurrVal FROM dual", name); else qlen = snprintf(qbuf, 100, "SELECT last_value FROM %s", name); prepare(qbuf, qlen); } Sequence::~Sequence() {} const DBALLE_SQL_C_SINT_TYPE& Sequence::read() { if (is_error(SQLExecute(stm))) throw error_odbc(SQL_HANDLE_STMT, stm, "reading sequence value"); /* Get the result */ if (SQLFetch(stm) == SQL_NO_DATA) throw error_notfound("fetching results of sequence value reads"); if (is_error(SQLCloseCursor(stm))) throw error_odbc(SQL_HANDLE_STMT, stm, "closing sequence read cursor"); return out; } const char* default_repinfo_file() { const char* repinfo_file = getenv("DBA_REPINFO"); if (repinfo_file == 0 || repinfo_file[0] == 0) repinfo_file = TABLE_DIR "/repinfo.csv"; return repinfo_file; } } // namespace db } // namespace dballe /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/db/data.cc0000644000175000017500000001443211466226514012656 00000000000000/* * db/data - data table management * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "data.h" #include "internals.h" #include #include using namespace wreport; using namespace std; namespace dballe { namespace db { Data::Data(Connection& conn) : conn(conn), istm(0), ustm(0), iistm(0) { const char* insert_query = "INSERT INTO data (id_context, id_var, value) VALUES(?, ?, ?)"; const char* replace_query_mysql = "INSERT INTO data (id_context, id_var, value) VALUES(?, ?, ?)" " ON DUPLICATE KEY UPDATE value=VALUES(value)"; const char* replace_query_sqlite = "INSERT OR REPLACE INTO data (id_context, id_var, value) VALUES(?, ?, ?)"; const char* replace_query_oracle = "MERGE INTO data USING" " (SELECT ? as cnt, ? as var, ? as val FROM dual)" " ON (id_context=cnt AND id_var=var)" " WHEN MATCHED THEN UPDATE SET value=val" " WHEN NOT MATCHED THEN" " INSERT (id_context, id_var, value) VALUES (cnt, var, val)"; const char* replace_query_postgres = "UPDATE data SET value=? WHERE id_context=? AND id_var=?"; const char* insert_ignore_query_mysql = "INSERT IGNORE INTO data (id_context, id_var, value) VALUES(?, ?, ?)"; const char* insert_ignore_query_sqlite = "INSERT OR IGNORE INTO data (id_context, id_var, value) VALUES(?, ?, ?)"; /* FIXME: there is a useless WHEN MATCHED, but there does not seem a way to * have a MERGE with only a WHEN NOT, although on the internet one finds * several examples with it * / const char* insert_ignore_query_oracle = "MERGE INTO data USING" " (SELECT ? as cnt, ? as var, ? as val FROM dual)" " ON (id_context=cnt AND id_var=var)" " WHEN MATCHED THEN UPDATE SET value=value" " WHEN NOT MATCHED THEN" " INSERT (id_context, id_var, value) VALUES (cnt, var, val)"; */ /* Create the statement for insert */ istm = new db::Statement(conn); istm->bind_in(1, id_context); istm->bind_in(2, id_var); istm->bind_in(3, value, value_ind); istm->prepare(insert_query); /* Create the statement for replace */ ustm = new db::Statement(conn); if (conn.server_type == POSTGRES) { ustm->bind_in(1, value, value_ind); ustm->bind_in(2, id_context); ustm->bind_in(3, id_var); } else { ustm->bind_in(1, id_context); ustm->bind_in(2, id_var); ustm->bind_in(3, value, value_ind); } switch (conn.server_type) { case MYSQL: ustm->prepare(replace_query_mysql); break; case SQLITE: ustm->prepare(replace_query_sqlite); break; case ORACLE: ustm->prepare(replace_query_oracle); break; case POSTGRES: ustm->prepare(replace_query_postgres); break; default: ustm->prepare(replace_query_postgres); break; } /* Create the statement for insert ignore */ iistm = new db::Statement(conn); iistm->bind_in(1, id_context); iistm->bind_in(2, id_var); iistm->bind_in(3, value, value_ind); switch (conn.server_type) { case POSTGRES: iistm->prepare(insert_query); iistm->ignore_error = "FIXME"; break; case ORACLE: iistm->prepare(insert_query); iistm->ignore_error = "23000"; break; //case ORACLE: iistm->prepare(insert_ignore_query_oracle); break; case MYSQL: iistm->prepare(insert_ignore_query_mysql); break; case SQLITE: iistm->prepare(insert_ignore_query_sqlite); break; default: iistm->prepare(insert_ignore_query_sqlite); break; } } Data::~Data() { if (istm) delete istm; if (ustm) delete ustm; if (iistm) delete iistm; } void Data::set(const wreport::Var& var) { id_var = var.code(); set_value(var.value()); } void Data::set_value(const char* qvalue) { if (qvalue == NULL) { value[0] = 0; value_ind = SQL_NULL_DATA; } else { int len = strlen(qvalue); if (len > 255) len = 255; memcpy(value, qvalue, len); value[len] = 0; value_ind = len; } } void Data::insert_or_fail() { istm->execute_and_close(); } bool Data::insert_or_ignore() { int sqlres = iistm->execute(); bool res; if (conn.server_type == POSTGRES || conn.server_type == ORACLE) res = ((sqlres == SQL_SUCCESS) || (sqlres == SQL_SUCCESS_WITH_INFO)); else res = iistm->rowcount() != 0; if (res && iistm->columns_count() > 0) iistm->close_cursor(); return res; } void Data::insert_or_overwrite() { if (conn.server_type == POSTGRES) { if (ustm->execute_and_close() == SQL_NO_DATA) istm->execute_and_close(); } else ustm->execute_and_close(); } void Data::dump(FILE* out) { DBALLE_SQL_C_SINT_TYPE id_context; wreport::Varcode id_var; char value[255]; SQLLEN value_ind; db::Statement stm(conn); stm.bind_out(1, id_context); stm.bind_out(2, id_var); stm.bind_out(3, value, 255, value_ind); stm.exec_direct("SELECT id_context, id_var, value FROM data"); int count; fprintf(out, "dump of table data:\n"); for (count = 0; stm.fetch(); ++count) { fprintf(out, " %4d, %01d%02d%03d", (int)id_context, WR_VAR_F(id_var), WR_VAR_X(id_var), WR_VAR_Y(id_var)); if (value_ind == SQL_NTS) fprintf(out, "\n"); else fprintf(out, " %.*s\n", (int)value_ind, value); } fprintf(out, "%d element%s in table data\n", count, count != 1 ? "s" : ""); stm.close_cursor(); } } // namespace db } // namespace dballe /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/db/test-utils-db.h0000644000175000017500000000361211446127670014306 00000000000000/* * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include #include #include namespace dballe { namespace tests { struct db_test { // DB handle DB* db; bool has_db() const { return db != NULL; } void use_db(); db_test(); ~db_test(); }; static inline SQL_TIMESTAMP_STRUCT mkts(int year, int month, int day, int hour, int minute, int second) { SQL_TIMESTAMP_STRUCT res; res.year = year; res.month = month; res.day = day; res.hour = hour; res.minute = minute; res.second = second; res.fraction = 0; return res; } } // namespace tests } // namespace dballe namespace std { static inline bool operator!=(const SQL_TIMESTAMP_STRUCT& a, const SQL_TIMESTAMP_STRUCT& b) { return a.year != b.year || a.month != b.month || a.day != b.day || a.hour != b.hour || a.minute != b.minute || a.second != b.second || a.fraction != b.fraction; } static inline std::ostream& operator<<(std::ostream& o, const SQL_TIMESTAMP_STRUCT& t) { char buf[20]; snprintf(buf, 20, "%04d-%02d-%02d %02d:%02d:%02d.%d", t.year, t.month, t.day, t.hour, t.minute, t.second, t.fraction); o << buf; return o; } } // vim:set ts=4 sw=4: dballe-5.18/dballe/db/data.h0000644000175000017500000000560011464771605012521 00000000000000/* * db/data - data table management * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #ifndef DBALLE_DB_DATA_H #define DBALLE_DB_DATA_H /** @file * @ingroup db * * Data table management used by the db module. */ #include #include #include #include namespace dballe { struct DB; namespace db { struct Connection; struct Statement; /** * Precompiled query to manipulate the data table */ struct Data { /** DB connection. */ db::Connection& conn; /** Precompiled insert statement */ db::Statement* istm; /** Precompiled update statement */ db::Statement* ustm; /** Precompiled insert or ignore statement */ db::Statement* iistm; /** Context ID SQL parameter */ DBALLE_SQL_C_SINT_TYPE id_context; /** Variable type SQL parameter */ wreport::Varcode id_var; /** Variable value SQL parameter */ char value[255]; /** Variable value indicator */ SQLLEN value_ind; Data(Connection& conn); ~Data(); /** * Set the value input fields using a wreport::Var */ void set(const wreport::Var& var); /** * Set the value input fields using a string value */ void set_value(const char* value); /** * Insert an entry into the data table, failing on conflicts. * * Trying to replace an existing value will result in an error. */ void insert_or_fail(); /** * Insert an entry into the data table, ignoring conflicts. * * Trying to replace an existing value will do nothing. * * @return true if it was inserted, false if it was already present */ bool insert_or_ignore(); /** * Insert an entry into the data table, overwriting on conflicts. * * An existing data with the same context and ::dba_varcode will be * overwritten. */ void insert_or_overwrite(); /** * Dump the entire contents of the table to an output stream */ void dump(FILE* out); private: // disallow copy Data(const Data&); Data& operator=(const Data&); }; } // namespace db } // namespace dballe /* vim:set ts=4 sw=4: */ #endif dballe-5.18/dballe/db/context.h0000644000175000017500000000654511464767522013310 00000000000000/* * db/context - context table management * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #ifndef DBALLE_DB_CONTEXT_H #define DBALLE_DB_CONTEXT_H /** @file * @ingroup db * * Context table management used by the db module. */ #include #include #include namespace dballe { struct DB; namespace db { struct Connection; struct Statement; /** * Precompiled queries to manipulate the context table */ struct Context { /** * DB connection. */ DB& db; /** Precompiled select statement */ db::Statement* sstm; /** Precompiled select data statement */ db::Statement* sdstm; /** Precompiled insert statement */ db::Statement* istm; /** Precompiled delete statement */ db::Statement* dstm; /** Context ID SQL parameter */ DBALLE_SQL_C_SINT_TYPE id; /** Station ID SQL parameter */ DBALLE_SQL_C_SINT_TYPE id_station; /** Report ID SQL parameter */ DBALLE_SQL_C_SINT_TYPE id_report; /** Date SQL parameter */ SQL_TIMESTAMP_STRUCT date; /** First level type SQL parameter */ DBALLE_SQL_C_SINT_TYPE ltype1; /** Level L1 SQL parameter */ DBALLE_SQL_C_SINT_TYPE l1; /** Second level type SQL parameter */ DBALLE_SQL_C_SINT_TYPE ltype2; /** Level L2 SQL parameter */ DBALLE_SQL_C_SINT_TYPE l2; /** Time range type SQL parameter */ DBALLE_SQL_C_SINT_TYPE pind; /** Time range P1 SQL parameter */ DBALLE_SQL_C_SINT_TYPE p1; /** Time range P2 SQL parameter */ DBALLE_SQL_C_SINT_TYPE p2; Context(DB& db); ~Context(); /** * Get the context id for the current context data. * * @return * The database ID, or -1 if no existing context entry matches the given values */ int get_id(); /** * Get context information given a context ID * * @param id * ID of the context to query */ void get_data(int id); /** * Get the context id for a station info context. * * id_station and id_report must be filled in for the query. * * @return * The database ID */ int obtain_station_info(); /** * Insert a new context in the database * * @return * The ID of the newly inserted context */ int insert(); /** * Remove a context record */ void remove(); /** * Dump the entire contents of the table to an output stream */ void dump(FILE* out); private: // disallow copy Context(const Context&); Context& operator=(const Context&); }; } // namespace db } // namespace dballe /* vim:set ts=4 sw=4: */ #endif dballe-5.18/dballe/db/cursor.cc0000644000175000017500000013615211734350063013261 00000000000000/* * db/cursor - manage select queries * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "cursor.h" #include "db.h" #include "internals.h" #include "repinfo.h" #include #include #include #include #include #include #include #include #include #if 0 #include #include #include #endif using namespace std; using namespace wreport; namespace dballe { namespace db { namespace { /** * Constants used to define what is needed from the FROM part of the query */ /** Add pseudoana to the FROM part of the query */ #define DBA_DB_FROM_PA (1 << 0) /** Add context to the FROM part of the query */ #define DBA_DB_FROM_C (1 << 1) /** Add data to the FROM part of the query */ #define DBA_DB_FROM_D (1 << 2) /** Add repinfo to the FROM part of the query */ #define DBA_DB_FROM_RI (1 << 3) /** Add the pseudoana context as 'cbs' to the FROM part of the query */ #define DBA_DB_FROM_CBS (1 << 4) /** Add the the block variables as 'dblo' to the FROM part of the query */ #define DBA_DB_FROM_DBLO (1 << 5) /** Add the the station variables as 'dsta' to the FROM part of the query */ #define DBA_DB_FROM_DSTA (1 << 6) /** Add the the pseudoana variables as 'dana' to the FROM part of the query */ #define DBA_DB_FROM_DANA (1 << 7) /** Add an extra data table as 'ddf' to the FROM part of the query, to restrict * the query on variable values */ #define DBA_DB_FROM_DDF (1 << 8) /** Add an extra attr table as 'adf' to the FROM part of the query, to restrict * the query on variable attributes */ #define DBA_DB_FROM_ADF (1 << 9) struct QueryBuilder { /** Database to operate on */ DB& db; /** Statement to build variables to */ Statement& stm; /** Cursor with the output variables */ Cursor& cur; /** Dynamically generated SQL query */ Querybuf sql_query; /** WHERE subquery */ Querybuf sql_where; /** What values are wanted from the query */ unsigned int wanted; /** Modifier flags to enable special query behaviours */ unsigned int modifiers; /** What is needed from the SELECT part of the query */ unsigned int select_wanted; /** What is needed from the FROM part of the query */ unsigned int from_wanted; /** Sequence number to use to bind ODBC input parameters */ unsigned int input_seq; /** Sequence number to use to bind ODBC output parameters */ unsigned int output_seq; /** True if we also accept results from the anagraphical context */ bool accept_from_ana_context; /// true if we have already appended the "ORDER BY" clause to the query bool has_orderby; /** Selection parameters (input) for the query * @{ */ SQL_TIMESTAMP_STRUCT sel_dtmin; SQL_TIMESTAMP_STRUCT sel_dtmax; DBALLE_SQL_C_SINT_TYPE sel_latmin; DBALLE_SQL_C_SINT_TYPE sel_latmax; DBALLE_SQL_C_SINT_TYPE sel_lonmin; DBALLE_SQL_C_SINT_TYPE sel_lonmax; char sel_ident[64]; DBALLE_SQL_C_SINT_TYPE sel_ltype1; DBALLE_SQL_C_SINT_TYPE sel_l1; DBALLE_SQL_C_SINT_TYPE sel_ltype2; DBALLE_SQL_C_SINT_TYPE sel_l2; DBALLE_SQL_C_SINT_TYPE sel_pind; DBALLE_SQL_C_SINT_TYPE sel_p1; DBALLE_SQL_C_SINT_TYPE sel_p2; DBALLE_SQL_C_SINT_TYPE sel_b; DBALLE_SQL_C_SINT_TYPE sel_rep_cod; DBALLE_SQL_C_SINT_TYPE sel_ana_id; DBALLE_SQL_C_SINT_TYPE sel_context_id; /** @} */ QueryBuilder(DB& db, Statement& stm, Cursor& cur, int wanted, int modifiers) : db(db), stm(stm), cur(cur), sql_query(2048), sql_where(1024), wanted(wanted), modifiers(modifiers), select_wanted(0), from_wanted(0), input_seq(1), output_seq(1), accept_from_ana_context(false), has_orderby(false) {} /// Initialise query modifiers from the 'query' parameter in \a rec void init_modifiers(const Record& rec); /** * Add one or more fields to the ORDER BY part of sql_query. */ void add_to_orderby(const char* fields); /** * Add extra JOIN clauses to sql_query according to what is wanted. * * @param base * The first table mentioned in the query, to which the other tables are * joined */ void add_other_froms(unsigned int base); /// Resolve table/field dependencies adding the missing bits to from_wanted void resolve_dependencies(); /// Prepare SELECT Part and see what needs to be available in the FROM part void make_select(); /// Build the FROM and WHERE parts of the query void make_from(); /// Add an int field to the WHERE part of the query, binding it as an input parameter void add_int(const Record& rec, DBALLE_SQL_C_SINT_TYPE& in, dba_keyword key, const char* sql, int needed_from); /// Build the WHERE part of the query, and bind the input parameters void make_where(const Record& rec); /// Add repinfo-related WHERE clauses on column \a colname to \a buf from \a query void add_repinfo_where(Querybuf& buf, const Record& query, const char* colname); /// Build the big data query void build_query(const Record& rec); /// Build the query with just SELECT COUNT(*) void build_count_query(const Record& rec); }; } // anonymous namespace Cursor::Cursor(DB& db) : db(db), stm(0) { stm = new db::Statement(*db.conn); } Cursor::~Cursor() { if (stm) delete stm; } void Cursor::reset() { wanted = 0; modifiers = 0; } int Cursor::query(const Record& rec, unsigned int qwanted, unsigned int qmodifiers) { if (db.conn->server_type == ORACLE && !(qmodifiers & DBA_DB_MODIFIER_STREAM)) { /* FIXME: this is a temporary solution giving an approximate row count only: * insert/delete/update queries run between the count and the select will * change the size of the result set */ count = getcount(rec, qwanted, qmodifiers); } reset(); QueryBuilder qb(db, *stm, *this, qwanted, qmodifiers); /* Scan query modifiers */ wanted = qwanted; modifiers = qmodifiers; qb.init_modifiers(rec); qb.build_query(rec); from_wanted = qb.from_wanted; TRACE("Performing query: %s\n", qb.sql_query.c_str()); if (modifiers & DBA_DB_MODIFIER_STREAM && db.conn->server_type != ORACLE) stm->set_cursor_forward_only(); #if 0 //DBA_RUN_OR_RETURN(setstmtattr(cur->stm, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER)SQL_CURSOR_STATIC, SQL_IS_INTEGER, "Setting SQL_CURSOR_STATIC")); DBA_RUN_OR_RETURN(setstmtattr(cur->stm, SQL_ATTR_CURSOR_SCROLLABLE, (SQLPOINTER)SQL_SCROLLABLE, SQL_IS_INTEGER, "Setting SQL_SCROLLABLE")); DBA_RUN_OR_RETURN(setstmtattr(cur->stm, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER)SQL_CURSOR_DYNAMIC, SQL_IS_INTEGER, "Setting SQL_CURSOR_DYNAMIC")); #endif //fprintf(stderr, "********************** 0 ************\n"); //fprintf(stderr, "** Q %s\n", dba_querybuf_get(sql_query)); /* Perform the query */ stm->exec_direct(qb.sql_query.data(), qb.sql_query.size()); /* Get the number of affected rows */ if (db.conn->server_type != ORACLE) count = stm->rowcount(); /* Retrieve results will happen in dba_db_cursor_next() */ return count; } int Cursor::getcount(const Record& rec, unsigned int qwanted, unsigned int qmodifiers) { /* Reset the cursor to start a new query */ reset(); /* Scan query modifiers */ QueryBuilder qb(db, *stm, *this, qwanted, qmodifiers); qb.init_modifiers(rec); qb.build_count_query(rec); TRACE("Performing query: %s\n", qb.sql_query.c_str()); /* fprintf(stderr, "Performing query: %s\n", dba_querybuf_get(sql_query)); */ /* Perform the query */ stm->exec_direct(qb.sql_query.data(), qb.sql_query.size()); if (!stm->fetch()) throw error_consistency("no results when trying to get the row count"); stm->close_cursor(); return count; } int Cursor::remaining() const { return count; } bool Cursor::next() { /* Fetch new data */ bool res = stm->fetch(); if (count != -1) --count; if (!res) stm->close_cursor(); return res; } void Cursor::discard_rest() { stm->close_cursor(); } void Cursor::to_record(Record& rec) { /* Empty the record from old data */ /* See if it works without: in theory if the caller does a record_clear * before the query, all the values coming out of dba_db_cursor_next should * just overwrite the previous ones, as the range of output parameters does * not change */ /* dba_record_clear(rec); */ db::Repinfo& ri = db.repinfo(); if (from_wanted & DBA_DB_FROM_PA) { rec.key(DBA_KEY_ANA_ID).seti(out_ana_id); if (wanted & DBA_DB_WANT_COORDS) { rec.key(DBA_KEY_LAT).seti(out_lat); rec.key(DBA_KEY_LON).seti(out_lon); } if (wanted & DBA_DB_WANT_IDENT) { if (out_ident_ind != SQL_NULL_DATA && out_ident[0] != 0) { rec.key(DBA_KEY_IDENT).setc(out_ident); rec.key(DBA_KEY_MOBILE).seti(1); } else { rec.key_unset(DBA_KEY_IDENT); rec.key(DBA_KEY_MOBILE).seti(0); } } } if (from_wanted & DBA_DB_FROM_C) { rec.key(DBA_KEY_CONTEXT_ID).seti(out_context_id); rec.key(DBA_KEY_REP_COD).seti(out_rep_cod); /* If PA was not wanted, we can still get the ana_id */ if (!(from_wanted & DBA_DB_FROM_PA)) rec.key(DBA_KEY_ANA_ID).seti(out_ana_id); if (wanted & DBA_DB_WANT_LEVEL) { rec.key(DBA_KEY_LEVELTYPE1).seti(out_ltype1); rec.key(DBA_KEY_L1).seti(out_l1); rec.key(DBA_KEY_LEVELTYPE2).seti(out_ltype2); rec.key(DBA_KEY_L2).seti(out_l2); } if (wanted & DBA_DB_WANT_TIMERANGE) { rec.key(DBA_KEY_PINDICATOR).seti(out_pind); rec.key(DBA_KEY_P1).seti(out_p1); rec.key(DBA_KEY_P2).seti(out_p2); } if (wanted & DBA_DB_WANT_DATETIME) { /*fprintf(stderr, "SETTING %s to %d\n", #var, _db_cursor[cur].out_##var); */ /* int year, mon, day, hour, min, sec; if (sscanf(out_datetime, "%04d-%02d-%02d %02d:%02d:%02d", &year, &mon, &day, &hour, &min, &sec) != 6) return dba_error_consistency("parsing datetime string \"%s\"", out_datetime); */ //DBA_RUN_OR_RETURN(dba_record_key_setc(rec, DBA_KEY_DATETIME, out_datetime)); rec.key(DBA_KEY_YEAR).seti(out_datetime.year); rec.key(DBA_KEY_MONTH).seti(out_datetime.month); rec.key(DBA_KEY_DAY).seti(out_datetime.day); rec.key(DBA_KEY_HOUR).seti(out_datetime.hour); rec.key(DBA_KEY_MIN).seti(out_datetime.minute); rec.key(DBA_KEY_SEC).seti(out_datetime.second); } } if (from_wanted & DBA_DB_FROM_D) { if (!(from_wanted & DBA_DB_FROM_C)) rec.key(DBA_KEY_CONTEXT_ID).seti(out_context_id); if (wanted & DBA_DB_WANT_VAR_NAME || wanted & DBA_DB_WANT_VAR_VALUE) { char bname[7]; snprintf(bname, 7, "B%02d%03d", WR_VAR_X(out_varcode), WR_VAR_Y(out_varcode)); rec.key(DBA_KEY_VAR).setc(bname); if (wanted & DBA_DB_WANT_VAR_VALUE) { rec.clear_vars(); rec.var(out_varcode).setc(out_value); } } } if (from_wanted & (DBA_DB_FROM_RI | DBA_DB_FROM_C)) { if (!(from_wanted & DBA_DB_FROM_C)) rec.key(DBA_KEY_REP_COD).seti(out_rep_cod); if (wanted & DBA_DB_WANT_REPCOD) { const repinfo::Cache* c = ri.get_by_id(out_rep_cod); if (c != NULL) { rec.key(DBA_KEY_REP_MEMO).setc(c->memo.c_str()); rec.key(DBA_KEY_PRIORITY).seti(c->prio); } } } if (modifiers & DBA_DB_MODIFIER_ANAEXTRA) add_station_info(rec); } unsigned Cursor::query_attrs(const std::vector& qcs, Record& attrs) { return db.query_attrs(out_context_id, out_varcode, qcs, attrs); } void Cursor::add_station_info(Record& rec) { /* Extra variables to add: * * HEIGHT, B07001 1793 * HEIGHT_BARO, B07031 1823 * ST_NAME, B01019 275 * BLOCK, B01001 257 * STATION, B01002 258 */ #define BASE_QUERY \ "SELECT d.id_var, d.value, ri.id, ri.prio" \ " FROM context c, data d, repinfo ri" \ " WHERE c.id = d.id_context AND ri.id = c.id_report AND c.id_ana = ?" \ " AND c.datetime = {ts '1000-01-01 00:00:00.000'}" \ " AND c.ltype1 = 257" const char* query; switch (db.conn->server_type) { case MYSQL: query = BASE_QUERY " GROUP BY d.id_var,ri.id " "HAVING ri.prio=MAX(ri.prio)"; break; default: query = BASE_QUERY " AND ri.prio=(" " SELECT MAX(sri.prio) FROM repinfo sri" " JOIN context sc ON sri.id=sc.id_report" " JOIN data sd ON sc.id=sd.id_context" " WHERE sc.id_ana=c.id_ana" " AND sc.ltype1=c.ltype1 AND sc.l1=c.l1 AND sc.ltype2=c.ltype2 AND sc.l2=c.l2" " AND sc.ptype=c.ptype AND sc.p1=c.p1 AND sc.p2=c.p2" " AND sc.datetime=c.datetime AND sd.id_var=d.id_var)"; break; } #undef BASE_QUERY unsigned short st_out_code; char st_out_val[256]; SQLLEN st_out_val_ind; DBALLE_SQL_C_SINT_TYPE st_out_rep_cod; /* Allocate statement handle */ db::Statement stm(*db.conn); /* Bind input fields */ stm.bind_in(1, out_ana_id); /* Bind output fields */ stm.bind_out(1, st_out_code); stm.bind_out(2, st_out_val, sizeof(st_out_val), st_out_val_ind); stm.bind_out(3, st_out_rep_cod); /* Perform the query */ stm.exec_direct(query); /* Get the results and save them in the record */ while (stm.fetch()) { rec.var(st_out_code).setc(st_out_val); rec.key(DBA_KEY_REP_COD).seti(out_rep_cod); } } void QueryBuilder::build_query(const Record& rec) { int limit = -1; if (const Var* var = rec.key_peek(DBA_KEY_LIMIT)) limit = var->enqi(); if (limit != -1 && db.conn->server_type == ORACLE && (modifiers & DBA_DB_MODIFIER_BEST)) throw error_unimplemented("best-value queries with result limit are not implemented for Oracle"); sql_query.append("SELECT "); if (modifiers & DBA_DB_MODIFIER_DISTINCT) sql_query.append("DISTINCT "); if (modifiers & DBA_DB_MODIFIER_BIGANA && db.conn->server_type == MYSQL) sql_query.append("straight_join "); /* Prepare WHERE part and see what needs to be available in the FROM part */ make_where(rec); /* Prepare SELECT Part and see what needs to be available in the FROM part. * We do this after creating the WHERE part, so that we can add * more opportunistic extra values (see the end of make_select) */ make_select(); /* Solve dependencies among the various parts of the query */ resolve_dependencies(); /* Append the FROM part of the query */ make_from(); /* Append the WHERE part that we prepared previously */ if (!sql_where.empty()) { sql_query.append("WHERE "); sql_query.append(sql_where); } /* Append ORDER BY as needed */ if (!(modifiers & DBA_DB_MODIFIER_UNSORTED)) { if (limit != -1 && db.conn->server_type == ORACLE) throw error_unimplemented("sorted queries with result limit are not implemented for Oracle"); if (modifiers & DBA_DB_MODIFIER_BEST) { sql_query.append("ORDER BY c.id_ana, c.datetime, c.ltype1, c.l1, c.ltype2, c.l2, c.ptype, c.p1, c.p2"); } else if (select_wanted & DBA_DB_FROM_C) { if (wanted & DBA_DB_WANT_ANA_ID) add_to_orderby("c.id_ana"); if (modifiers & DBA_DB_MODIFIER_SORT_FOR_EXPORT) add_to_orderby("c.id_report"); if (wanted & DBA_DB_WANT_DATETIME) add_to_orderby("c.datetime"); if (wanted & DBA_DB_WANT_LEVEL) add_to_orderby("c.ltype1, c.l1, c.ltype2, c.l2"); if (wanted & DBA_DB_WANT_TIMERANGE) add_to_orderby("c.ptype, c.p1, c.p2"); if (!(modifiers & DBA_DB_MODIFIER_SORT_FOR_EXPORT) && (wanted & DBA_DB_WANT_REPCOD)) { if (select_wanted & DBA_DB_FROM_RI) add_to_orderby("ri.prio"); else add_to_orderby("c.id_report"); } } else if (select_wanted & DBA_DB_FROM_PA) { if (wanted & DBA_DB_WANT_ANA_ID) add_to_orderby("pa.id"); if (wanted & DBA_DB_WANT_IDENT) add_to_orderby("pa.ident"); } } /* Append LIMIT if requested */ if (limit != -1) { if (db.conn->server_type == ORACLE) { sql_query.appendf(" AND rownum <= %d", limit); } else { sql_query.appendf(" LIMIT %d", limit); } } } void QueryBuilder::build_count_query(const Record& rec) { init_modifiers(rec); sql_query.append("SELECT "); #if 0 if (cur->modifiers & DBA_DB_MODIFIER_DISTINCT) DBA_RUN_OR_RETURN(dba_querybuf_append(sql_query, "COUNT(DISTINCT *) ")); else #endif sql_query.append("COUNT(*) "); stm.bind_out(output_seq++, cur.count); /* Prepare WHERE part and see what needs to be available in the FROM part */ make_where(rec); /* Solve dependencies among the various parts of the query */ resolve_dependencies(); /* Append the FROM part of the query */ make_from(); /* Append the WHERE part that we prepared previously */ if (!sql_where.empty()) { sql_query.append("WHERE "); sql_query.append(sql_where); } } void QueryBuilder::make_from() { /* Ignore anagraphical context unless explicitly requested */ if (from_wanted & DBA_DB_FROM_C && !accept_from_ana_context) { sql_where.append_list("c.datetime>={ts '1001-01-01 00:00:00.000'}"); TRACE("ignoring station info context as it has not been explicitly requested: adding AND c.datetime >= {ts '1001-01-01 00:00:00.000'}\n"); } /* Create the FROM part with everything that is needed */ if (from_wanted & DBA_DB_FROM_C) { sql_query.append(" FROM context c "); add_other_froms(DBA_DB_FROM_C); } else if (from_wanted & DBA_DB_FROM_PA) { sql_query.append(" FROM station pa "); add_other_froms(DBA_DB_FROM_PA); } else if (from_wanted & DBA_DB_FROM_D) { sql_query.append(" FROM data d "); add_other_froms(DBA_DB_FROM_D); } else if (from_wanted & DBA_DB_FROM_RI) { sql_query.append(" FROM repinfo ri "); add_other_froms(DBA_DB_FROM_RI); } } void QueryBuilder::init_modifiers(const Record& rec) { /* Decode query modifiers */ const char* val = rec.key_peek_value(DBA_KEY_QUERY); if (!val) return; const char* s = val; while (*s) { size_t len = strcspn(s, ","); int got = 1; switch (len) { case 0: /* If it's an empty token, skip it */ break; case 4: /* "best": if more values exist in a point, get only the best one */ if (strncmp(s, "best", 4) == 0) { modifiers |= DBA_DB_MODIFIER_BEST; from_wanted |= DBA_DB_FROM_D; from_wanted |= DBA_DB_FROM_RI; } else got = 0; break; case 6: /* "bigana": optimize with date first */ if (strncmp(s, "bigana", 6) == 0) modifiers |= DBA_DB_MODIFIER_BIGANA; else if (strncmp(s, "nosort", 6) == 0) modifiers |= DBA_DB_MODIFIER_UNSORTED; else if (strncmp(s, "stream", 6) == 0) modifiers |= DBA_DB_MODIFIER_STREAM; else got = 0; break; default: got = 0; break; } /* Check that we parsed it correctly */ if (!got) error_consistency::throwf("Query modifier \"%.*s\" is not recognized", (int)len, s); /* Move to the next token */ s += len; if (*s == ',') ++s; } } void QueryBuilder::add_to_orderby(const char* fields) { if (!has_orderby) { sql_query.append(" ORDER BY "); has_orderby = true; } else sql_query.append(", "); sql_query.append(fields); } void QueryBuilder::add_other_froms(unsigned int base) { /* Remove the base table from the things to add */ unsigned int wanted = from_wanted & ~base; if (wanted & DBA_DB_FROM_PA) sql_query.append("JOIN station pa ON c.id_ana = pa.id "); if (wanted & DBA_DB_FROM_C) switch (base) { case DBA_DB_FROM_PA: sql_query.append("JOIN context c ON c.id_ana=pa.id "); break; case DBA_DB_FROM_D: sql_query.append("JOIN context c ON c.id=d.id_context "); break; case DBA_DB_FROM_RI: sql_query.append("JOIN context c ON c.id_report=ri.id "); break; default: error_consistency::throwf("requested to add a JOIN on context on the unsupported base %d", base); } if (wanted & DBA_DB_FROM_CBS) switch (base) { case DBA_DB_FROM_PA: /* * If we are here, it means that no rep_cod or rep_memo has * been specified, and either height or ana_filter have been * asked. This means that we cannot know what network should * be used. DBA_RUN_OR_RETURN(dba_querybuf_append(sql_query, " JOIN context cbs ON pa.id=cbs.id_ana" " AND cbs.id_report=254" " AND cbs.datetime={ts '1000-01-01 00:00:00.000'}" " AND cbs.ltype=257 AND cbs.l1=0 AND cbs.l2=0" " AND cbs.ptype=0 AND cbs.p1=0 AND cbs.p2=0 ")); break; */ throw error_consistency("please specify rep_cod or rep_memo among the query parameters, otherwise the query is ambiguous in this case"); case DBA_DB_FROM_C: sql_query.append( " JOIN context cbs ON c.id_ana=cbs.id_ana" " AND cbs.id_report=c.id_report" " AND cbs.datetime={ts '1000-01-01 00:00:00.000'}" " AND cbs.ltype1=257 "); break; default: error_consistency::throwf("requested to add a JOIN on station info context on the unsupported base %d", base); } if (wanted & DBA_DB_FROM_D) sql_query.append("JOIN data d ON d.id_context=c.id "); if (wanted & DBA_DB_FROM_RI) sql_query.append("JOIN repinfo ri ON ri.id=c.id_report "); if (wanted & DBA_DB_FROM_DBLO) sql_query.append("JOIN data dblo ON dblo.id_context=cbs.id AND dblo.id_var=257 "); if (wanted & DBA_DB_FROM_DSTA) sql_query.append("JOIN data dsta ON dsta.id_context=cbs.id AND dsta.id_var=258 "); if (wanted & DBA_DB_FROM_DANA) sql_query.append("JOIN data dana ON dana.id_context=cbs.id "); if (wanted & DBA_DB_FROM_DDF) sql_query.append("JOIN data ddf ON ddf.id_context=c.id "); if (wanted & DBA_DB_FROM_ADF) sql_query.append("JOIN attr adf ON adf.id_context=c.id AND adf.id_var=d.id_var "); } void QueryBuilder::resolve_dependencies() { if (wanted & DBA_DB_WANT_COORDS) from_wanted |= DBA_DB_FROM_PA; if (wanted & DBA_DB_WANT_IDENT) from_wanted |= DBA_DB_FROM_PA; if (wanted & DBA_DB_WANT_LEVEL) from_wanted |= DBA_DB_FROM_C; if (wanted & DBA_DB_WANT_TIMERANGE) from_wanted |= DBA_DB_FROM_C; if (wanted & DBA_DB_WANT_DATETIME) from_wanted |= DBA_DB_FROM_C; if (wanted & DBA_DB_WANT_REPCOD) from_wanted |= DBA_DB_FROM_C; if (wanted & DBA_DB_WANT_VAR_NAME || wanted & DBA_DB_WANT_VAR_VALUE) from_wanted |= DBA_DB_FROM_D; /* If querybest is used, then we need ri.prio here so that GROUP BY can use it */ if (modifiers & DBA_DB_MODIFIER_BEST) from_wanted |= DBA_DB_FROM_RI; /* For these parameters we can try to be opportunistic and avoid extra joins */ if (wanted & DBA_DB_WANT_ANA_ID) { if (!(from_wanted & DBA_DB_FROM_PA) && from_wanted & DBA_DB_FROM_C) { } else { from_wanted |= DBA_DB_FROM_PA; } } if (wanted & DBA_DB_WANT_CONTEXT_ID) { if (!(from_wanted & DBA_DB_FROM_C) && from_wanted & DBA_DB_FROM_D) { } else { from_wanted |= DBA_DB_FROM_C; } } /* Enforce join dependencies */ if (from_wanted & (DBA_DB_FROM_DBLO | DBA_DB_FROM_DSTA | DBA_DB_FROM_DANA)) from_wanted |= DBA_DB_FROM_CBS; if (from_wanted & (DBA_DB_FROM_DDF)) from_wanted |= DBA_DB_FROM_C; if (from_wanted & (DBA_DB_FROM_ADF)) from_wanted |= (DBA_DB_FROM_C | DBA_DB_FROM_D); if (from_wanted & DBA_DB_FROM_PA && from_wanted & DBA_DB_FROM_D) from_wanted |= DBA_DB_FROM_C; if (from_wanted & (DBA_DB_FROM_CBS)) from_wanted |= DBA_DB_FROM_C; /* Always join with context if we need to weed out the extra ana data */ if (modifiers & DBA_DB_MODIFIER_NOANAEXTRA) from_wanted |= DBA_DB_FROM_C; } void QueryBuilder::make_select() { sql_query.start_list(", "); if (wanted & DBA_DB_WANT_COORDS) { from_wanted |= DBA_DB_FROM_PA; select_wanted |= DBA_DB_FROM_PA; sql_query.append_list("pa.lat"); stm.bind_out(output_seq++, cur.out_lat); sql_query.append_list("pa.lon"); stm.bind_out(output_seq++, cur.out_lon); } if (wanted & DBA_DB_WANT_IDENT) { from_wanted |= DBA_DB_FROM_PA; select_wanted |= DBA_DB_FROM_PA; sql_query.append_list("pa.ident"); stm.bind_out(output_seq++, cur.out_ident, sizeof(cur.out_ident), cur.out_ident_ind); } if (wanted & DBA_DB_WANT_LEVEL) { from_wanted |= DBA_DB_FROM_C; select_wanted |= DBA_DB_FROM_C; sql_query.append_list("c.ltype1"); stm.bind_out(output_seq++, cur.out_ltype1); sql_query.append_list("c.l1"); stm.bind_out(output_seq++, cur.out_l1); sql_query.append_list("c.ltype2"); stm.bind_out(output_seq++, cur.out_ltype2); sql_query.append_list("c.l2"); stm.bind_out(output_seq++, cur.out_l2); } if (wanted & DBA_DB_WANT_TIMERANGE) { from_wanted |= DBA_DB_FROM_C; select_wanted |= DBA_DB_FROM_C; sql_query.append_list("c.ptype"); stm.bind_out(output_seq++, cur.out_pind); sql_query.append_list("c.p1"); stm.bind_out(output_seq++, cur.out_p1); sql_query.append_list("c.p2"); stm.bind_out(output_seq++, cur.out_p2); } if (wanted & DBA_DB_WANT_DATETIME) { from_wanted |= DBA_DB_FROM_C; select_wanted |= DBA_DB_FROM_C; sql_query.append_list("c.datetime"); stm.bind_out(output_seq++, cur.out_datetime); } if (wanted & DBA_DB_WANT_REPCOD) { from_wanted |= DBA_DB_FROM_C; select_wanted |= DBA_DB_FROM_D; sql_query.append_list("c.id_report"); stm.bind_out(output_seq++, cur.out_rep_cod); } if (wanted & DBA_DB_WANT_VAR_NAME || wanted & DBA_DB_WANT_VAR_VALUE) { from_wanted |= DBA_DB_FROM_D; select_wanted |= DBA_DB_FROM_D; sql_query.append_list("d.id_var"); stm.bind_out(output_seq++, cur.out_varcode); if (wanted & DBA_DB_WANT_VAR_VALUE) { from_wanted |= DBA_DB_FROM_D; select_wanted |= DBA_DB_FROM_D; sql_query.append_list("d.value"); stm.bind_out(output_seq++, cur.out_value, sizeof(cur.out_value)); } } /* If querybest is used, then we need ri.prio here so that GROUP BY can use it */ if (modifiers & DBA_DB_MODIFIER_BEST) { from_wanted |= DBA_DB_FROM_RI; select_wanted |= DBA_DB_FROM_RI; sql_query.append_list("ri.prio"); stm.bind_out(output_seq++, cur.out_priority); } /* For these parameters we can try to be opportunistic and avoid extra joins */ if (wanted & DBA_DB_WANT_ANA_ID) { if (select_wanted & DBA_DB_FROM_PA) { /* Try pa first */ sql_query.append_list("pa.id"); stm.bind_out(output_seq++, cur.out_ana_id); } else if (select_wanted & DBA_DB_FROM_C) { /* Then c */ sql_query.append_list("c.id_ana"); stm.bind_out(output_seq++, cur.out_ana_id); } else { /* If we don't have anything to reuse, get it from pa */ sql_query.append_list("pa.id"); stm.bind_out(output_seq++, cur.out_ana_id); from_wanted |= DBA_DB_FROM_PA; select_wanted |= DBA_DB_FROM_PA; } } if (wanted & DBA_DB_WANT_CONTEXT_ID) { if (select_wanted & DBA_DB_FROM_C) { /* Try c first */ sql_query.append_list("c.id"); stm.bind_out(output_seq++, cur.out_context_id); } else if (select_wanted & DBA_DB_FROM_D) { /* Then c */ sql_query.append_list("d.id_context"); stm.bind_out(output_seq++, cur.out_context_id); } else { /* If we don't have anything to reuse, get it from c */ sql_query.append_list("c.id"); stm.bind_out(output_seq++, cur.out_context_id); from_wanted |= DBA_DB_FROM_C; } } } void QueryBuilder::add_int(const Record& rec, DBALLE_SQL_C_SINT_TYPE& in, dba_keyword key, const char* sql, int needed_from) { const Var* var = rec.key_peek(key); if (!var || !var->isset()) return; in = var->enqi(); //TRACE("found %s: adding %s. val is %d\n", info(key)->desc, sql, *out); sql_where.append_list(sql); stm.bind_in(input_seq++, in); from_wanted |= needed_from; } // Normalise longitude values to the [-180..180[ interval static inline int normalon(int lon) { return ((lon + 18000000) % 36000000) - 18000000; } static Varcode parse_varcode(const char* str, regmatch_t pos) { Varcode res; /* Parse the varcode */ if (str[pos.rm_so] == 'B') res = WR_STRING_TO_VAR(str + pos.rm_so + 1); else res = varcode_alias_resolve_substring(str + pos.rm_so, pos.rm_eo - pos.rm_so); if (res == 0) error_consistency::throwf("cannot resolve the variable code or alias in \"%.*s\"", pos.rm_eo - pos.rm_so, str + pos.rm_so); return res; } static void parse_value(const char* str, regmatch_t pos, Varinfo info, char* value) { /* Parse the value */ const char* s = str + pos.rm_so; int len = pos.rm_eo - pos.rm_so; if (info->is_string()) { /* Copy the string, escaping quotes */ int i = 0, j = 0; value[j++] = '\''; for (; i < len && j < 253; ++i, ++j) { if (s[i] == '\'') value[j++] = '\\'; value[j] = s[i]; } value[j++] = '\''; value[j] = 0; } else { double dval; if (sscanf(s, "%lf", &dval) != 1) error_consistency::throwf("value in \"%.*s\" must be a number", len, s); Var tmpvar(info, dval); strncpy(value, tmpvar.value(), 255); value[254] = 0; } } Varinfo decode_data_filter(const char* filter, const char** op, const char** val, const char** val1) { static regex_t* re_normal = NULL; static regex_t* re_between = NULL; regmatch_t matches[4]; static char oper[5]; static char value[255]; static char value1[255]; #if 0 size_t len = strcspn(filter, "<=>"); const char* s = filter + len; #endif Varcode code; /* Compile the regular expression if it has not yet been done */ if (re_normal == NULL) { re_normal = new regex_t; if (int res = regcomp(re_normal, "^([^<=>]+)([<=>]+)([^<=>]+)$", REG_EXTENDED)) throw error_regexp(res, re_normal, "compiling regular expression to match normal filters"); } if (re_between == NULL) { re_between = new regex_t; if (int res = regcomp(re_between, "^([^<=>]+)<=([^<=>]+)<=([^<=>]+)$", REG_EXTENDED)) throw error_regexp(res, re_between, "compiling regular expression to match 'between' filters"); } int res = regexec(re_normal, filter, 4, matches, 0); if (res != 0 && res != REG_NOMATCH) error_regexp::throwf(res, re_normal, "Trying to parse '%s' as a 'normal' filter", filter); if (res == 0) { int len; /* We have a normal filter */ /* Parse the varcode */ code = parse_varcode(filter, matches[1]); /* Query informations for the varcode */ Varinfo info = varinfo(code); /* Parse the operator */ len = matches[2].rm_eo - matches[2].rm_so; if (len > 4) error_consistency::throwf("operator %.*s is not valid", len, filter + matches[2].rm_so); memcpy(oper, filter + matches[2].rm_so, len); oper[len] = 0; if (strcmp(oper, "!=") == 0) *op = "<>"; else if (strcmp(oper, "==") == 0) *op = "="; else *op = oper; /* Parse the value */ parse_value(filter, matches[3], info, value); *val = value; *val1 = NULL; return info; } else { res = regexec(re_between, filter, 4, matches, 0); if (res == REG_NOMATCH) error_consistency::throwf("%s is not a valid filter", filter); if (res != 0) error_regexp::throwf(res, re_normal, "Trying to parse '%s' as a 'between' filter", filter); /* We have a between filter */ /* Parse the varcode */ code = parse_varcode(filter, matches[2]); /* Query informations for the varcode */ Varinfo info = varinfo(code); /* No need to parse the operator */ oper[0] = 0; *op = oper; /* Parse the values */ parse_value(filter, matches[1], info, value); parse_value(filter, matches[3], info, value1); *val = value; *val1 = value1; return info; } } /* * Create the WHERE part of the query */ void QueryBuilder::make_where(const Record& rec) { //DBA_RUN_OR_RETURN(dba_db_need_repinfo(cur->db)); sql_where.start_list(" AND "); // fprintf(stderr, "A1 '%s'\n", dba_querybuf_get(sql_where)); add_int(rec, sel_ana_id, DBA_KEY_ANA_ID, "pa.id=?", DBA_DB_FROM_PA); add_int(rec, sel_latmin, DBA_KEY_LAT, "pa.lat=?", DBA_DB_FROM_PA); add_int(rec, sel_latmin, DBA_KEY_LATMIN, "pa.lat>=?", DBA_DB_FROM_PA); add_int(rec, sel_latmax, DBA_KEY_LATMAX, "pa.lat<=?", DBA_DB_FROM_PA); //add_int(rec, cur->sel_lonmin, DBA_KEY_LON, "pa.lon=?", DBA_DB_FROM_PA); if (const char* val = rec.key_peek_value(DBA_KEY_LON)) { sel_lonmin = normalon(strtol(val, 0, 10)); sql_where.append_list("pa.lon=?"); stm.bind_in(input_seq++, sel_lonmin); from_wanted |= DBA_DB_FROM_PA; } if (rec.key_peek_value(DBA_KEY_LONMIN) && rec.key_peek_value(DBA_KEY_LONMAX)) { sel_lonmin = normalon(rec.key(DBA_KEY_LONMIN).enqi()); sel_lonmax = normalon(rec.key(DBA_KEY_LONMAX).enqi()); if (sel_lonmin < sel_lonmax) { sql_where.append_list("pa.lon>=? AND pa.lon<=?"); } else { sql_where.append_list("((pa.lon>=? AND pa.lon<=18000000) OR (pa.lon>=-18000000 AND pa.lon<=?))"); } stm.bind_in(input_seq++, sel_lonmin); stm.bind_in(input_seq++, sel_lonmax); from_wanted |= DBA_DB_FROM_PA; } else if (rec.key_peek_value(DBA_KEY_LONMIN) != NULL) { throw error_consistency("'lonmin' query parameter was specified without 'lonmax'"); } else if (rec.key_peek_value(DBA_KEY_LONMAX) != NULL) { throw error_consistency("'lonmax' query parameter was specified without 'lonmin'"); } // fprintf(stderr, "A2 '%s'\n", dba_querybuf_get(sql_where)); if (const char* val = rec.key_peek_value(DBA_KEY_MOBILE)) { if (val[0] == '0') { sql_where.append_list("pa.ident IS NULL"); TRACE("found fixed/mobile: adding AND pa.ident IS NULL.\n"); } else { sql_where.append_list("NOT (pa.ident IS NULL)"); TRACE("found fixed/mobile: adding AND NOT (pa.ident IS NULL)\n"); } from_wanted |= DBA_DB_FROM_PA; } if (const char* val = rec.key_peek_value(DBA_KEY_IDENT)) { strncpy(sel_ident, val, 64); sel_ident[63] = 0; sql_where.append_list("pa.ident=?"); TRACE("found ident: adding AND pa.ident = ?. val is %s\n", sel_ident); stm.bind_in(input_seq++, sel_ident); from_wanted |= DBA_DB_FROM_PA; } /* Set the time extremes */ { int minvalues[6], maxvalues[6]; rec.parse_date_extremes(minvalues, maxvalues); if (minvalues[0] != -1 || maxvalues[0] != -1) { if (memcmp(minvalues, maxvalues, 6 * sizeof(int)) == 0) { /* Add constraint on the exact date interval */ sel_dtmin.year = minvalues[0]; sel_dtmin.month = minvalues[1]; sel_dtmin.day = minvalues[2]; sel_dtmin.hour = minvalues[3]; sel_dtmin.minute = minvalues[4]; sel_dtmin.second = minvalues[5]; sel_dtmin.fraction = 0; sql_where.append_list("c.datetime=?"); TRACE("found exact time: adding AND c.datetime=?. val is %04d-%02d-%02d %02d:%02d:%02d\n", minvalues[0], minvalues[1], minvalues[2], minvalues[3], minvalues[4], minvalues[5]); stm.bind_in(input_seq++, sel_dtmin); from_wanted |= DBA_DB_FROM_C; } else { if (minvalues[0] != -1) { /* Add constraint on the minimum date interval */ sel_dtmin.year = minvalues[0]; sel_dtmin.month = minvalues[1]; sel_dtmin.day = minvalues[2]; sel_dtmin.hour = minvalues[3]; sel_dtmin.minute = minvalues[4]; sel_dtmin.second = minvalues[5]; sel_dtmin.fraction = 0; sql_where.append_list("c.datetime>=?"); TRACE("found min time: adding AND c.datetime>=?. val is %04d-%02d-%02d %02d:%02d:%02d\n", minvalues[0], minvalues[1], minvalues[2], minvalues[3], minvalues[4], minvalues[5]); stm.bind_in(input_seq++, sel_dtmin); from_wanted |= DBA_DB_FROM_C; } if (maxvalues[0] != -1) { sel_dtmax.year = maxvalues[0]; sel_dtmax.month = maxvalues[1]; sel_dtmax.day = maxvalues[2]; sel_dtmax.hour = maxvalues[3]; sel_dtmax.minute = maxvalues[4]; sel_dtmax.second = maxvalues[5]; sel_dtmax.fraction = 0; sql_where.append_list("c.datetime<=?"); TRACE("found max time: adding AND c.datetime<=?. val is %04d-%02d-%02d %02d:%02d:%02d\n", minvalues[0], minvalues[1], minvalues[2], minvalues[3], minvalues[4], minvalues[5]); stm.bind_in(input_seq++, sel_dtmax); from_wanted |= DBA_DB_FROM_C; } } } if (rec.key_peek_value(DBA_KEY_CONTEXT_ID) != NULL || minvalues[0] == 1000 || maxvalues[0] == 1000) accept_from_ana_context = 1; if (modifiers & DBA_DB_MODIFIER_NOANAEXTRA) accept_from_ana_context = 0; } // fprintf(stderr, "A3 '%s'\n", dba_querybuf_get(sql_where)); add_int(rec, sel_ltype1, DBA_KEY_LEVELTYPE1, "c.ltype1=?", DBA_DB_FROM_C); add_int(rec, sel_l1, DBA_KEY_L1, "c.l1=?", DBA_DB_FROM_C); add_int(rec, sel_ltype2, DBA_KEY_LEVELTYPE2, "c.ltype2=?", DBA_DB_FROM_C); add_int(rec, sel_l2, DBA_KEY_L2, "c.l2=?", DBA_DB_FROM_C); add_int(rec, sel_pind, DBA_KEY_PINDICATOR, "c.ptype=?", DBA_DB_FROM_C); add_int(rec, sel_p1, DBA_KEY_P1, "c.p1=?", DBA_DB_FROM_C); add_int(rec, sel_p2, DBA_KEY_P2, "c.p2=?", DBA_DB_FROM_C); add_int(rec, sel_context_id, DBA_KEY_CONTEXT_ID, "c.id = ?", DBA_DB_FROM_C); /* rep_memo has priority over rep_cod */ if (const char* val = rec.key_peek_value(DBA_KEY_REP_MEMO)) { int src_val = db.repinfo().get_id(val); sel_rep_cod = src_val; sql_where.append_list("c.id_report=?"); TRACE("found rep_memo %s: adding AND c.id_report = ?. val is %d\n", val, (int)sel_rep_cod); stm.bind_in(input_seq++, sel_rep_cod); from_wanted |= DBA_DB_FROM_C; } else add_int(rec, sel_rep_cod, DBA_KEY_REP_COD, "c.id_report=?", DBA_DB_FROM_C); if (const char* val = rec.key_peek_value(DBA_KEY_VAR)) { sel_b = descriptor_code(val); sql_where.append_list("d.id_var=?"); TRACE("found b: adding AND d.id_var = ?. val is %d %s\n", (int)sel_b, val); stm.bind_in(input_seq++, sel_b); from_wanted |= DBA_DB_FROM_D; } if (const char* val = rec.key_peek_value(DBA_KEY_VARLIST)) { size_t pos; size_t len; sql_where.append_list("d.id_var IN ("); for (pos = 0; (len = strcspn(val + pos, ",")) > 0; pos += len + 1) { Varcode code = WR_STRING_TO_VAR(val + pos + 1); if (pos == 0) sql_where.appendf("%d", code); else sql_where.appendf(",%d", code); } sql_where.append(")"); TRACE("found blist: adding AND d.id_var IN (%s)\n", val); from_wanted |= DBA_DB_FROM_D; } add_repinfo_where(sql_where, rec, "ri"); if (const char* val = rec.var_peek_value(WR_VAR(0, 1, 1))) { sql_where.append_list("dblo.value="); sql_where.append(val); from_wanted |= DBA_DB_FROM_DBLO; } if (const char* val = rec.var_peek_value(WR_VAR(0, 1, 2))) { sql_where.append_list("dsta.value="); sql_where.append(val); from_wanted |= DBA_DB_FROM_DSTA; } if (const char* val = rec.key_peek_value(DBA_KEY_ANA_FILTER)) { const char *op, *value, *value1; Varinfo info = decode_data_filter(val, &op, &value, &value1); sql_where.append_list("dana.id_var="); if (value1 == NULL) sql_where.appendf("%d AND dana.value%s%s", info->var, op, value); else sql_where.appendf("%d AND dana.value BETWEEN %s AND %s", info->var, value, value1); from_wanted |= DBA_DB_FROM_DANA; } if (const char* val = rec.key_peek_value(DBA_KEY_DATA_FILTER)) { const char *op, *value, *value1; Varinfo info = decode_data_filter(val, &op, &value, &value1); sql_where.append_list("ddf.id_var="); if (value1 == NULL) sql_where.appendf("%d AND ddf.value%s%s", info->var, op, value); else sql_where.appendf("%d AND ddf.value BETWEEN %s AND %s", info->var, value, value1); from_wanted |= DBA_DB_FROM_DDF; } if (const char* val = rec.key_peek_value(DBA_KEY_ATTR_FILTER)) { const char *op, *value, *value1; Varinfo info = decode_data_filter(val, &op, &value, &value1); sql_where.append_list("adf.type="); if (value1 == NULL) sql_where.appendf("%d AND adf.value%s%s", info->var, op, value); else sql_where.appendf("%d AND adf.value BETWEEN %s AND %s", info->var, value, value1); from_wanted |= DBA_DB_FROM_ADF; } if (modifiers & DBA_DB_MODIFIER_BEST) { sql_where.append( " AND ri.prio=(SELECT MAX(sri.prio) FROM repinfo sri JOIN context sc ON sri.id=sc.id_report JOIN data sd ON sc.id=sd.id_context WHERE "); sql_where.start_list(" AND "); add_repinfo_where(sql_where, rec, "sri"); sql_where.append_list( "sc.id_ana=c.id_ana AND sc.ltype1=c.ltype1 AND sc.l1=c.l1 AND sc.ltype2=c.ltype2 AND sc.l2=c.l2 AND sc.ptype=c.ptype AND sc.p1=c.p1 AND sc.p2=c.p2 AND sc.datetime=c.datetime AND sd.id_var=d.id_var) "); } } void QueryBuilder::add_repinfo_where(Querybuf& buf, const Record& rec, const char* colname) { const char* val; #define ADD_INT(key, sql, needed) do { \ if ((val = rec.key_peek_value(key)) != NULL) { \ int ival = strtol(val, 0, 10); \ /*TRACE("found %s: adding %s. val is %d\n", info(key)->desc, sql, *out);*/ \ buf.append_listf(sql, colname, ival); \ from_wanted |= needed; \ } } while (0) ADD_INT(DBA_KEY_PRIORITY, "%s.prio=%d", DBA_DB_FROM_RI); ADD_INT(DBA_KEY_PRIOMIN, "%s.prio>=%d", DBA_DB_FROM_RI); ADD_INT(DBA_KEY_PRIOMAX, "%s.prio<=%d", DBA_DB_FROM_RI); #undef ADD_INT } #if 0 static dba_err rowcount(dba_db db, const char* table, DBALLE_SQL_C_SINT_TYPE* count) { dba_err err = DBA_OK; SQLHSTMT stm = NULL; char buf[100]; int len, res; /* Allocate statement handle */ DBA_RUN_OR_GOTO(cleanup, dba_db_statement_create(db, &stm)); /* Bind count directly in the output */ SQLBindCol(stm, 1, DBALLE_SQL_C_SINT, count, sizeof(*count), NULL); len = snprintf(buf, 100, "SELECT COUNT(*) FROM %s", table); res = SQLExecDirect(stm, (unsigned char*)buf, len); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { err = dba_db_error_odbc(SQL_HANDLE_STMT, stm, "Counting the elements of table %s", table); goto cleanup; } /* Get the result */ if (SQLFetch(stm) == SQL_NO_DATA) { err = dba_error_consistency("no results from database when querying row count of table %s", table); goto cleanup; } cleanup: if (stm != NULL) SQLFreeHandle(SQL_HANDLE_STMT, stm); return err == DBA_OK ? dba_error_ok() : err; } static dba_err setstmtattr(SQLHSTMT stm, SQLINTEGER attr, SQLPOINTER val, SQLINTEGER len, const char* context) { int res = SQLSetStmtAttr(stm, attr, val, len); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) return dba_db_error_odbc(SQL_HANDLE_STMT, stm, context); return dba_error_ok(); } #endif } // namespace db } // namespace dballe /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/db/attr.cc0000644000175000017500000001272011464771022012712 00000000000000/* * db/attr - attr table management * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "attr.h" #include "internals.h" #include #include #include using namespace wreport; using namespace std; namespace dballe { namespace db { Attr::Attr(Connection& conn) : conn(conn), sstm(0), istm(0), rstm(0) { const char* select_query = "SELECT type, value FROM attr WHERE id_context=? and id_var=?"; const char* insert_query = "INSERT INTO attr (id_context, id_var, type, value)" " VALUES(?, ?, ?, ?)"; const char* replace_query_mysql = "INSERT INTO attr (id_context, id_var, type, value)" " VALUES(?, ?, ?, ?) ON DUPLICATE KEY UPDATE value=VALUES(value)"; const char* replace_query_sqlite = "INSERT OR REPLACE INTO attr (id_context, id_var, type, value)" " VALUES(?, ?, ?, ?)"; const char* replace_query_oracle = "MERGE INTO attr USING" " (SELECT ? as cnt, ? as var, ? as t, ? as val FROM dual)" " ON (id_context=cnt AND id_var=var AND type=t)" " WHEN MATCHED THEN UPDATE SET value=val" " WHEN NOT MATCHED THEN" " INSERT (id_context, id_var, type, value) VALUES (cnt, var, t, val)"; const char* replace_query_postgres = "UPDATE attr SET value=? WHERE id_context=? AND id_var=? AND type=?"; // Create the statement for select sstm = new db::Statement(conn); sstm->bind_in(1, id_context); sstm->bind_in(2, id_var); sstm->bind_out(1, type); sstm->bind_out(2, value, sizeof(value)); sstm->prepare(select_query); // Create the statement for insert istm = new db::Statement(conn); istm->bind_in(1, id_context); istm->bind_in(2, id_var); istm->bind_in(3, type); istm->bind_in(4, value, value_ind); istm->prepare(insert_query); // Create the statement for replace rstm = new db::Statement(conn); if (conn.server_type == POSTGRES) { rstm->bind_in(1, value, value_ind); rstm->bind_in(2, id_context); rstm->bind_in(3, id_var); rstm->bind_in(4, type); } else { rstm->bind_in(1, id_context); rstm->bind_in(2, id_var); rstm->bind_in(3, type); rstm->bind_in(4, value, value_ind); } switch (conn.server_type) { case MYSQL: rstm->prepare(replace_query_mysql); break; case SQLITE: rstm->prepare(replace_query_sqlite); break; case ORACLE: rstm->prepare(replace_query_oracle); break; case POSTGRES: rstm->prepare(replace_query_postgres); break; default: rstm->prepare(replace_query_mysql); break; } } Attr::~Attr() { if (sstm) delete sstm; if (istm) delete istm; if (rstm) delete rstm; } void Attr::set(const wreport::Var& var) { type = var.code(); set_value(var.value()); } void Attr::set_value(const char* qvalue) { if (qvalue == NULL) { value[0] = 0; value_ind = SQL_NULL_DATA; } else { int len = strlen(qvalue); if (len > 255) len = 255; memcpy(value, qvalue, len); value[len] = 0; value_ind = len; } } void Attr::insert(bool replace) { if (replace) { if (conn.server_type == POSTGRES) { if (rstm->execute_and_close() == SQL_NO_DATA) istm->execute_and_close(); } else rstm->execute_and_close(); } else istm->execute_and_close(); } void Attr::load(wreport::Var& var) { // Query all attributes for this var in the current context id_var = var.code(); sstm->execute(); // Make attribues from the result, and add them to var while (sstm->fetch()) var.seta(newvar(type, value)); sstm->close_cursor(); } void Attr::dump(FILE* out) { DBALLE_SQL_C_SINT_TYPE id_context; wreport::Varcode id_var; wreport::Varcode type; char value[255]; SQLLEN value_ind; db::Statement stm(conn); stm.bind_out(1, id_context); stm.bind_out(2, id_var); stm.bind_out(3, type); stm.bind_out(4, value, 255, value_ind); stm.exec_direct("SELECT id_context, id_var, type, value FROM attr"); int count; fprintf(out, "dump of table attr:\n"); for (count = 0; stm.fetch(); ++count) { fprintf(out, " %4d, %01d%02d%03d, %01d%02d%03d", (int)id_context, WR_VAR_F(id_var), WR_VAR_X(id_var), WR_VAR_Y(id_var), WR_VAR_F(type), WR_VAR_X(type), WR_VAR_Y(type)); if (value_ind == SQL_NTS) fprintf(out, "\n"); else fprintf(out, " %.*s\n", (int)value_ind, value); } fprintf(out, "%d element%s in table attr\n", count, count != 1 ? "s" : ""); stm.close_cursor(); } } // namespace db } // namespace dballe /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/db/station.h0000644000175000017500000000627511464770157013303 00000000000000/* * db/station - station table management * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #ifndef DBALLE_DB_STATION_H #define DBALLE_DB_STATION_H /** @file * @ingroup db * * Station table management used by the db module. */ #include #include #include namespace dballe { struct DB; namespace db { struct Connection; struct Statement; /** * Precompiled queries to manipulate the station table */ struct Station { /** * DB connection. */ DB& db; /** Precompiled select fixed station query */ db::Statement* sfstm; /** Precompiled select mobile station query */ db::Statement* smstm; /** Precompiled select data by station id query */ db::Statement* sstm; /** Precompiled insert query */ db::Statement* istm; /** Precompiled update query */ db::Statement* ustm; /** Precompiled delete query */ db::Statement* dstm; /** Station ID SQL parameter */ DBALLE_SQL_C_SINT_TYPE id; /** Station latitude SQL parameter */ DBALLE_SQL_C_SINT_TYPE lat; /** Station longitude SQL parameter */ DBALLE_SQL_C_SINT_TYPE lon; /** Mobile station identifier SQL parameter */ char ident[64]; /** Mobile station identifier indicator */ SQLLEN ident_ind; Station(DB& conn); ~Station(); /** * Set the mobile station identifier input value for this ::dba_db_station * * @param ident * Value to use for ident. NULL can be used to unset ident. */ void set_ident(const char* ident); /** * Get the station ID given latitude, longitude and mobile identifier * * @return * Resulting ID of the station */ int get_id(); /** * Get station information given a station ID * * @param id * ID of the station to query */ void get_data(int id); /** * Insert a new station entry * * @retval id * ID of the newly inserted station */ int insert(); /** * Update the information about a station entry */ void update(); /** * Remove a station record */ void remove(); /** * Dump the entire contents of the table to an output stream */ void dump(FILE* out); private: // disallow copy Station(const Station&); Station& operator=(const Station&); }; #if 0 #ifdef __cplusplus } #endif #endif } // namespace db } // namespace dballe /* vim:set ts=4 sw=4: */ #endif dballe-5.18/dballe/db/import.cc0000644000175000017500000001527111531207054013250 00000000000000/* * db/import - Import Msg data into the database * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "db.h" #include "internals.h" #include "station.h" #include "context.h" #include "data.h" #include "attr.h" #include #include #include #if 0 #include "dballe/core/conv.h" #include "dballe/msg/context.h" #include #include #include #include #include "config.h" #endif using namespace wreport; namespace dballe { void DB::import_msgs(const Msgs& msgs, const char* repmemo, int flags) { for (Msgs::const_iterator i = msgs.begin(); i != msgs.end(); ++i) import_msg(**i, repmemo, flags); } void DB::import_msg(const Msg& msg, const char* repmemo, int flags) { const msg::Context* l_ana = msg.find_context(Level(257), Trange()); if (!l_ana) throw error_consistency("cannot import into the database a message without station information"); // Check if the station is mobile bool mobile = msg.get_ident_var() != NULL; db::Station& st = station(); db::Context& dc = context(); db::Data& dd = data(); db::Attr& dq = attr(); // Begin transaction /*if (!(flags & DBA_IMPORT_NO_TRANSACTIONS))*/ db::Transaction t(*conn); // Fill up the pseudoana informations needed to fetch an existing ID // Latitude if (const Var* var = l_ana->find_by_id(DBA_MSG_LATITUDE)) st.lat = var->enqi(); else throw error_notfound("latitude not found in data to import"); // Longitude if (const Var* var = l_ana->find_by_id(DBA_MSG_LONGITUDE)) st.lon = var->enqi(); else throw error_notfound("longitude not found in data to import"); // Station identifier if (mobile) { if (const Var* var = l_ana->find_by_id(DBA_MSG_IDENT)) st.set_ident(var->value()); else throw error_notfound("mobile station identifier not found in data to import"); } else st.set_ident(NULL); // Check if we can reuse a pseudoana row dc.id_station = st.get_id(); bool inserted_pseudoana = false; if (dc.id_station == -1) { dc.id_station = st.insert(); inserted_pseudoana = true; } // Report code if (repmemo != NULL) dc.id_report = rep_cod_from_memo(repmemo); else { // TODO: check if B01194 first if (const Var* var = msg.get_rep_memo_var()) dc.id_report = rep_cod_from_memo(var->value()); else dc.id_report = rep_cod_from_memo(Msg::repmemo_from_type(msg.type)); } if ((flags & DBA_IMPORT_FULL_PSEUDOANA) || inserted_pseudoana) { dd.id_context = dc.obtain_station_info(); // Insert the rest of the station information for (size_t i = 0; i < l_ana->data.size(); ++i) { Varcode code = l_ana->data[i]->code(); // Do not import datetime in the station info context if (code >= WR_VAR(0, 4, 1) && code <= WR_VAR(0, 4, 6)) continue; dd.set(*l_ana->data[i]); bool inserted = false; if ((flags & DBA_IMPORT_OVERWRITE) == 0) { // Insert only if it is missing inserted = dd.insert_or_ignore(); } else { dd.insert_or_overwrite(); inserted = true; } dq.id_context = dd.id_context; dq.id_var = l_ana->data[i]->code(); /* Insert the attributes */ if (inserted && (flags & DBA_IMPORT_ATTRS)) for (const Var* attr = l_ana->data[i]->next_attr(); attr != NULL; attr = attr->next_attr()) if (attr->value() != NULL) { dq.set(*attr); dq.insert(flags & DBA_IMPORT_OVERWRITE); } } } // Fill up the common context information for the rest of the data // Date and time { const Var* year = l_ana->find_by_id(DBA_MSG_YEAR); const Var* month = l_ana->find_by_id(DBA_MSG_MONTH); const Var* day = l_ana->find_by_id(DBA_MSG_DAY); const Var* hour = l_ana->find_by_id(DBA_MSG_HOUR); const Var* min = l_ana->find_by_id(DBA_MSG_MINUTE); const Var* sec = l_ana->find_by_id(DBA_MSG_SECOND); if (year == NULL || month == NULL || day == NULL || hour == NULL || min == NULL) throw error_notfound("date/time informations not found (or incomplete) in message to insert"); dc.date.year = year->enqi(); dc.date.month = month->enqi(); dc.date.day = day->enqi(); dc.date.hour = hour->enqi(); dc.date.minute = min->enqi(); dc.date.second = sec ? sec->enqi() : 0; } /* Insert the rest of the data */ for (size_t i = 0; i < msg.data.size(); ++i) { const msg::Context& ctx = *msg.data[i]; bool is_ana_level = ctx.level == Level(257) && ctx.trange == Trange(); /* Skip the station info level */ if (is_ana_level && !(flags & DBA_IMPORT_DATETIME_ATTRS)) continue; /* Insert the new context */ dc.ltype1 = ctx.level.ltype1; dc.l1 = ctx.level.l1; dc.ltype2 = ctx.level.ltype2; dc.l2 = ctx.level.l2; dc.pind = ctx.trange.pind; dc.p1 = ctx.trange.p1; dc.p2 = ctx.trange.p2; // Get the database ID of the context dd.id_context = dc.get_id(); if (dd.id_context == -1) dd.id_context = dc.insert(); for (size_t j = 0; j < ctx.data.size(); ++j) { const Var& var = *ctx.data[j]; if (not var.isset()) continue; // Only import dates from ana level, and only if requested if (is_ana_level) { Varcode code = var.code(); if (!(flags & DBA_IMPORT_DATETIME_ATTRS) || WR_VAR_X(code) != 4 || WR_VAR_Y(code) < 1 || WR_VAR_Y(code) > 6) continue; } /* Insert the variable */ dd.set(var); if (flags & DBA_IMPORT_OVERWRITE) dd.insert_or_overwrite(); else dd.insert_or_fail(); /* Insert the attributes */ if (flags & DBA_IMPORT_ATTRS) { dq.id_context = dd.id_context; dq.id_var = var.code(); for (const Var* attr = var.next_attr(); attr; attr = attr->next_attr()) if (attr->value() != NULL) { dq.set(*attr); dq.insert(flags & DBA_IMPORT_OVERWRITE); } } } } /*if (!(flags & DBA_IMPORT_NO_TRANSACTIONS))*/ t.commit(); } } // namespace dballe /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/db/cursor.h0000644000175000017500000001121011754254510013110 00000000000000/* * db/cursor - manage select queries * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ /** @file * @ingroup db * * Functions used to manage a general DB-ALLe query */ #ifndef DBA_DB_CURSOR_H #define DBA_DB_CURSOR_H #include #include #include #include namespace dballe { struct DB; struct Record; namespace db { struct Statement; /** * Simple typedef to make typing easier, and also to help some versions of swig * match this complex type */ typedef std::vector AttrList; /** * Structure used to build and execute a query, and to iterate through the * results */ struct Cursor { /** Database to operate on */ DB& db; /** ODBC statement to use for the query */ db::Statement* stm; /** What values are wanted from the query */ unsigned int wanted; /** Modifier flags to enable special query behaviours */ unsigned int modifiers; /** What is in the FROM part of the query, used to know what output fields * are bound */ unsigned int from_wanted; /** Query results * @{ */ DBALLE_SQL_C_SINT_TYPE out_lat; DBALLE_SQL_C_SINT_TYPE out_lon; char out_ident[64]; SQLLEN out_ident_ind; DBALLE_SQL_C_SINT_TYPE out_ltype1; DBALLE_SQL_C_SINT_TYPE out_l1; DBALLE_SQL_C_SINT_TYPE out_ltype2; DBALLE_SQL_C_SINT_TYPE out_l2; DBALLE_SQL_C_SINT_TYPE out_pind; DBALLE_SQL_C_SINT_TYPE out_p1; DBALLE_SQL_C_SINT_TYPE out_p2; wreport::Varcode out_varcode; SQL_TIMESTAMP_STRUCT out_datetime; char out_value[255]; DBALLE_SQL_C_SINT_TYPE out_rep_cod; DBALLE_SQL_C_SINT_TYPE out_ana_id; DBALLE_SQL_C_SINT_TYPE out_context_id; DBALLE_SQL_C_SINT_TYPE out_priority; /** @} */ /** Number of results still to be fetched */ DBALLE_SQL_C_SINT_TYPE count; Cursor(DB& db); ~Cursor(); /** * Create and execute a database query. * * The results are retrieved by iterating the cursor. * * @param query * The record with the query data (see technical specifications, par. 1.6.4 * "parameter output/input" * @param wanted * The values wanted in output * @param modifiers * Optional modifiers to ask for special query behaviours * @return * The count of items in the results */ int query(const Record& query, unsigned int wanted, unsigned int modifiers); /** * Get the number of rows still to be fetched * * @return * The number of rows still to be queried. The value is undefined if no * query has been successfully peformed yet using this cursor. */ int remaining() const; /** * Get a new item from the results of a query * * @returns * true if a new record has been read, false if there is no more data to read */ bool next(); /// Discard the results that have not been read yet void discard_rest(); /** * Fill in a record with the contents of a dba_db_cursor * * @param rec * The record where to store the values */ void to_record(Record& rec); /** * Query attributes for the current variable */ unsigned query_attrs(const AttrList& qcs, Record& attrs); protected: /// Reset the cursor at the beginning of a query void reset(); /// Query extra station info and add it to \a rec void add_station_info(Record& rec); /** * Return the number of results for a query. * * This is the same as Cursor::query, but it does a SELECT COUNT(*) only. * * @warning: do not use it except to get an approximate row count: * insert/delete/update queries run between the count and the select will * change the size of the result set. */ int getcount(const Record& query, unsigned int wanted, unsigned int modifiers); }; } // namespace db } // namespace dballe /* vim:set ts=4 sw=4: */ #endif dballe-5.18/dballe/db/db.h0000644000175000017500000004152011754254573012200 00000000000000/* * dballe/db - Archive for point-based meteorological data * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #ifndef DBA_DB_H #define DBA_DB_H #include #include #include #include #include #include /** @file * @ingroup db * * Functions used to connect to DB-All.e and insert, query and delete data. */ /** * Flags controlling message import * @{ */ /* Import the attributes. */ #define DBA_IMPORT_ATTRS 1 /* Attempt to merge pseudoana extra information into the existing ones. */ #define DBA_IMPORT_FULL_PSEUDOANA 2 /* Import datetime information as data to preserve their attributes. */ #define DBA_IMPORT_DATETIME_ATTRS 4 /* Message data will overwrite existing values; otherwise, trying to insert * existing data will cause an error. */ #define DBA_IMPORT_OVERWRITE 8 /* Perform the import outside of the transaction. This will make the function * faster but not atomic: if interrupted, for example in case of error, then * the data inserted before the interruption will stay in the database. */ #define DBA_IMPORT_NO_TRANSACTIONS 16 /// @} /** * Constants used to define what values we should retrieve from a query */ /** Retrieve latitude and longitude */ #define DBA_DB_WANT_COORDS (1 << 0) /** Retrieve the mobile station identifier */ #define DBA_DB_WANT_IDENT (1 << 1) /** Retrieve the level information */ #define DBA_DB_WANT_LEVEL (1 << 2) /** Retrieve the time range information */ #define DBA_DB_WANT_TIMERANGE (1 << 3) /** Retrieve the date and time information */ #define DBA_DB_WANT_DATETIME (1 << 4) /** Retrieve the variable name */ #define DBA_DB_WANT_VAR_NAME (1 << 5) /** Retrieve the variable value */ #define DBA_DB_WANT_VAR_VALUE (1 << 6) /** Retrieve the report code */ #define DBA_DB_WANT_REPCOD (1 << 7) /** Retrieve the station ID */ #define DBA_DB_WANT_ANA_ID (1 << 8) /** Retrieve the context ID */ #define DBA_DB_WANT_CONTEXT_ID (1 << 9) /** * Values for query modifier flags */ /** When values from different reports exist on the same point, only report the * one from the report with the highest priority */ #define DBA_DB_MODIFIER_BEST (1 << 0) /** Tell the database optimizer that this is a query on a database with a big * pseudoana table (this serves to hint the MySQL optimizer, which would not * otherwise apply the correct strategy */ #define DBA_DB_MODIFIER_BIGANA (1 << 1) /** Remove duplicates in the results */ #define DBA_DB_MODIFIER_DISTINCT (1 << 2) /** Include the extra anagraphical data in the results */ #define DBA_DB_MODIFIER_ANAEXTRA (1 << 3) /** Do not include the extra anagraphical data in the results */ #define DBA_DB_MODIFIER_NOANAEXTRA (1 << 4) /** Do not bother sorting the results */ #define DBA_DB_MODIFIER_UNSORTED (1 << 5) /** Start geting the results as soon as they are available, without waiting for * the database to finish building the result set. As a side effect, it is * impossible to know in advance the number of results. Currently, it does not * work with the MySQL ODBC driver */ #define DBA_DB_MODIFIER_STREAM (1 << 6) /** Sort by rep_cod after ana_id, to ease reconstructing messages on export */ #define DBA_DB_MODIFIER_SORT_FOR_EXPORT (1 << 7) namespace dballe { struct Record; struct Msg; struct Msgs; struct MsgConsumer; namespace db { struct Connection; struct Statement; struct Sequence; struct Repinfo; struct Station; struct Context; struct Data; struct Attr; } /** * DB-ALLe database connection */ class DB { public: /** ODBC database connection */ db::Connection* conn; protected: /** * Accessors for the various parts of the database. * * @warning Before using these 5 pointers, ensure they are initialised * using one of the dba_db_need_* functions * @{ */ /** Report information */ struct db::Repinfo* m_repinfo; /** Station information */ struct db::Station* m_station; /** Variable context */ struct db::Context* m_context; /** Variable data */ struct db::Data* m_data; /** Variable attributes */ struct db::Attr* m_attr; /** @} */ /** Precompiled LAST_INSERT_ID (or equivalent) SQL statement */ db::Statement* stm_last_insert_id; /** ID of the last autogenerated primary key */ DBALLE_SQL_C_SINT_TYPE m_last_insert_id; /** * Sequence accessors. * * They are NULL for databases such as MySQL that do not use sequences. * @{ */ /** Station ID sequence */ db::Sequence* seq_station; /** Context ID sequence */ db::Sequence* seq_context; /** @} */ void init_after_connect(); /** * Run a one-off SQL query */ void run_sql(const char* query); /** * Delete a table in the database if it exists, otherwise do nothing. */ void drop_table_if_exists(const char* name); /** * Delete a sequence in the database if it exists, otherwise do nothing. */ void drop_sequence_if_exists(const char* name); /** * Fill a message station info layer with information from the given * station and report IDs */ void fill_ana_layer(Msg& msg, int id_station, int id_report); public: DB(); ~DB(); /** * Start a session with DB-All.e * * @param dsn * The ODBC DSN of the database to use * @param user * The user name to use to connect to the DSN * @param password * The password to use to connect to the DSN. To specify an empty password, * pass "" or NULL * @retval db * The dba_db handle returned by the function * @return * The error indicator for the function (See @ref error.h) */ void connect(const char* dsn, const char* user, const char* password); /** * Start a session with DB-All.e * * @param config * The string with the configuration to use to start the connection. This is * passed as is to SQLDriverConnect, so see ODBC documentation for its * format. */ void connect_generic(const char* config); /** * Create from a SQLite file pathname * * @param pathname * The pathname to a SQLite file */ void connect_from_file(const char* pathname); /** * Create from an url-like specification, that can be: * * @l sqlite:[//]foo.sqlite * @l odbc://[user[:pass]@]dsn * @l test:[//] * * @param url * The url-like connection descriptor */ void connect_from_url(const char* url); /** * Start a test session with DB-All.e * * Take information from the environment (@see dba_db_create_from_env) and * default to ./test.sqlite if nothing is specified. */ void connect_test(); /** * Return TRUE if the string looks like a DB URL * * @param str * The string to test * @return * true if it looks like a URL, else false */ static bool is_url(const char* str); /// Access the repinfo table db::Repinfo& repinfo(); /// Access the station table db::Station& station(); /// Access the context table db::Context& context(); /// Access the data table db::Data& data(); /// Access the data table db::Attr& attr(); /** * Reset the database, removing all existing DBALLE tables and re-creating them * empty. * * @param repinfo_file * The name of the CSV file with the report type information data to load. * The file is in CSV format with 6 columns: report code, mnemonic id, * description, priority, descriptor, table A category. * If repinfo_file is NULL, then the default of /etc/dballe/repinfo.csv is * used. */ void reset(const char* repinfo_file = 0); /** * Delete all the DB-ALLe tables from the database. */ void delete_tables(); /** * Update the repinfo table in the database, with the data found in the given * file. * * @param repinfo_file * The name of the CSV file with the report type information data to load. * The file is in CSV format with 6 columns: report code, mnemonic id, * description, priority, descriptor, table A category. * If repinfo_file is NULL, then the default of /etc/dballe/repinfo.csv is * used. * @retval added * The number of repinfo entryes that have been added * @retval deleted * The number of repinfo entryes that have been deleted * @retval updated * The number of repinfo entryes that have been updated */ void update_repinfo(const char* repinfo_file, int* added, int* deleted, int* updated); /** * Get the report code from a report mnemonic */ int rep_cod_from_memo(const char* memo); /** * Get the report mnemonic from a report code */ const std::string& rep_memo_from_cod(int rep_cod); /** * Verify that a rep_cod is supported by the database * * @param rep_cod * The report code to verify * @returns * true if the report code is supported, false if not */ bool check_rep_cod(int rep_cod); /** * Return the ID of the last inserted station */ int last_station_insert_id(); /** * Return the ID of the last inserted context */ int last_context_insert_id(); /** * Get the report id from this record. * * If rep_memo is specified instead, the corresponding report id is queried in * the database and set as "rep_cod" in the record. */ int get_rep_cod(Record& rec); /* * Lookup, insert or replace data in station taking the values from * rec. * * If rec did not contain ana_id, it will be set by this function. * * @param rec * The record with the station information * @param can_add * If true we can insert new stations in the database, if false we * only look up existing records and raise an exception if missing * @returns * The station ID */ int obtain_station(Record& rec, bool can_add=true); /* * Lookup, insert or replace data in station taking the values from * rec. * * If rec did not contain context_id, it will be set by this function. * * @param rec * The record with the context information * @returns * The context ID */ int obtain_context(Record& rec); /** * Insert a record into the database * * In a record with the same phisical situation already exists, the function * fails. * * ana_id and context_id will be set in the record at the end of this function. * * @param rec * The record to insert. * @param can_replace * If true, then existing data can be rewritten, else data can only be added. * @param station_can_add * If true, then it is allowed to add new station records to the database. * Otherwise, data can be added only by reusing existing ones. */ void insert(Record& rec, bool can_replace, bool station_can_add); /** * Remove data from the database * * @param rec * The record with the query data (see technical specifications, par. 1.6.4 * "parameter output/input") to select the items to be deleted */ void remove(const Record& rec); /** * Remove orphan values from the database. * * Orphan values are currently: * \li context values for which no data exists * \li station values for which no context exists * * Depending on database size, this routine can take a few minutes to execute. */ void remove_orphans(); /** * Create and execute a database query. * * The results are retrieved by iterating the cursor. * * @param query * The record with the query data (see technical specifications, par. 1.6.4 * "parameter output/input" * @param wanted * The values wanted in output * @param modifiers * Optional modifiers to ask for special query behaviours * @return * The cursor to use to iterate over the results */ std::auto_ptr query(const Record& query, unsigned int wanted, unsigned int modifiers); /** * Start a query on the station archive * * @param query * The record with the query data (see @ref dba_record_keywords) * @return * The cursor to use to iterate over the results */ std::auto_ptr query_stations(const Record& query); /** * Query the database. * * When multiple values per variable are present, the results will be presented * in increasing order of priority. * * @param query * The record with the query data (see technical specifications, par. 1.6.4 * "parameter output/input") * @return * The cursor to use to iterate over the results */ std::auto_ptr query_data(const Record& rec); /** * Query attributes * * @param id_context * The database id of the context related to the attributes to retrieve * @param id_var * The varcode of the variable related to the attributes to retrieve. See @ref vartable.h * @param qcs * The WMO codes of the QC values requested. If it is empty, then all values * are returned. * @param attrs * The Record that will hold the resulting attributes * @return * Number of attributes returned in attrs */ unsigned query_attrs(int id_context, wreport::Varcode id_var, const db::AttrList& qcs, Record& attrs); /** * Insert new attributes into the database. * * @param id_context * The database id of the context related to the attributes to insert * @param id_var * The varcode of the variable related to the attributes to add. See @ref vartable.h * @param attrs * The record with the attributes to be added * @param can_replace * If true, then existing data can be rewritten, else data can only be added. */ void attr_insert_or_replace(int id_context, wreport::Varcode id_var, const Record& attrs, bool can_replace); /** * Insert new attributes into the database. * * If the same attribute exists for the same data, it is * overwritten * * @param id_context * The database id of the context related to the attributes to insert * @param id_var * The varcode of the variable related to the attributes to add. See @ref vartable.h * @param attrs * The record with the attributes to be added */ void attr_insert(int id_context, wreport::Varcode id_var, const Record& attrs); /** * Insert new attributes into the database. * * If the same attribute exists for the same data, the function fails. * * @param id_context * The database id of the context related to the attributes to insert * @param id_var * The varcode of the variable related to the attributes to add. See @ref vartable.h * @param attrs * The record with the attributes to be added */ void attr_insert_new(int id_context, wreport::Varcode id_var, const Record& attrs); /** * Delete QC data for the variable `var' in record `rec' (coming from a previous * dba_query) * * @param id_context * The database id of the context related to the attributes to remove * @param id_var * The varcode of the variable related to the attributes to remove. See @ref vartable.h * @param qcs * Array of WMO codes of the attributes to delete. If empty, all attributes * associated to id_data will be deleted. */ void attr_remove(int id_context, wreport::Varcode id_var, const db::AttrList& qcs); /** * Import a Msg message into the DB-All.e database * * @param db * The DB-All.e database to write the data into * @param msg * The Msg containing the data to import * @param repmemo * Report mnemonic to which imported data belong. If NULL is passed, then it * will be chosen automatically based on the message type. * @param flags * Customise different aspects of the import process. It is a bitmask of the * various DBA_IMPORT_* macros. */ void import_msg(const Msg& msg, const char* repmemo, int flags); /** * Import Msgs messages into the DB-All.e database * * @param db * The DB-All.e database to write the data into * @param msgs * The Msgs containing the data to import * @param repmemo * Report mnemonic to which imported data belong. If NULL is passed, then it * will be chosen automatically based on the message type. * @param flags * Customise different aspects of the import process. It is a bitmask of the * various DBA_IMPORT_* macros. */ void import_msgs(const Msgs& msgs, const char* repmemo, int flags); /** * Perform the query in `query', and return the results as a NULL-terminated * array of dba_msg. * * @param query * The query to perform * @param cons * The MsgsConsumer that will handle the resulting messages */ void export_msgs(const Record& query, MsgConsumer& cons); /** * Dump the entire contents of the database to an output stream */ void dump(FILE* out); }; } // namespace dballe /* vim:set ts=4 sw=4: */ #endif dballe-5.18/dballe/core/0000755000175000017500000000000011754670141012054 500000000000000dballe-5.18/dballe/core/matcher.h0000644000175000017500000000655211471203657013600 00000000000000/* * dballe/matcher - Local query match infrastructure * * Copyright (C) 2009--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * Author: Enrico Zini */ #ifndef DBALLE_CORE_MATCHER_H #define DBALLE_CORE_MATCHER_H #include namespace dballe { struct Record; namespace matcher { enum Result { MATCH_YES, // Item matches MATCH_NO, // Item does not match MATCH_NA // Match not applicable to this item }; } /** * Common interface for things that are matched. * * This allows the Record-derived matcher to operate on several different * elements. Examples are Record and Msg, but can also be unknown elements * provided by code that uses DB-All.e. */ struct Matched { virtual ~Matched() {} /** * Match variable ID * * This corresponds to B33195 */ virtual matcher::Result match_var_id(int val) const; /** * Match station ID * * This corresponds to DBA_KEY_ANA_ID */ virtual matcher::Result match_station_id(int val) const; /** * Match station WMO code * * If station is -1, only match the block. */ virtual matcher::Result match_station_wmo(int block, int station=-1) const; /** * Match date * * min and max are arrays of 6 ints (from year to second), and either of * them can have -1 as the first element to indicate an open bound. */ virtual matcher::Result match_date(const int* min, const int* max) const; /** * Match coordinates, with bounds in 1/100000 of degree * * Any value can be set to MISSING_INT if not applicable or to represent an * open bound */ virtual matcher::Result match_coords(int latmin, int latmax, int lonmin, int lonmax) const; /** * Match rep_memo * * the memo value that is passed is always lowercase */ virtual matcher::Result match_rep_memo(const char* memo) const; /** * Match if min <= date <= max * * It correctly deals with min and max having the first element set to -1 * to signify an open bound. */ static matcher::Result date_in_range(const int* date, const int* min, const int* max); /** * Match if min <= val <= max * * It correctly deals with min and max being set to MISSING_INT to signify an open * bound. */ static matcher::Result int_in_range(int val, int min, int max); }; struct Matcher { virtual ~Matcher() {} virtual matcher::Result match(const Matched& item) const = 0; virtual void to_record(dballe::Record& query) const = 0; static std::auto_ptr create(const dballe::Record& query); }; } /* vim:set ts=4 sw=4: */ #endif dballe-5.18/dballe/core/defs.h0000644000175000017500000001030411522362440013055 00000000000000/* * msg/defs - Common definitions * * Copyright (C) 2010--2011 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #ifndef DBA_MSG_DEFS_H #define DBA_MSG_DEFS_H /** @file * @ingroup msg * * Common definitions */ #include #include #include namespace dballe { /** * Supported encodings */ typedef enum { BUFR = 0, CREX = 1, AOF = 2, } Encoding; const char* encoding_name(Encoding enc); /** * Value to use for missing levels and time range components */ static const int MISSING_INT = INT_MAX; struct Level { /** Type of the first level. See @ref level_table. */ int ltype1; /** L1 value of the level. See @ref level_table. */ int l1; /** Type of the second level. See @ref level_table. */ int ltype2; /** L2 value of the level. See @ref level_table. */ int l2; Level(int ltype1=MISSING_INT, int l1=MISSING_INT, int ltype2=MISSING_INT, int l2=MISSING_INT) : ltype1(ltype1), l1(l1), ltype2(ltype2), l2(l2) {} Level(const char* ltype1, const char* l1=NULL, const char* ltype2=NULL, const char* l2=NULL); bool operator==(const Level& l) const { return ltype1 == l.ltype1 && l1 == l.l1 && ltype2 == l.ltype2 && l2 == l.l2; } bool operator!=(const Level& l) const { return ltype1 != l.ltype1 || l1 != l.l1 || ltype2 != l.ltype2 || l2 != l.l2; } /** * Compare two Level strutures, for use in sorting. * * @return * -1 if *this < l, 0 if *this == l, 1 if *this > l */ int compare(const Level& l) const { int res; if ((res = ltype1 - l.ltype1)) return res; if ((res = l1 - l.l1)) return res; if ((res = ltype2 - l.ltype2)) return res; return l2 - l.l2; } /** * Return a string description of this level */ std::string describe() const; void format(std::ostream& out, const char* undef="-") const; static inline Level cloud(int ltype2, int l2=MISSING_INT) { return Level(256, MISSING_INT, ltype2, l2); } static inline Level ana() { return Level(257); } }; std::ostream& operator<<(std::ostream& out, const Level& l); struct Trange { /** Time range type indicator. See @ref trange_table. */ int pind; /** Time range P1 indicator. See @ref trange_table. */ int p1; /** Time range P2 indicator. See @ref trange_table. */ int p2; Trange(int pind=MISSING_INT, int p1=MISSING_INT, int p2=MISSING_INT) : pind(pind), p1(p1), p2(p2) {} Trange(const char* pind, const char* p1=NULL, const char* p2=NULL); bool operator==(const Trange& tr) const { return pind == tr.pind && p1 == tr.p1 && p2 == tr.p2; } bool operator!=(const Trange& tr) const { return pind != tr.pind || p1 != tr.p1 || p2 != tr.p2; } /** * Compare two Trange strutures, for use in sorting. * * @return * -1 if *this < t, 0 if *this == t, 1 if *this > t */ int compare(const Trange& t) const { int res; if ((res = pind - t.pind)) return res; if ((res = p1 - t.p1)) return res; return p2 - t.p2; } /** * Return a string description of this time range */ std::string describe() const; void format(std::ostream& out, const char* undef="-") const; static inline Trange instant() { return Trange(254, 0, 0); } static inline Trange ana() { return Trange(); } }; std::ostream& operator<<(std::ostream& out, const Trange& l); } // vim:set ts=4 sw=4: #endif dballe-5.18/dballe/core/dump-core-info.cc0000644000175000017500000000323711627727034015137 00000000000000/* * dump-core-info - Dump core information from the library in order to generate documentation * * Copyright (C) 2011 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "record.h" #include "config.h" #include #include #include #include #include using namespace wreport; using namespace dballe; using namespace std; int do_keywords() { for (int i = 0; i < DBA_KEY_COUNT; ++i) { wreport::Varinfo info = Record::keyword_info((dba_keyword)i); printf("%s,%s,%d,%d,%s\n", Record::keyword_name((dba_keyword)i), info->unit, info->len, info->scale, info->desc); } return 0; } int main(int argc, const char* argv[]) { string cmd = argv[1]; if (cmd == "keywords") return do_keywords(); else { fprintf(stderr, "Unknown command: %s\n", cmd.c_str()); return 1; } } /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/core/verbose.cc0000644000175000017500000000401611173330007013736 00000000000000/* * DB-ALLe - Archive for punctual meteorological data * * Copyright (C) 2005,2006 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "config.h" #include #include #include #include #ifdef __DATE__ #define DATE __DATE__ #else #define DATE "??? ?? ????" #endif #ifdef __TIME__ #define TIME __TIME__ #else #define TIME "??:??:??" #endif #define out DBA_VERBOSE_STREAM static int level = DBA_VERB_NONE; void dba_verbose_init() { const char* verb = getenv("DBA_VERBOSE"); if (verb != NULL) level = atoi(verb); if (level != DBA_VERB_NONE) { fprintf(out, "%s\n", PACKAGE_NAME " " PACKAGE_VERSION ", compiled on " DATE " " TIME); fprintf(out, "%s", "Copyright (C) 2005-2006 ARPA Emilia Romagna.\n" "DB-ALLe comes with ABSOLUTELY NO WARRANTY.\n" "This is free software, and you are welcome to redistribute it and/or modify it\n" "under the terms of the GNU General Public License as published by the Free\n" "Software Foundation; either version 2 of the License, or (at your option) any\n" "later version.\n"); } } int dba_verbose_is_allowed(int lev) { return (level & lev) != 0; } void dba_verbose(int lev, const char* fmt, ...) { va_list ap; if (!dba_verbose_is_allowed(lev)) return; va_start(ap, fmt); vfprintf(out, fmt, ap); va_end(ap); } dballe-5.18/dballe/core/record_keyword.cc0000644000175000017500000003221311734342664015332 00000000000000/* C++ code produced by gperf version 3.0.3 */ /* Command-line: gperf */ /* Computed positions: -k'1-2,$' */ #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) /* The character set is not based on ISO-646. */ #error "gperf generated tables don't work with this execution character set. Please report a bug to ." #endif #include #include #include "dballe/core/var.h" #include "dballe/core/record.h" using namespace wreport; namespace dballe { struct tagdef { const char* tag; dba_keyword index; }; #define TOTAL_KEYWORDS 48 #define MIN_WORD_LENGTH 2 #define MAX_WORD_LENGTH 11 #define MIN_HASH_VALUE 6 #define MAX_HASH_VALUE 90 /* maximum key range = 85, duplicates = 0 */ class RecordKeywords { private: static inline unsigned int hash (const char *str, unsigned int len); public: static struct tagdef *find (const char *str, unsigned int len); }; inline unsigned int RecordKeywords::hash (register const char *str, register unsigned int len) { static unsigned char asso_values[] = { 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 60, 0, 56, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 5, 10, 10, 30, 0, 0, 91, 40, 10, 25, 91, 20, 0, 5, 35, 0, 0, 5, 10, 20, 40, 20, 91, 0, 0, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91 }; return len + asso_values[(unsigned char)str[1]+1] + asso_values[(unsigned char)str[0]] + asso_values[(unsigned char)str[len - 1]]; } static struct tagdef wordlist[] = { {""}, {""}, {""}, {""}, {""}, {""}, {"mobile", DBA_KEY_MOBILE}, {"yearmax", DBA_KEY_YEARMAX}, {"monthmax", DBA_KEY_MONTHMAX}, {"year", DBA_KEY_YEAR}, {""}, {""}, {"yearmin", DBA_KEY_YEARMIN}, {"monthmin", DBA_KEY_MONTHMIN}, {""}, {""}, {"secmax", DBA_KEY_SECMAX}, {"priomax", DBA_KEY_PRIOMAX}, {"priority", DBA_KEY_PRIORITY}, {""}, {""}, {"secmin", DBA_KEY_SECMIN}, {"priomin", DBA_KEY_PRIOMIN}, {"sec", DBA_KEY_SEC}, {""}, {"query", DBA_KEY_QUERY}, {"lonmax", DBA_KEY_LONMAX}, {""}, {"lon", DBA_KEY_LON}, {""}, {"leveltype2", DBA_KEY_LEVELTYPE2}, {"lonmin", DBA_KEY_LONMIN}, {"minumax", DBA_KEY_MINUMAX}, {"min", DBA_KEY_MIN}, {""}, {"ident", DBA_KEY_IDENT}, {"latmax", DBA_KEY_LATMAX}, {"minumin", DBA_KEY_MINUMIN}, {"var", DBA_KEY_VAR}, {""}, {"pindicator", DBA_KEY_PINDICATOR}, {"latmin", DBA_KEY_LATMIN}, {"rep_cod", DBA_KEY_REP_COD}, {"day", DBA_KEY_DAY}, {""}, {"month", DBA_KEY_MONTH}, {"daymax", DBA_KEY_DAYMAX}, {"hourmax", DBA_KEY_HOURMAX}, {"rep_memo", DBA_KEY_REP_MEMO}, {"hour", DBA_KEY_HOUR}, {"context_id", DBA_KEY_CONTEXT_ID}, {"daymin", DBA_KEY_DAYMIN}, {"hourmin", DBA_KEY_HOURMIN}, {"lat", DBA_KEY_LAT}, {""}, {"ana_filter", DBA_KEY_ANA_FILTER}, {"data_filter", DBA_KEY_DATA_FILTER}, {"varlist", DBA_KEY_VARLIST}, {"p2", DBA_KEY_P2}, {""}, {""}, {"attr_filter", DBA_KEY_ATTR_FILTER}, {"p1", DBA_KEY_P1}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"limit", DBA_KEY_LIMIT}, {"var_related", DBA_KEY_VAR_RELATED}, {""}, {""}, {""}, {""}, {"ana_id", DBA_KEY_ANA_ID}, {""}, {"l2", DBA_KEY_L2}, {""}, {""}, {""}, {"l1", DBA_KEY_L1}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"leveltype1", DBA_KEY_LEVELTYPE1} }; struct tagdef * RecordKeywords::find (register const char *str, register unsigned int len) { if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register int key = hash (str, len); if (key <= MAX_HASH_VALUE && key >= 0) { register const char *s = wordlist[key].tag; if (*str == *s && !strncmp (str + 1, s + 1, len - 1) && s[len] == '\0') return &wordlist[key]; } } return 0; } #define DEF_STRING(len) 0, 0, len, 0, len*8 #define DEF_MAXINT 0, 0, 10, 0, 31 #define DEF_INT(digits) 0, 0, digits, 0, digits*8 namespace { struct keyword_infos { struct _Varinfo infos[DBA_KEY_COUNT]; keyword_infos() { infos[DBA_KEY_PRIORITY ].set(0, "Priority of this type of report", "NUMBER", DEF_MAXINT); infos[DBA_KEY_PRIOMAX ].set(0, "Maximum priority of reports queried", "NUMBER", DEF_MAXINT); infos[DBA_KEY_PRIOMIN ].set(0, "Minimum priority of reports queried", "NUMBER", DEF_MAXINT); infos[DBA_KEY_REP_COD ].set(0, "Type of report", "NUMBER", DEF_MAXINT); infos[DBA_KEY_REP_MEMO ].set(0, "Mnemonic alias for type of report", "CCITTIA5", DEF_STRING(20)); infos[DBA_KEY_ANA_ID ].set(0, "Station database ID", "NUMERIC", DEF_MAXINT); infos[DBA_KEY_MOBILE ].set(0, "Station is mobile", "NUMERIC", DEF_MAXINT); infos[DBA_KEY_IDENT ].set(0, "Identifier of flight or ship", "CCITTIA5", DEF_STRING(64)); infos[DBA_KEY_LAT ].set(0, "Latitude", "DEGREE", 5, 0, 7, -9000000, 25); infos[DBA_KEY_LON ].set(0, "Longitude", "DEGREE", 5, 0, 8, -18000000, 26); infos[DBA_KEY_LATMAX ].set(0, "Maximum latitude queried", "DEGREE", 5, 0, 7, -9000000, 25); infos[DBA_KEY_LATMIN ].set(0, "Minimum latitude queried", "DEGREE", 5, 0, 7, -9000000, 25); infos[DBA_KEY_LONMAX ].set(0, "Maximum longitude queried", "DEGREE", 5, 0, 8, -18000000, 26); infos[DBA_KEY_LONMIN ].set(0, "Minimum longitude queried", "DEGREE", 5, 0, 8, -18000000, 26); infos[DBA_KEY_YEAR ].set(0, "Year", "YEAR", DEF_INT(4)); infos[DBA_KEY_MONTH ].set(0, "Month", "MONTH", DEF_INT(2)); infos[DBA_KEY_DAY ].set(0, "Day", "DAY", DEF_INT(2)); infos[DBA_KEY_HOUR ].set(0, "Hour", "HOUR", DEF_INT(2)); infos[DBA_KEY_MIN ].set(0, "Minutes", "MINUTE", DEF_INT(2)); infos[DBA_KEY_SEC ].set(0, "Seconds", "SECOND", DEF_INT(2)); infos[DBA_KEY_YEARMAX ].set(0, "Maximum year queried", "YEAR", DEF_INT(4)); infos[DBA_KEY_YEARMIN ].set(0, "Year or minimum year queried", "YEAR", DEF_INT(4)); infos[DBA_KEY_MONTHMAX ].set(0, "Maximum month queried", "MONTH", DEF_INT(2)); infos[DBA_KEY_MONTHMIN ].set(0, "Minimum month queried", "MONTH", DEF_INT(2)); infos[DBA_KEY_DAYMAX ].set(0, "Maximum day queried", "DAY", DEF_INT(2)); infos[DBA_KEY_DAYMIN ].set(0, "Minimum day queried", "DAY", DEF_INT(2)); infos[DBA_KEY_HOURMAX ].set(0, "Maximum hour queried", "HOUR", DEF_INT(2)); infos[DBA_KEY_HOURMIN ].set(0, "Minumum hour queried", "HOUR", DEF_INT(2)); infos[DBA_KEY_MINUMAX ].set(0, "Maxminum minutes queried", "MINUTE", DEF_INT(2)); infos[DBA_KEY_MINUMIN ].set(0, "Minimum minutes queried", "MINUTE", DEF_INT(2)); infos[DBA_KEY_SECMAX ].set(0, "Maxminum seconds queried", "SECOND", DEF_INT(2)); infos[DBA_KEY_SECMIN ].set(0, "Minimum seconds queried", "SECOND", DEF_INT(2)); infos[DBA_KEY_LEVELTYPE1 ].set(0, "Type of first level", "NUMBER", DEF_MAXINT); infos[DBA_KEY_L1 ].set(0, "Level layer L1", "NUMBER", DEF_MAXINT); infos[DBA_KEY_LEVELTYPE2 ].set(0, "Type of second level", "NUMBER", DEF_MAXINT); infos[DBA_KEY_L2 ].set(0, "Level layer L2", "NUMBER", DEF_MAXINT); infos[DBA_KEY_PINDICATOR ].set(0, "P indicator for time range", "NUMBER", DEF_MAXINT); infos[DBA_KEY_P1 ].set(0, "Time range P1", "SECOND", DEF_MAXINT); infos[DBA_KEY_P2 ].set(0, "Time range P2", "SECOND", DEF_MAXINT); infos[DBA_KEY_VAR ].set(0, "Variable queried", "CCITTIA5", DEF_STRING(7)); infos[DBA_KEY_VARLIST ].set(0, "List of variables to query", "CCITTIA5", DEF_STRING(255)); infos[DBA_KEY_CONTEXT_ID ].set(0, "Context ID of the variable", "NUMERIC", DEF_MAXINT); infos[DBA_KEY_QUERY ].set(0, "Query behaviour modifier", "CCITTIA5", DEF_STRING(255)); infos[DBA_KEY_ANA_FILTER ].set(0, "Filter on anagraphical data", "CCITTIA5", DEF_STRING(255)); infos[DBA_KEY_DATA_FILTER].set(0, "Filter on data", "CCITTIA5", DEF_STRING(255)); infos[DBA_KEY_ATTR_FILTER].set(0, "Filter on data attributes", "CCITTIA5", DEF_STRING(255)); infos[DBA_KEY_LIMIT ].set(0, "Maximum number of results to return", "NUMBER", DEF_MAXINT); infos[DBA_KEY_VAR_RELATED].set(0, "Variable related to attribute queried", "CCITTIA5", DEF_STRING(6)); // Increment refcounts for (int i = 0; i < DBA_KEY_COUNT; ++i) infos[i].do_ref(); } }; static struct keyword_infos* infos = NULL; } static const char* keyword_names[] = { "priority", "priomax", "priomin", "rep_cod", "rep_memo", "ana_id", "mobile", "ident", "lat", "lon", "latmax", "latmin", "lonmax", "lonmin", "year", "month", "day", "hour", "min", "sec", "yearmax", "yearmin", "monthmax", "monthmin", "daymax", "daymin", "hourmax", "hourmin", "minumax", "minumin", "secmax", "secmin", "leveltype1", "l1", "leveltype2", "l2", "pindicator", "p1", "p2", "var", "varlist", "context_id", "query", "ana_filter", "data_filter", "attr_filter", "limit", "var_related", }; const char* Record::keyword_name(dba_keyword key) { return keyword_names[key]; } Varinfo Record::keyword_info(dba_keyword keyword) { if (infos == NULL) infos = new keyword_infos; return &(infos->infos[keyword]); } dba_keyword Record::keyword_byname(const char* tag) { struct tagdef* res = RecordKeywords::find(tag, strlen(tag)); if (res == NULL) return DBA_KEY_ERROR; else return res->index; } dba_keyword Record::keyword_byname_len(const char* tag, int len) { struct tagdef* res = RecordKeywords::find(tag, len); if (res == NULL) return DBA_KEY_ERROR; else return res->index; } /* dba_err dba_record_keyword_selftest() { dba_keyword i, j; for (i = 0; i < DBA_KEY_COUNT; i++) { if (wordlist[i + 1].index != i) return dba_error_consistency("wordlist entry %d has index %d that does not match the position", i, wordlist[i + 1].index); j = dba_record_keyword_byname(wordlist[i + 1].tag); if (j != i) return dba_error_consistency("hashing of entry '%s' did not give expected index %d", wordlist[i + 1].tag, i); } return dba_error_ok(); } */ } /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/core/arrayfile.h0000644000175000017500000000270711717006773014134 00000000000000/* * dballe/core/arrayfile - File I/O from in-memory vector * * Copyright (C) 2012 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #ifndef DBALLE_CORE_ARRAYFILE_H #define DBALLE_CORE_ARRAYFILE_H /** @file * @ingroup core * In-memory versions of File, to be used for testing, */ #include #include #include namespace dballe { class ArrayFile : public File { protected: Encoding file_type; public: std::vector msgs; unsigned current; ArrayFile(Encoding type); virtual ~ArrayFile(); virtual Encoding type() const throw (); virtual bool read(Rawmsg& msg); virtual void write(const Rawmsg& msg); }; } // namespace dballe /* vim:set ts=4 sw=4: */ #endif dballe-5.18/dballe/core/matcher-tut.cc0000644000175000017500000002154411471207424014542 00000000000000/* * Copyright (C) 2009--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * Author: Enrico Zini */ #include "test-utils-core.h" #include "matcher.h" #include "record.h" #include #include using namespace std; using namespace dballe; namespace tut { struct matcher_shar { }; TESTGRP(matcher); // Test var_id matcher template<> template<> void to::test<1>() { Record matcher; matcher.set("data_id", 1); std::auto_ptr m = Matcher::create(matcher); Record matched; ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_NO); matched.set("data_id", 2); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_NO); matched.set("data_id", 1); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_YES); } // Test station_id matcher template<> template<> void to::test<2>() { Record matcher; matcher.set("ana_id", 1); std::auto_ptr m = Matcher::create(matcher); Record matched; ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_NO); matched.set("ana_id", 2); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_NO); matched.set("ana_id", 1); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_YES); } // Test station WMO matcher template<> template<> void to::test<3>() { { Record matcher; matcher.set("block", 11); std::auto_ptr m = Matcher::create(matcher); Record matched; ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_NO); matched.set("block", 1); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_NO); matched.set("block", 11); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_YES); matched.set("station", 222); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_YES); } { Record matcher; matcher.set("block", 11); matcher.set("station", 222); std::auto_ptr m = Matcher::create(matcher); Record matched; ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_NO); matched.set("block", 1); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_NO); matched.set("block", 11); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_NO); matched.set("station", 22); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_NO); matched.set("station", 222); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_YES); matched.set("block", 1); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_NO); matched.unset("block"); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_NO); } } // Test date matcher template<> template<> void to::test<4>() { { Record matcher; matcher.set("yearmin", 2000); std::auto_ptr m = Matcher::create(matcher); Record matched; ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_NO); matched.set("year", 1999); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_NO); matched.set("year", 2000); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_YES); } { Record matcher; matcher.set("yearmax", 2000); std::auto_ptr m = Matcher::create(matcher); Record matched; ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_NO); matched.set("year", 2001); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_NO); matched.set("year", 2000); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_YES); } { Record matcher; matcher.set("yearmin", 2000); matcher.set("yearmax", 2010); std::auto_ptr m = Matcher::create(matcher); Record matched; ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_NO); matched.set("year", 1999); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_NO); matched.set("year", 2011); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_NO); matched.set("year", 2000); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_YES); matched.set("year", 2005); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_YES); matched.set("year", 2010); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_YES); } } // Test coordinates matcher template<> template<> void to::test<5>() { { Record matcher; matcher.set("latmin", 4500000); std::auto_ptr m = Matcher::create(matcher); Record matched; ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_NO); matched.set(DBA_KEY_LAT, 4300000); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_NO); matched.set(DBA_KEY_LAT, 4500000); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_YES); matched.set(DBA_KEY_LAT, 4600000); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_YES); } { Record matcher; matcher.set("latmax", 4500000); std::auto_ptr m = Matcher::create(matcher); Record matched; ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_NO); matched.set("lat", 4600000); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_NO); matched.set("lat", 4500000); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_YES); matched.set("lat", 4400000); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_YES); } { Record matcher; matcher.set("lonmin", 4500000); std::auto_ptr m = Matcher::create(matcher); Record matched; ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_NO); matched.set("lon", 4300000); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_NO); matched.set("lon", 4500000); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_YES); matched.set("lon", 4500000); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_YES); } { Record matcher; matcher.set("lonmax", 4500000); std::auto_ptr m = Matcher::create(matcher); Record matched; ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_NO); matched.set("lon", 4600000); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_NO); matched.set("lon", 4500000); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_YES); matched.set("lon", 4400000); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_YES); } { Record matcher; matcher.set("latmin", 4500000); matcher.set("latmax", 4600000); matcher.set("lonmin", 1000000); matcher.set("lonmax", 1200000); std::auto_ptr m = Matcher::create(matcher); Record matched; ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_NO); matched.set("lat", 4550000); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_NO); matched.set("lon", 1300000); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_NO); matched.set("lon", 1100000); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_YES); } } // Test rep_memo matcher template<> template<> void to::test<6>() { Record matcher; matcher.set(DBA_KEY_REP_MEMO, "synop"); std::auto_ptr m = Matcher::create(matcher); Record matched; ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_NO); matched.set(DBA_KEY_REP_MEMO, "temp"); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_NO); matched.set(DBA_KEY_REP_MEMO, "synop"); ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_YES); } // Test empty matcher template<> template<> void to::test<7>() { Record matcher; std::auto_ptr m = Matcher::create(matcher); Record matched; ensure(m->match(MatchedRecord(matched)) == matcher::MATCH_YES); } } // vim:set ts=4 sw=4: dballe-5.18/dballe/core/record.cc0000644000175000017500000004711611471023270013561 00000000000000/* * dballe/record - groups of related variables * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "record.h" #include "var.h" #include "aliases.h" #include "defs.h" #include "config.h" #include #include #include #include #include using namespace wreport; using namespace std; namespace dballe { /* * Size of the keyword table. It should be the number of items in * dba_record_keyword.gperf, plus 1 */ #define KEYWORD_TABLE_SIZE DBA_KEY_COUNT #define assert_is_dba_record(rec) do { \ assert((rec) != NULL); \ } while (0) Record::Record() { memset(keydata, 0, sizeof(keydata)); } Record::Record(const Record& rec) { // Copy the keyword table for (int i = 0; i < KEYWORD_TABLE_SIZE; ++i) { if (rec.keydata[i] == NULL) keydata[i] = NULL; else keydata[i] = new Var(*rec.keydata[i]); } // Copy the variable list for (vector::const_iterator i = rec.m_vars.begin(); i != rec.m_vars.end(); ++i) m_vars.push_back(new Var(**i)); } Record::~Record() { clear(); } Record& Record::operator=(const Record& rec) { // Prevent self-copying if (this == &rec) return *this; // Copy the keyword table first for (int i = 0; i < KEYWORD_TABLE_SIZE; i++) { if (keydata[i] != NULL) { if (rec.keydata[i] != NULL) *keydata[i] = *rec.keydata[i]; else { delete keydata[i]; keydata[i] = NULL; } } else if (rec.keydata[i] != NULL) keydata[i] = new Var(*rec.keydata[i]); } // Copy the variable list clear_vars(); for (vector::const_iterator i = rec.m_vars.begin(); i != rec.m_vars.end(); ++i) m_vars.push_back(new Var(**i)); return *this; } bool Record::operator==(const Record& rec) const { // Compare the keywords for (int i = 0; i < KEYWORD_TABLE_SIZE; i++) { if (keydata[i] == NULL && rec.keydata[i] == NULL) continue; if (keydata[i] == NULL || rec.keydata[i] == NULL) return false; if (*keydata[i] != *rec.keydata[i]) return false; } // Compare the variables vector::const_iterator i1 = m_vars.begin(); vector::const_iterator i2 = rec.m_vars.begin(); for ( ; i1 != m_vars.end() && i2 != rec.m_vars.end(); ++i1, ++i2) if (**i1 != **i2) return false; if (i1 != m_vars.end() || i2 != rec.m_vars.end()) return false; return true; } void Record::clear_vars() { for (vector::iterator i = m_vars.begin(); i != m_vars.end(); ++i) delete *i; m_vars.clear(); } void Record::clear() { for (int i = 0; i < KEYWORD_TABLE_SIZE; ++i) if (keydata[i] != NULL) { delete keydata[i]; keydata[i] = NULL; } clear_vars(); } int Record::find_item(Varcode code) const throw () { /* Binary search */ int low = 0, high = m_vars.size() - 1; while (low <= high) { int middle = low + (high - low)/2; int cmp = (int)code - (int)m_vars[middle]->code(); if (cmp < 0) high = middle - 1; else if (cmp > 0) low = middle + 1; else return middle; } return -1; } Var& Record::get_item(Varcode code) { int pos = find_item(code); if (pos == -1) error_notfound::throwf("looking for parameter \"B%02d%03d\"", WR_VAR_X(code), WR_VAR_Y(code)); return *m_vars[pos]; } const Var& Record::get_item(Varcode code) const { int pos = find_item(code); if (pos == -1) error_notfound::throwf("looking for parameter \"B%02d%03d\"", WR_VAR_X(code), WR_VAR_Y(code)); return *m_vars[pos]; } void Record::remove_item(Varcode code) { int pos = find_item(code); if (pos == -1) return; delete m_vars[pos]; m_vars.erase(m_vars.begin() + pos); } void Record::add(const Record& source) { // Add the keyword table for (int i = 0; i < KEYWORD_TABLE_SIZE; i++) { if (source.keydata[i] != NULL) { if (keydata[i] != NULL) *keydata[i] = *source.keydata[i]; else keydata[i] = new Var(*source.keydata[i]); } } // Add the variables list vector::const_iterator src = source.m_vars.begin(); size_t dst = 0; while (src != source.m_vars.end() && dst < m_vars.size()) { if ((*src)->code() < m_vars[dst]->code()) { // Insert m_vars.insert(m_vars.begin() + dst, new Var(**src)); ++src; } else if ((*src)->code() == m_vars[dst]->code()) { // Overwrite *m_vars[dst] = **src; ++dst; ++src; } else { ++dst; } } // Append the remaining source vars for ( ; src != source.m_vars.end(); ++src) m_vars.push_back(new Var(**src)); } void Record::set_to_difference(const Record& source1, const Record& source2) { // Copy the keyword table for (int i = 0; i < KEYWORD_TABLE_SIZE; ++i) { Var* src = NULL; if (source2.keydata[i] != NULL && (source1.keydata[i] == NULL || strcmp(source1.keydata[i]->value(), source2.keydata[i]->value()) != 0)) src = source2.keydata[i]; if (keydata[i] != NULL) { if (src != NULL) *keydata[i] = *src; else { delete keydata[i]; keydata[i] = NULL; } } else if (src != NULL) keydata[i] = new Var(*src); } // Copy the variables list clear_vars(); vector::const_iterator s1 = source1.m_vars.begin(); vector::const_iterator s2 = source2.m_vars.begin(); while (s1 != source1.m_vars.end() && s2 != source2.m_vars.end()) { if ((*s1)->code() < (*s2)->code()) ++s1; else if ((*s1)->code() == (*s2)->code()) { if (**s1 != **s2) m_vars.push_back(new Var(**s2)); ++s1; ++s2; } else if ((*s2)->code() < (*s1)->code()) { m_vars.push_back(new Var(**s2)); ++s2; } } for ( ; s2 != source2.m_vars.end(); ++s2) m_vars.push_back(new Var(**s2)); } bool Record::contains(const Record& subset) const { // Compare the keyword tables for (int i = 0; i < KEYWORD_TABLE_SIZE; ++i) { if (subset.keydata[i] != NULL && keydata[i] == NULL) return false; if (subset.keydata[i] != NULL && keydata[i] != NULL && *subset.keydata[i] != *keydata[i]) return false; } // Compare the values vector::const_iterator s1 = m_vars.begin(); vector::const_iterator s2 = subset.m_vars.begin(); while (s1 != m_vars.end() && s2 != subset.m_vars.end()) { if ((*s1)->code() < (*s2)->code()) // s1 has a value not in s2 ++s1; else if ((*s1)->code() == (*s2)->code()) { // they both have the same values if (**s1 != **s2) return false; ++s1; ++s2; } else if ((*s2)->code() < (*s1)->code()) { // s2 has a value not in s1 return false; } } return true; } const Var* Record::key_peek(dba_keyword parameter) const throw () { return keydata[parameter]; } const Var* Record::var_peek(Varcode code) const throw () { int pos = find_item(code); if (pos == -1) return NULL; return m_vars[pos]; } const wreport::Var* Record::peek(const char* name) const { Varcode code = 0; if (name[0] != 'B' && (code = varcode_alias_resolve(name)) == 0) { dba_keyword param = keyword_byname(name); if (param == DBA_KEY_ERROR) error_notfound::throwf("looking for misspelled parameter \"%s\"", name); return key_peek(param); } else { if (code == 0) code = WR_STRING_TO_VAR(name + 1); return var_peek(code); } } const char* Record::key_peek_value(dba_keyword parameter) const throw () { const Var* res = key_peek(parameter); return res ? res->value() : NULL; } const char* Record::var_peek_value(Varcode code) const throw () { const Var* res = var_peek(code); return res ? res->value() : NULL; } const char* Record::peek_value(const char* name) const { const Var* var = peek(name); if (var == NULL) return NULL; return var->value(); } const wreport::Var& Record::key(dba_keyword parameter) const { const Var* res = key_peek(parameter); if (!res) error_notfound::throwf("Parameter %s not found in record", keyword_name(parameter)); return *res; } const wreport::Var& Record::var(wreport::Varcode code) const { const Var* res = var_peek(code); if (!res) error_notfound::throwf("Variable %01d%02d%03d not found in record", WR_VAR_F(code), WR_VAR_X(code), WR_VAR_Y(code)); return *res; } Var& Record::key(dba_keyword parameter) { if (keydata[parameter] == NULL) keydata[parameter] = new Var(keyword_info(parameter)); return *keydata[parameter]; } Var& Record::var(wreport::Varcode code) { int pos = find_item(code); if (pos == -1) { // Insertion sort the new variable // Enlarge the buffer m_vars.resize(m_vars.size() + 1); /* Insertionsort. Crude, but our datasets should be too small for an * RB-Tree to be worth it */ for (pos = m_vars.size() - 1; pos > 0; --pos) if (m_vars[pos - 1]->code() > code) m_vars[pos] = m_vars[pos - 1]; else break; m_vars[pos] = newvar(code).release(); } return *m_vars[pos]; } const wreport::Var& Record::get(const char* name) const { const Var* var = peek(name); if (var == NULL) error_notfound::throwf("\"%s\" not found in record", name); return *var; } wreport::Var& Record::get(const char* name) { Varcode code = 0; if (name[0] != 'B' && (code = varcode_alias_resolve(name)) == 0) { dba_keyword param = keyword_byname(name); if (param == DBA_KEY_ERROR) error_notfound::throwf("looking for misspelled parameter \"%s\"", name); return key(param); } else { if (code == 0) code = WR_STRING_TO_VAR(name + 1); return var(code); } } void Record::key_unset(dba_keyword parameter) { if (keydata[parameter] != NULL) { delete keydata[parameter]; keydata[parameter] = NULL; } } void Record::var_unset(wreport::Varcode code) { int pos = find_item(code); if (pos != -1) { delete m_vars[pos]; m_vars.erase(m_vars.begin() + pos); } } void Record::unset(const char* name) { Varcode code = 0; if (name[0] != 'B' && (code = varcode_alias_resolve(name)) == 0) { dba_keyword param = keyword_byname(name); if (param == DBA_KEY_ERROR) error_notfound::throwf("looking for misspelled parameter \"%s\"", name); return key_unset(param); } else { if (code == 0) code = WR_STRING_TO_VAR(name + 1); return var_unset(code); } } const std::vector& Record::vars() const { return m_vars; } void Record::set_ana_context() { key(DBA_KEY_YEAR).seti(1000); key(DBA_KEY_MONTH).seti(1); key(DBA_KEY_DAY).seti(1); key(DBA_KEY_HOUR).seti(0); key(DBA_KEY_MIN).seti(0); key(DBA_KEY_SEC).seti(0); key(DBA_KEY_LEVELTYPE1).seti(257); unset(DBA_KEY_L1); unset(DBA_KEY_LEVELTYPE2); unset(DBA_KEY_L2); unset(DBA_KEY_PINDICATOR); unset(DBA_KEY_P1); unset(DBA_KEY_P2); /* DBA_RUN_OR_RETURN(dba_record_key_seti(rec, DBA_KEY_REP_COD, 254)); */ } void Record::set_from_string(const char* str) { /* Split the input as name=val */ const char* s; const char* val; Varcode varcode; if ((s = strchr(str, '=')) == NULL) error_consistency::throwf("there should be an = between the name and the value in '%s'", str); // name = strndup(queryparm, s - queryparm); val = s + 1; /* First see if it's an alias or a variable */ if ((varcode = varcode_alias_resolve_substring(str, s - str)) != 0 || str[0] == 'B') { if (varcode == 0) varcode = WR_STRING_TO_VAR(str + 1); /* Query informations about the parameter */ Varinfo info = varinfo(varcode); if (info->is_string()) var(varcode).setc(val); else var(varcode).setd(strtod(val, 0)); } else { /* Else handle a normal keyword */ dba_keyword param = keyword_byname_len(str, s - str); if (param == DBA_KEY_ERROR) error_notfound::throwf("keyword \"%.*s\" does not exist", (int)(s - str), str); /* Query informations about the parameter */ Varinfo info = keyword_info(param); if (info->is_string()) key(param).setc(val); else key(param).setd(strtod(val, 0)); } } void Record::print(FILE* out) const { for (int i = 0; i < KEYWORD_TABLE_SIZE; ++i) if (keydata[i] != NULL) keydata[i]->print(out); for (vector::const_iterator i = m_vars.begin(); i != m_vars.end(); ++i) (*i)->print(out); } #if 0 void dba_record_diff(dba_record rec1, dba_record rec2, int* diffs, FILE* out) { int i; dba_record_cursor cur; /* First compare the keywords */ for (i = 0; i < KEYWORD_TABLE_SIZE; i++) { if (rec1->keydata[i] == NULL && rec2->keydata[i] == NULL) continue; else dba_var_diff(rec1->keydata[i], rec2->keydata[i], diffs, out); } /* Then compare the hash tables */ for (cur = dba_record_iterate_first(rec1); cur != NULL; cur = dba_record_iterate_next(rec1, cur)) { dba_varcode code = dba_var_code(cur->var); if (!dba_record_has_item(rec2, code)) { fprintf(out, "Variable %d%02d%03d only exists in first record\n", WR_VAR_F(code), WR_VAR_X(code), WR_VAR_Y(code)); (*diffs)++; } { dba_item item2; for (item2 = rec2->vars; item2 != NULL; item2 = item2->next) if (dba_var_code(item2->var) == code) { dba_var_diff(cur->var, item2->var, diffs, out); break; } } } /* Check for the items in the second one not present in the first one */ for (cur = dba_record_iterate_first(rec2); cur != NULL; cur = dba_record_iterate_next(rec2, cur)) { dba_varcode code = dba_var_code(cur->var); if (!dba_record_has_item(rec1, code)) { fprintf(out, "Variable %d%02d%03d only exists in second record\n", WR_VAR_F(code), WR_VAR_X(code), WR_VAR_Y(code)); (*diffs)++; } } } #endif static inline int peek_int(const Record& rec, dba_keyword key) { const char* s = rec.key_peek_value(key); return s != NULL ? strtol(s, 0, 10) : -1; } static inline int min_with_undef(int v1, int v2) { if (v1 == -1) return v2; if (v2 == -1) return v1; return v1 < v2 ? v1 : v2; } static inline int max_with_undef(int v1, int v2) { if (v1 == -1) return v2; if (v2 == -1) return v1; return v1 > v2 ? v1 : v2; } static inline int max_days(int y, int m) { int days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; if (m != 2) return days[m-1]; else return (y % 4 == 0 && (y % 100 != 0 || y % 400 == 0)) ? 29 : 28; } /* Buf must be at least 25 bytes long; values must be at least 6 ints long */ void Record::parse_date_extremes(int* minvalues, int* maxvalues) const { dba_keyword names[] = { DBA_KEY_YEAR, DBA_KEY_MONTH, DBA_KEY_DAY, DBA_KEY_HOUR, DBA_KEY_MIN, DBA_KEY_SEC }; dba_keyword min_names[] = { DBA_KEY_YEARMIN, DBA_KEY_MONTHMIN, DBA_KEY_DAYMIN, DBA_KEY_HOURMIN, DBA_KEY_MINUMIN, DBA_KEY_SECMIN }; dba_keyword max_names[] = { DBA_KEY_YEARMAX, DBA_KEY_MONTHMAX, DBA_KEY_DAYMAX, DBA_KEY_HOURMAX, DBA_KEY_MINUMAX, DBA_KEY_SECMAX }; int i; /* Get the year */ for (i = 0; i < 6; i++) { int val = peek_int(*this, names[i]); int min = peek_int(*this, min_names[i]); int max = peek_int(*this, max_names[i]); minvalues[i] = max_with_undef(val, min); maxvalues[i] = min_with_undef(val, max); if (i > 0 && ((minvalues[i-1] == -1 && minvalues[i] != -1) || (maxvalues[i-1] == -1 && maxvalues[i] != -1))) { Varinfo key1 = keyword_info(names[i - 1]); Varinfo key2 = keyword_info(names[i]); error_consistency::throwf("%s extremes are unset but %s extremes are set", key1->desc, key2->desc); } } /* Now values is either 6 times -1, 6 values, or X values followed by 6-X times -1 */ /* If one of the extremes has been selected, fill in the blanks */ if (minvalues[0] != -1) { minvalues[1] = minvalues[1] != -1 ? minvalues[1] : 1; minvalues[2] = minvalues[2] != -1 ? minvalues[2] : 1; minvalues[3] = minvalues[3] != -1 ? minvalues[3] : 0; minvalues[4] = minvalues[4] != -1 ? minvalues[4] : 0; minvalues[5] = minvalues[5] != -1 ? minvalues[5] : 0; } if (maxvalues[0] != -1) { maxvalues[1] = maxvalues[1] != -1 ? maxvalues[1] : 12; maxvalues[2] = maxvalues[2] != -1 ? maxvalues[2] : max_days(maxvalues[0], maxvalues[1]); maxvalues[3] = maxvalues[3] != -1 ? maxvalues[3] : 23; maxvalues[4] = maxvalues[4] != -1 ? maxvalues[4] : 59; maxvalues[5] = maxvalues[5] != -1 ? maxvalues[5] : 59; } } void Record::parse_date(int* values) const { dba_keyword names[] = { DBA_KEY_YEAR, DBA_KEY_MONTH, DBA_KEY_DAY, DBA_KEY_HOUR, DBA_KEY_MIN, DBA_KEY_SEC }; for (int i = 0; i < 6; i++) { values[i] = peek_int(*this, names[i]); if (i > 0 && (values[i-1] == -1 && values[i] != -1)) { Varinfo key1 = keyword_info(names[i - 1]); Varinfo key2 = keyword_info(names[i]); error_consistency::throwf("%s is unset but %s is set", key1->desc, key2->desc); } } /* Now values is either 6 times -1, 6 values, or X values followed by 6-X times -1 */ /* If one of the extremes has been selected, fill in the blanks */ if (values[0] != -1) { values[1] = values[1] != -1 ? values[1] : 1; values[2] = values[2] != -1 ? values[2] : 1; values[3] = values[3] != -1 ? values[3] : 0; values[4] = values[4] != -1 ? values[4] : 0; values[5] = values[5] != -1 ? values[5] : 0; } } MatchedRecord::MatchedRecord(const Record& r) : r(r) { } MatchedRecord::~MatchedRecord() { } matcher::Result MatchedRecord::match_var_id(int val) const { if (const wreport::Var* var = r.var_peek(WR_VAR(0, 33, 195))) { return var->enqi() == val ? matcher::MATCH_YES : matcher::MATCH_NO; } else return matcher::MATCH_NA; } matcher::Result MatchedRecord::match_station_id(int val) const { if (const wreport::Var* var = r.key_peek(DBA_KEY_ANA_ID)) { return var->enqi() == val ? matcher::MATCH_YES : matcher::MATCH_NO; } else return matcher::MATCH_NA; } matcher::Result MatchedRecord::match_station_wmo(int block, int station) const { if (const wreport::Var* var = r.var_peek(WR_VAR(0, 1, 1))) { // Match block if (var->enqi() != block) return matcher::MATCH_NO; // If station was not requested, we are done if (station == -1) return matcher::MATCH_YES; // Match station if (const wreport::Var* var = r.var_peek(WR_VAR(0, 1, 2))) { if (var->enqi() != station) return matcher::MATCH_NO; return matcher::MATCH_YES; } } return matcher::MATCH_NA; } matcher::Result MatchedRecord::match_date(const int* min, const int* max) const { int date[6]; r.parse_date(date); if (date[0] == -1) return matcher::MATCH_NA; return Matched::date_in_range(date, min, max); } matcher::Result MatchedRecord::match_coords(int latmin, int latmax, int lonmin, int lonmax) const { matcher::Result r1 = matcher::MATCH_NA; if (const wreport::Var* var = r.key_peek(DBA_KEY_LAT)) r1 = Matched::int_in_range(var->enqi(), latmin, latmax); else if (latmin == MISSING_INT && latmax == MISSING_INT) r1 = matcher::MATCH_YES; matcher::Result r2 = matcher::MATCH_NA; if (const wreport::Var* var = r.key_peek(DBA_KEY_LON)) r2 = Matched::int_in_range(var->enqi(), lonmin, lonmax); else if (lonmin == MISSING_INT && lonmax == MISSING_INT) r2 = matcher::MATCH_YES; if (r1 == matcher::MATCH_YES && r2 == matcher::MATCH_YES) return matcher::MATCH_YES; if (r1 == matcher::MATCH_NO || r2 == matcher::MATCH_NO) return matcher::MATCH_NO; return matcher::MATCH_NA; } matcher::Result MatchedRecord::match_rep_memo(const char* memo) const { if (const char* var = r.key_peek_value(DBA_KEY_REP_MEMO)) { return strcmp(memo, var) == 0 ? matcher::MATCH_YES : matcher::MATCH_NO; } else return matcher::MATCH_NA; } } /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/core/var.h0000644000175000017500000000550711636405605012744 00000000000000/* * dballe/var - DB-All.e specialisation of wreport variable * * Copyright (C) 2005--2011 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #ifndef DBALLE_CORE_VAR_H #define DBALLE_CORE_VAR_H /** @file * @ingroup core * Implement ::dba_var, an encapsulation of a measured variable. */ #include #include #include namespace dballe { /** * Convenience functions to quickly create variables from the local B table */ /// Return a Varinfo entry from the local B table wreport::Varinfo varinfo(wreport::Varcode code); /// Create a new Var, from the local B table, with undefined value static inline wreport::Var var(wreport::Varcode code) { return wreport::Var(varinfo(code)); } /// Create a new Var, from the local B table, with value template wreport::Var var(wreport::Varcode code, const T& val) { return wreport::Var(varinfo(code), val); } /// Create a new Var, from the local B table, with undefined value static inline std::auto_ptr newvar(wreport::Varcode code) { return std::auto_ptr(new wreport::Var(varinfo(code))); } /// Create a new Var, from the local B table, with value template std::auto_ptr newvar(wreport::Varcode code, const T& val) { return std::auto_ptr(new wreport::Var(varinfo(code), val)); } /// Create a new Var, copying \a var and all its attributes except the unset ones std::auto_ptr var_copy_without_unset_attrs(const wreport::Var& var); /** * Create a new Var with code \a code, copying the value from \a var and all * its attributes except the unset ones */ std::auto_ptr var_copy_without_unset_attrs(const wreport::Var& var, wreport::Varcode code); /** * Format the code to its string representation * * The string will be written to buf, which must be at least 7 bytes long */ void format_code(wreport::Varcode code, char* buf); /// Format the code to its string representation std::string format_code(wreport::Varcode code); /// Return \a code, or its DB-All.e equivalent wreport::Varcode map_code_to_dballe(wreport::Varcode code); } #endif /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/core/defs.cc0000644000175000017500000002222311674637245013236 00000000000000/* * msg/defs - Common definitions * * Copyright (C) 2005--2011 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "defs.h" #include #include #include #include #include #include "dballe/core/vasprintf.h" using namespace std; namespace dballe { const char* encoding_name(Encoding enc) { switch (enc) { case BUFR: return "BUFR"; case CREX: return "CREX"; case AOF: return "AOF"; default: return "(unknown)"; } } static int str_to_val(const char* str) { if (str == NULL || str[0] == 0 || strcmp(str, "-") == 0) return MISSING_INT; else return strtol(str, NULL, 10); } Level::Level(const char* ltype1, const char* l1, const char* ltype2, const char* l2) : ltype1(str_to_val(ltype1)), l1(str_to_val(l1)), ltype2(str_to_val(ltype2)), l2(str_to_val(l2)) { } Trange::Trange(const char* pind, const char* p1, const char* p2) : pind(str_to_val(pind)), p1(str_to_val(p1)), p2(str_to_val(p2)) { } namespace { std::string fmtf( const char* f, ... ) { char *c; va_list ap; va_start( ap, f ); vasprintf( &c, f, ap ); std::string ret( c ); free( c ); return ret; } } static std::string describe_level(int ltype, int l1) { switch (ltype) { case 1: return "Ground or water surface"; case 2: return "Cloud base level"; case 3: return "Level of cloud tops"; case 4: return "Level of 0°C isotherm"; case 5: return "Level of adiabatic condensation lifted from the surface"; case 6: return "Maximum wind level"; case 7: return "Tropopause"; case 8: if (l1 == 0) return "Nominal top of atmosphere"; else return fmtf("Nominal top of atmosphere, channel %d", l1); case 9: return "Sea bottom"; case 20: return fmtf("Isothermal level, %.1fK", (double)l1/10); case 100: return fmtf("Isobaric surface, %.2fhPa", (double)l1/100); case 101: return "Mean sea level"; case 102: return fmtf("%.3fm above mean sea level", (double)l1/1000); case 103: return fmtf("%.3fm above ground", (double)l1/1000); case 104: return fmtf("Sigma level %.5f", (double)l1/10000); case 105: return fmtf("Hybrid level %d", l1); case 106: return fmtf("%.3fm below land surface", (double)l1/1000); case 107: return fmtf("Isentropic (theta) level, potential temperature %.1fK", (double)l1/10); case 108: return fmtf("Pressure difference %.2fhPa from ground to level", (double)l1/100); case 109: return fmtf("Potential vorticity surface %.3f 10-6 K m2 kg-1 s-1", (double)l1/1000); case 111: return fmtf("ETA* level %.5f", (double)l1/10000); case 117: return fmtf("Mixed layer depth %.3fm", (double)l1/1000); case 160: return fmtf("%.3fm below sea level", (double)l1/1000); case 200: return "Entire atmosphere (considered as a single layer)"; case 201: return "Entire ocean (considered as a single layer)"; case 204: return "Highest tropospheric freezing level"; case 206: return "Grid scale cloud bottom level"; case 207: return "Grid scale cloud top level"; case 209: return "Boundary layer cloud bottom level"; case 210: return "Boundary layer cloud top level"; case 211: return "Boundary layer cloud layer"; case 212: return "Low cloud bottom level"; case 213: return "Low cloud top level"; case 214: return "Low cloud layer"; case 215: return "Cloud ceiling"; case 220: return "Planetary Boundary Layer"; case 222: return "Middle cloud bottom level"; case 223: return "Middle cloud top level"; case 224: return "Middle cloud layer"; case 232: return "High cloud bottom level"; case 233: return "High cloud top level"; case 234: return "High cloud layer"; case 235: return fmtf("Ocean Isotherm Level, %.1fK", (double)l1/10); break; case 240: return "Ocean Mixed Layer"; case 242: return "Convective cloud bottom level"; case 243: return "Convective cloud top level"; case 244: return "Convective cloud layer"; case 245: return "Lowest level of the wet bulb zero"; case 246: return "Maximum equivalent potential temperature level"; case 247: return "Equilibrium level"; case 248: return "Shallow convective cloud bottom level"; case 249: return "Shallow convective cloud top level"; case 251: return "Deep convective cloud bottom level"; case 252: return "Deep convective cloud top level"; case 253: return "Lowest bottom level of supercooled liquid water layer"; case 254: return "Highest top level of supercooled liquid water layer"; case 255: return "Missing"; case 256: return "Clouds"; case 257: return "Information about the station that generated the data"; case 258: switch (l1) { case 0: return "General cloud group"; case 1: return "CL"; case 2: return "CM"; case 3: return "CH"; default: return fmtf("%d %d", ltype, l1); } break; case 259: return fmtf("Cloud group %d", l1); case 260: return fmtf("Cloud drift group %d", l1); case 261: return fmtf("Cloud elevation group %d", l1); case 262: return "Direction and elevation of clouds"; case MISSING_INT: return "-"; default: return fmtf("%d %d", ltype, l1); break; } } std::string Level::describe() const { if (ltype2 == MISSING_INT || l2 == MISSING_INT) return describe_level(ltype1, l1); if (ltype1 == 256) { string lev1 = describe_level(ltype1, l1); string lev2 = describe_level(ltype2, l2); return lev1 + ", " + lev2; } else { string lev1 = describe_level(ltype1, l1); string lev2 = describe_level(ltype2, l2); return "Layer from [" + lev1 + "] to [" + lev2 + "]"; } } void Level::format(std::ostream& out, const char* undef) const { if (ltype1 == MISSING_INT) out << undef; else out << ltype1; out << ","; if (l1 == MISSING_INT) out << undef; else out << l1; out << ","; if (ltype2 == MISSING_INT) out << undef; else out << ltype2; out << ","; if (l2 == MISSING_INT) out << undef; else out << l2; } std::ostream& operator<<(std::ostream& out, const Level& l) { l.format(out); return out; } void Trange::format(std::ostream& out, const char* undef) const { if (pind == MISSING_INT) out << undef; else out << pind; out << ","; if (p1 == MISSING_INT) out << undef; else out << p1; out << ","; if (p2 == MISSING_INT) out << undef; else out << p2; } std::ostream& operator<<(std::ostream& out, const Trange& l) { l.format(out); return out; } static std::string format_seconds(int val) { static const int bufsize = 128; char buf[bufsize]; if (val == MISSING_INT) return "-"; int i = 0; if (val / (3600*24) != 0) { i += snprintf(buf+i, bufsize-i, "%dd ", val / (3600*24)); val = abs(val) % (3600*24); } if (val / 3600 != 0) { i += snprintf(buf+i, bufsize-i, "%dh ", val / 3600); val = abs(val) % 3600; } if (val / 60 != 0) { i += snprintf(buf+i, bufsize-i, "%dm ", val / 60); val = abs(val) % 60; } if (val) i += snprintf(buf+i, bufsize-i, "%ds ", val); if (i > 0) --i; else { strncpy(buf, "0", bufsize); i = 1; } buf[i] = 0; return buf; } static std::string mkdesc(const std::string& root, int p1, int p2) { if (p1 == MISSING_INT && p2 == MISSING_INT) return root; string res = root; if (p2 != MISSING_INT) res += " over " + format_seconds(p2); if (p1 == MISSING_INT) return res; if (p1 < 0) return res + format_seconds(-p1) + " before reference time"; return res + " at forecast time " + format_seconds(p1); } std::string Trange::describe() const { switch (pind) { case 0: return mkdesc("Average", p1, p2); case 1: return mkdesc("Accumulation", p1, p2); case 2: return mkdesc("Maximum", p1, p2); case 3: return mkdesc("Minimum", p1, p2); case 4: return mkdesc("Difference (end minus beginning)", p1, p2); case 5: return mkdesc("Root Mean Square", p1, p2); case 6: return mkdesc("Standard Deviation", p1, p2); case 7: return mkdesc("Covariance (temporal variance)", p1, p2); case 8: return mkdesc("Difference (beginning minus end)", p1, p2); case 9: return mkdesc("Ratio", p1, p2); case 51: return mkdesc("Climatological Mean Value", p1, p2); case 200: return mkdesc("Vectorial mean", p1, p2); case 201: return mkdesc("Mode", p1, p2); case 202: return mkdesc("Standard deviation vectorial mean", p1, p2); case 203: return mkdesc("Vectorial maximum", p1, p2); case 204: return mkdesc("Vectorial minimum", p1, p2); case 205: return mkdesc("Product with a valid time ranging", p1, p2); case 254: return "Instantaneous value"; default: return fmtf("%d %d %d", pind, p1, p2); } } } // namespace dballe /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/core/csv.h0000644000175000017500000000541211522561500012731 00000000000000/* * dballe/csv - CSV utility functions * * Copyright (C) 2005--2011 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #ifndef DBA_CSV_H #define DBA_CSV_H /** @file * @ingroup core * Routines to parse data in CSV format */ #include #include #include #include namespace dballe { /** * Parse a CSV line. * * @param in * The file where to read from * @param cols * The parsed columns. * @return * true if a new line was found, else false */ bool csv_read_next(FILE* in, std::vector& cols); class CSVReader { protected: /// Read one line from the input source, returning false if EOF is reached virtual bool nextline() = 0; public: /// Last line read std::string line; /// Parsed CSV columns for the last line read std::vector cols; virtual ~CSVReader(); /** * Find the first line where the given column exists and starts with a * number. * * This can be used to skip titles and empty lines, moving to the start of * the real data. Real data is identified by using a column that starts * with text in the headers and number in the data. * * @returns true if a data line has been found, false if we reached EOF */ bool move_to_data(unsigned number_col=0); /// Read the next CSV line, returning false if EOF is reached bool next(); static std::string unescape(const std::string& csvstr); }; class IstreamCSVReader : public CSVReader { protected: virtual bool nextline(); public: std::istream& in; IstreamCSVReader(std::istream& in) : in(in) {} }; // TODO: CSV readers allowing to peek on the next line without consuming it, to // allow the Msg parser to stop at msg boundary after peeking at a line // also, stripping newlines at end of lines // also, reading from istream // also, de-escaping strings (if they start with quote) /** * Output a string value, quoted if needed according to CSV rules */ void csv_output_quoted_string(std::ostream& out, const std::string& str); } /* vim:set ts=4 sw=4: */ #endif dballe-5.18/dballe/core/test-utils-core.cc0000644000175000017500000001611111641561553015347 00000000000000/* * core/test-utils-core - Test utility functions for the core module * * Copyright (C) 2005--2011 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "dballe/core/test-utils-core.h" #include #include #include using namespace wreport; using namespace std; namespace dballe { namespace tests { static std::string tag; /* static void _ensureRecordHas(const char* file, int line, dba_record rec, const char* key, int val) { int v; INNER_CHECKED(dba_enqi(rec, key, &v)); ensure_equals(v, val); } static void _ensureRecordHas(const char* file, int line, dba_record rec, const char* key, double val) { double v; INNER_CHECKED(dba_enqd(rec, key, &v)); ensure_equals(v, val); } static void _ensureRecordHas(const char* file, int line, dba_record rec, const char* key, const char* val) { const char* v; INNER_CHECKED(dba_enqc(rec, key, &v)); gen_ensure(strcmp(v, val) == 0); } #define ensureRecordHas(...) _ensureRecordHas(__FILE__, __LINE__, __VA_ARGS__) */ const static Varcode generator_varcodes[] = { WR_VAR(0, 1, 1), WR_VAR(0, 1, 2), WR_VAR(0, 1, 8), WR_VAR(0, 1, 11), WR_VAR(0, 1, 12), WR_VAR(0, 1, 13), WR_VAR(0, 2, 1), WR_VAR(0, 2, 2), WR_VAR(0, 2, 5), WR_VAR(0, 2, 11), WR_VAR(0, 2, 12), WR_VAR(0, 2, 61), WR_VAR(0, 2, 62), WR_VAR(0, 2, 63), WR_VAR(0, 2, 70), WR_VAR(0, 4, 1), WR_VAR(0, 4, 2), WR_VAR(0, 4, 3), WR_VAR(0, 4, 4), WR_VAR(0, 4, 5), WR_VAR(0, 5, 1), WR_VAR(0, 6, 1), WR_VAR(0, 7, 30), WR_VAR(0, 7, 2), WR_VAR(0, 7, 31), WR_VAR(0, 8, 1), WR_VAR(0, 8, 4), WR_VAR(0, 8, 21), WR_VAR(0, 10, 3), WR_VAR(0, 10, 4), WR_VAR(0, 10, 51), WR_VAR(0, 10, 61), WR_VAR(0, 10, 63), WR_VAR(0, 10, 197), WR_VAR(0, 11, 1), WR_VAR(0, 11, 2), WR_VAR(0, 11, 3), WR_VAR(0, 11, 4), }; #if 0 generator::~generator() { for (std::vector::iterator i = reused_pseudoana_fixed.begin(); i != reused_pseudoana_fixed.end(); i++) dba_record_delete(*i); for (std::vector::iterator i = reused_pseudoana_mobile.begin(); i != reused_pseudoana_mobile.end(); i++) dba_record_delete(*i); for (std::vector::iterator i = reused_context.begin(); i != reused_context.end(); i++) dba_record_delete(*i); } dba_err generator::fill_pseudoana(dba_record rec, bool mobile) { dba_record ana; if ((mobile && reused_pseudoana_mobile.empty()) || (!mobile && reused_pseudoana_fixed.empty()) || rnd(0.3)) { DBA_RUN_OR_RETURN(dba_record_create(&ana)); /* Pseudoana */ DBA_RUN_OR_RETURN(dba_record_key_setd(ana, DBA_KEY_LAT, rnd(-90, 90))); DBA_RUN_OR_RETURN(dba_record_key_setd(ana, DBA_KEY_LON, rnd(-180, 180))); if (mobile) { DBA_RUN_OR_RETURN(dba_record_key_setc(ana, DBA_KEY_IDENT, rnd(10).c_str())); DBA_RUN_OR_RETURN(dba_record_key_seti(ana, DBA_KEY_MOBILE, 1)); reused_pseudoana_mobile.push_back(ana); } else { //DBA_RUN_OR_RETURN(dba_record_key_seti(ana, DBA_KEY_BLOCK, rnd(0, 99))); //DBA_RUN_OR_RETURN(dba_record_key_seti(ana, DBA_KEY_STATION, rnd(0, 999))); DBA_RUN_OR_RETURN(dba_record_key_seti(ana, DBA_KEY_MOBILE, 0)); reused_pseudoana_fixed.push_back(ana); } } else { if (mobile) ana = reused_pseudoana_mobile[rnd(0, reused_pseudoana_mobile.size() - 1)]; else ana = reused_pseudoana_fixed[rnd(0, reused_pseudoana_fixed.size() - 1)]; } DBA_RUN_OR_RETURN(dba_record_add(rec, ana)); return dba_error_ok(); } dba_err generator::fill_context(dba_record rec) { dba_record ctx; if (reused_context.empty() || rnd(0.7)) { DBA_RUN_OR_RETURN(dba_record_create(&ctx)); /* Context */ DBA_RUN_OR_RETURN(dba_record_key_seti(ctx, DBA_KEY_YEAR, rnd(2002, 2005))); DBA_RUN_OR_RETURN(dba_record_key_seti(ctx, DBA_KEY_MONTH, rnd(1, 12))); DBA_RUN_OR_RETURN(dba_record_key_seti(ctx, DBA_KEY_DAY, rnd(1, 28))); DBA_RUN_OR_RETURN(dba_record_key_seti(ctx, DBA_KEY_HOUR, rnd(0, 23))); DBA_RUN_OR_RETURN(dba_record_key_seti(ctx, DBA_KEY_MIN, rnd(0, 59))); DBA_RUN_OR_RETURN(dba_record_key_seti(ctx, DBA_KEY_LEVELTYPE1, rnd(0, 300))); DBA_RUN_OR_RETURN(dba_record_key_seti(ctx, DBA_KEY_L1, rnd(0, 100000))); DBA_RUN_OR_RETURN(dba_record_key_seti(ctx, DBA_KEY_LEVELTYPE2, rnd(0, 300))); DBA_RUN_OR_RETURN(dba_record_key_seti(ctx, DBA_KEY_L2, rnd(0, 100000))); DBA_RUN_OR_RETURN(dba_record_key_seti(ctx, DBA_KEY_PINDICATOR, rnd(0, 300))); DBA_RUN_OR_RETURN(dba_record_key_seti(ctx, DBA_KEY_P1, rnd(0, 100000))); DBA_RUN_OR_RETURN(dba_record_key_seti(ctx, DBA_KEY_P2, rnd(0, 100000))); DBA_RUN_OR_RETURN(dba_record_key_seti(ctx, DBA_KEY_REP_COD, rnd(105, 149))); reused_context.push_back(ctx); } else { ctx = reused_context[rnd(0, reused_context.size() - 1)]; } DBA_RUN_OR_RETURN(dba_record_add(rec, ctx)); return dba_error_ok(); } dba_err generator::fill_record(dba_record rec) { DBA_RUN_OR_RETURN(fill_pseudoana(rec, rnd(0.8))); DBA_RUN_OR_RETURN(fill_context(rec)); DBA_RUN_OR_RETURN(dba_record_var_setc(rec, generator_varcodes[rnd(0, sizeof(generator_varcodes) / sizeof(dba_varcode))], "1")); return dba_error_ok(); } #endif #if 0 dba_err read_file(dba_encoding type, const std::string& name, dba_raw_consumer& cons) { dba_err err = DBA_OK; dba_file file = open_test_data(name.c_str(), type); dba_rawmsg raw = 0; int found; DBA_RUN_OR_GOTO(cleanup, dba_rawmsg_create(&raw)); DBA_RUN_OR_GOTO(cleanup, dba_file_read(file, raw, &found)); while (found) { DBA_RUN_OR_GOTO(cleanup, cons.consume(raw)); DBA_RUN_OR_GOTO(cleanup, dba_file_read(file, raw, &found)); } cleanup: if (file) dba_file_delete(file); if (raw) dba_rawmsg_delete(raw); return err == DBA_OK ? dba_error_ok() : err; } #endif std::string datafile(const std::string& fname) { const char* testdatadirenv = getenv("DBA_TESTDATA"); std::string testdatadir = testdatadirenv ? testdatadirenv : "."; return testdatadir + "/" + fname; } auto_ptr _open_test_data(const wibble::tests::Location& loc, const char* filename, Encoding type) { try { return auto_ptr(File::create(type, datafile(filename), "r")); } catch (wreport::error& e) { throw tut::failure(loc.msg(e.what())); } } auto_ptr _read_rawmsg(const wibble::tests::Location& loc, const char* filename, Encoding type) { try { auto_ptr f = _open_test_data(loc, filename, type); auto_ptr res(new Rawmsg); inner_ensure(f->read(*res)); return res; } catch (wreport::error& e) { throw tut::failure(loc.msg(e.what())); } } } } // vim:set ts=4 sw=4: dballe-5.18/dballe/core/rawmsg.h0000644000175000017500000000333411450571201013436 00000000000000/* * dballe/rawmsg - annotated raw buffer * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #ifndef WREPORT_RAWMSG_H #define WREPORT_RAWMSG_H #include #include namespace dballe { /** @file * @ingroup io * In-memory storage of an encoded weather report. */ /** * Annotated string buffer for encoded messages. */ struct Rawmsg : public std::string { /** * Pathname of the file from where the Rawmsg has been read. It can be * empty when not applicable, such as when the message is created from * scratch and not yet written */ std::string file; /** Start offset of this message inside the file where it is found */ long offset; /** Index of the message within the source */ int index; /** Format of the raw data */ Encoding encoding; Rawmsg() : offset(0), index(0) {} // Clear all the contents of this dballe::Rawmsg void clear() throw () { std::string::clear(); file.clear(); offset = 0; index = 0; } }; } /* vim:set ts=4 sw=4: */ #endif dballe-5.18/dballe/core/aliases.gperf0000644000175000017500000000446011625142707014445 00000000000000/* * wreport/aliases - Aliases for commonly used variable codes * * Copyright (C) 2005--2011 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ %define slot-name alias %define class-name VarcodeAliases %define lookup-function-name find %struct-type %language=C++ %global-table %compare-strncmp /* Using %switch may be faster (remember to check when doing optimizations) */ %{ #include #include using namespace wreport; namespace dballe { %} struct aliasdef { const char* alias; Varcode var; }; %% block, WR_VAR(0, 1, 1) station, WR_VAR(0, 1, 2) height, WR_VAR(0, 7, 30) heightbaro, WR_VAR(0, 7, 31) name, WR_VAR(0, 1, 19) z, WR_VAR(0, 10, 3) p, WR_VAR(0, 10, 4) mslp, WR_VAR(0, 10, 51) u, WR_VAR(0, 11, 3) v, WR_VAR(0, 11, 4) t, WR_VAR(0, 12, 101) td, WR_VAR(0, 12, 103) tmax, WR_VAR(0, 12, 11) tmin, WR_VAR(0, 12, 12) q, WR_VAR(0, 13, 1) rh, WR_VAR(0, 13, 3) tp, WR_VAR(0, 13, 11) mwd, WR_VAR(0, 22, 1) swh, WR_VAR(0, 22, 70) pp1d, WR_VAR(0, 22, 71) mwp, WR_VAR(0, 22, 74) conf, WR_VAR(0, 33, 7) data_id, WR_VAR(0, 33, 195) no, WR_VAR(0, 15, 192) no2, WR_VAR(0, 15, 193) o3, WR_VAR(0, 15, 194) pm10, WR_VAR(0, 15, 195) %% Varcode varcode_alias_resolve(const char* alias) { struct aliasdef* res = VarcodeAliases::find(alias, strlen(alias)); if (res == NULL) return 0; else return res->var; } Varcode varcode_alias_resolve_substring(const char* alias, int len) { struct aliasdef* res = VarcodeAliases::find(alias, len); if (res == NULL) return 0; else return res->var; } } /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/core/arrayfile.cc0000644000175000017500000000256511717006773014274 00000000000000/* * dballe/core/arrayfile - File I/O from in-memory vector * * Copyright (C) 2012 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "arrayfile.h" using namespace std; namespace dballe { ArrayFile::ArrayFile(Encoding type) : File("array", NULL, false), file_type(type), current(0) { } ArrayFile::~ArrayFile() { } Encoding ArrayFile::type() const throw () { return file_type; } void ArrayFile::write(const Rawmsg& msg) { msgs.push_back(msg); current = msgs.size(); } bool ArrayFile::read(Rawmsg& msg) { if (current >= msgs.size()) return false; msg = msgs[current]; ++current; return true; } } /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/core/csv.cc0000644000175000017500000002433011522565215013076 00000000000000/* * dballe/csv - CSV utility functions * * Copyright (C) 2005--2011 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include #include #include #include #include #include using namespace std; using namespace wreport; namespace dballe { CSVReader::~CSVReader() {} std::string CSVReader::unescape(const std::string& csvstr) { if (csvstr.empty()) return csvstr; if (csvstr[0] != '"') return csvstr; if (csvstr.size() == 1) return csvstr; string res; bool escape = false; for (string::const_iterator i = csvstr.begin() + 1; i != csvstr.end(); ++i) { if (*i == '"') { if (!escape) escape = true; else { res += *i; escape = false; } } else res += *i; } return res; } bool CSVReader::move_to_data(unsigned number_col) { while (true) { if (number_col < cols.size() && (cols[number_col].empty() || isdigit(cols[number_col][0]) || cols[number_col][0] == '-')) break; if (!next()) return false; } return true; } bool CSVReader::next() { cols.clear(); if (!nextline()) return false; // Tokenize the input line enum State { BEG, COL, QCOL, EQCOL } state = BEG; string col; for (string::const_iterator i = line.begin(); i != line.end(); ++i) { switch (state) { case BEG: switch (*i) { case '"': state = QCOL; break; case ',': case '\n': state = BEG; cols.push_back(col); break; default: state = COL; col += *i; break; } break; case COL: switch (*i) { case ',': case '\n': state = BEG; cols.push_back(col); col.clear(); break; default: col += *i; break; } break; case QCOL: switch (*i) { case '\"': state = EQCOL; break; case '\n': state = BEG; cols.push_back(col); col.clear(); break; default: col += *i; break; } break; case EQCOL: switch (*i) { case ',': case '\n': state = BEG; cols.push_back(col); col.clear(); break; default: col += *i; break; } break; } } if (!col.empty()) cols.push_back(col); return true; } bool IstreamCSVReader::nextline() { if (in.eof()) return false; getline(in, line); if (in.bad()) throw error_system("reading line from CSV input"); if (in.eof() && line.empty()) return false; return true; } bool csv_read_next(FILE* in, std::vector& cols) { char line[2000]; char* tok; char* stringp; if (fgets(line, 2000, in) == NULL) return false; cols.clear(); for (stringp = line; (tok = strsep(&stringp, ",")) != NULL; ) cols.push_back(tok); return true; } void csv_output_quoted_string(ostream& out, const std::string& str) { if (str.find_first_of("\",") != string::npos) { out << "\""; for (string::const_iterator i = str.begin(); i != str.end(); ++i) { if (*i == '"') out << '"'; out << *i; } out << "\""; } else out << str; } #if 0 #ifdef HAVE_CHECK #include static void print_dba_error() { const char* details = dba_error_get_details(); fprintf(stderr, "Error %d (%s) while %s", dba_error_get_code(), dba_error_get_message(), dba_error_get_context()); if (details == NULL) fputc('\n', stderr); else fprintf(stderr, ". Details:\n%s\n", details); } #define CHECKED(...) \ do{ \ dba_err err = __VA_ARGS__; \ if (err) print_dba_error(); \ fail_unless(err == DBA_OK); \ } while (0) void test_dba_csv() { { /* Test dba_item handling */ dba_item chain = NULL, item = NULL; CHECKED(dba_item_obtain(&chain, "cippo", &item)); fail_unless_chain_is(chain, "cippo", chain); fail_unless_chain_hasnt(chain, "lippo"); CHECKED(dba_item_obtain(&chain, "lippo", &item)); fail_unless(item != chain); fail_unless_chain_is(chain, "cippo", chain); fail_unless_chain_is(chain, "lippo", item); dba_item_remove(&chain, "cippo"); fail_unless(item == chain); fail_unless_chain_hasnt(chain, "cippo"); fail_unless_chain_is(chain, "lippo", item); dba_item_remove(&chain, "lippo"); fail_unless(chain == NULL); dba_item_delete(chain); } { /* Hash table handling */ dba_record rec; dba_item item = NULL; CHECKED(dba_record_create(&rec)); fail_unless(rec != NULL); fail_unless_hasnt(rec, "cippo"); CHECKED(dba_record_obtain_item(rec, "cippo", &item)); fail_unless(item != NULL); fail_unless_has(rec, "cippo"); item->value = strdup("cippo"); fail_unless_hasnt(rec, "lippo"); CHECKED(dba_record_obtain_item(rec, "lippo", &item)); fail_unless(item != NULL); fail_unless_has(rec, "cippo"); fail_unless_has(rec, "lippo"); item->value = strdup("lippo"); fail_unless_is_it(rec, "cippo"); fail_unless_is_it(rec, "lippo"); dba_record_remove_item(rec, "cippo"); fail_unless_hasnt(rec, "cippo"); fail_unless_has(rec, "lippo"); dba_record_remove_item(rec, "cippo"); fail_unless_hasnt(rec, "cippo"); fail_unless_has(rec, "lippo"); dba_record_remove_item(rec, "pippo"); fail_unless_hasnt(rec, "cippo"); fail_unless_has(rec, "lippo"); dba_record_remove_item(rec, "lippo"); fail_unless_hasnt(rec, "cippo"); fail_unless_hasnt(rec, "lippo"); dba_record_remove_item(rec, "pippo"); fail_unless_hasnt(rec, "cippo"); fail_unless_hasnt(rec, "lippo"); dba_record_delete(rec); } { /* Keyword info handling */ dba_varinfo* info; int index; fail_unless(dba_record_keyword("cippo", &index) == NULL); fail_unless(dba_record_keyword("zzzip", &index) == NULL); fail_unless((info = dba_record_keyword("idstaz_select", &index)) != NULL); fail_unless(strcmp(info->desc, "Unique station identifier") == 0); fail_unless((info = dba_record_keyword("yearmin", &index)) != NULL); fail_unless(strcmp(info->desc, "Year or minimum year queried") == 0); fail_unless((info = dba_record_keyword("lat", &index)) != NULL); fail_unless(strcmp(info->desc, "Latitude") == 0); fail_unless((info = dba_record_keyword("lon", &index)) != NULL); fail_unless(strcmp(info->desc, "Longitude") == 0); } { /* Record gets and sets */ dba_err err; int ival; dba_record rec; CHECKED(dba_record_create(&rec)); err = dba_enqi(rec, "idstaz_select", &ival); fail_unless(err == DBA_ERROR); fail_unless(dba_error_get_code() == DBA_ERR_TYPE); err = dba_enqi(rec, "lat", &ival); fail_unless(err == DBA_ERROR); fail_unless(dba_error_get_code() == DBA_ERR_NOTFOUND); err = dba_seti(rec, "idstaz_select", 1); fail_unless(err == DBA_ERROR); fail_unless(dba_error_get_code() == DBA_ERR_TYPE); CHECKED(dba_seti(rec, "ana_id", -10)); CHECKED(dba_seti(rec, "lat", 1234567)); CHECKED(dba_setd(rec, "lon", 76.54321)); CHECKED(dba_setc(rec, "yearmin", "1976")); CHECKED(dba_setc(rec, "B02121", "456")); fail_unless_int_is(rec, "ana_id", -10); fail_unless_real_is(rec, "ana_id", -10.0); fail_unless_int_is(rec, "lon", 7654321); /*fail_unless_float_is(rec, "lon", 76.54321);*/ fail_unless_real_is(rec, "lon", 76.54321); fail_unless_char_is(rec, "lon", "7654321"); fail_unless_int_is(rec, "lat", 1234567); /*fail_unless_float_is(rec, "lat", 12.34567);*/ fail_unless_real_is(rec, "lat", 12.34567); fail_unless_char_is(rec, "lat", "1234567"); fail_unless_int_is(rec, "yearmin", 1976); fail_unless_float_is(rec, "yearmin", 1976); fail_unless_real_is(rec, "yearmin", 1976); fail_unless_char_is(rec, "yearmin", "1976"); fail_unless_int_is(rec, "B02121", 456); /*fail_unless_float_is(rec, "B02121", 45600000000.0)*/; fail_unless_real_is(rec, "B02121", 45600000000.0); fail_unless_char_is(rec, "B02121", "456"); CHECKED(dba_unset(rec, "lat")); err = dba_enqi(rec, "lat", &ival); fail_unless(err == DBA_ERROR); fail_unless(dba_error_get_code() == DBA_ERR_NOTFOUND); /* fprintf(stderr, "IVAL: %d\n", ival); */ /* fprintf(stderr, "DVAL: %f\n", fval); */ /* { int i = 7654321; double f = (double)i / 100000; fprintf(stderr, "I: %d, F: %f\n", i, f); } */ /* See if clear clears */ dba_record_clear(rec); err = dba_enqi(rec, "lat", &ival); fail_unless(err == DBA_ERROR); fail_unless(dba_error_get_code() == DBA_ERR_NOTFOUND); dba_record_clear(rec); err = dba_enqi(rec, "lat", &ival); fail_unless(err == DBA_ERROR); fail_unless(dba_error_get_code() == DBA_ERR_NOTFOUND); dba_record_delete(rec); } } #endif #endif } // namespace dballe /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/core/byteswap.h0000644000175000017500000000403311674642054014006 00000000000000#ifndef DBALLE_CORE_BYTESWAP_H #define DBALLE_CORE_BYTESWAP_H #include "config.h" #if USE_OWN_BSWAP /* byteswap.h - Byte swapping Copyright (C) 2005, 2007, 2009-2011 Free Software Foundation, Inc. Written by Oskar Liljeblad , 2005. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 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 . */ /* Given an unsigned 16-bit argument X, return the value corresponding to X with reversed byte order. */ #define bswap_16(x) ((((x) & 0x00FF) << 8) | \ (((x) & 0xFF00) >> 8)) /* Given an unsigned 32-bit argument X, return the value corresponding to X with reversed byte order. */ #define bswap_32(x) ((((x) & 0x000000FF) << 24) | \ (((x) & 0x0000FF00) << 8) | \ (((x) & 0x00FF0000) >> 8) | \ (((x) & 0xFF000000) >> 24)) /* Given an unsigned 64-bit argument X, return the value corresponding to X with reversed byte order. */ #define bswap_64(x) ((((x) & 0x00000000000000FFULL) << 56) | \ (((x) & 0x000000000000FF00ULL) << 40) | \ (((x) & 0x0000000000FF0000ULL) << 24) | \ (((x) & 0x00000000FF000000ULL) << 8) | \ (((x) & 0x000000FF00000000ULL) >> 8) | \ (((x) & 0x0000FF0000000000ULL) >> 24) | \ (((x) & 0x00FF000000000000ULL) >> 40) | \ (((x) & 0xFF00000000000000ULL) >> 56)) #else #include #endif #endif dballe-5.18/dballe/core/file.h0000644000175000017500000000626111450571221013061 00000000000000/* * dballe/file - File I/O * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #ifndef DBA_CORE_FILE_H #define DBA_CORE_FILE_H /** @file * @ingroup core * File I/O for files containing meterorological messages. * * This module provides a unified interface to read and write messages to files * in various formats. * * Format-specific implementation is not provided by this module, but other * libraries can implement format specific read and write functions and * register them with ::dba_file. */ #include #include #include #include namespace dballe { struct Rawmsg; class File { protected: /** Name of the file */ std::string m_name; /** FILE structure used to read or write to the file */ FILE* fd; /** Set to true if fd should be closed when dba_file_delete() is called */ bool close_on_exit; /** Index of the last message read from the file or written to the file */ int idx; public: File(const std::string& name, FILE* fd, bool close_on_exit=true); virtual ~File(); /** * Get the file stream */ FILE* stream() const throw () { return fd; } /** * Get the type of the dba_file * * @return * The file encoding. */ const std::string& name() const throw () { return m_name; } /** * Get the name of the dba_file * * @return * The file name. */ virtual Encoding type() const throw () = 0; /** * Read a message from the file. * * @param msg * The Rawmsg that will hold the data. * @return * true if a message has been found in the file, else false. */ virtual bool read(Rawmsg& msg) = 0; /** * Write the encoded message data to the file * * @param msg * The ::dba_rawmsg with the encoded data to write */ virtual void write(const Rawmsg& msg); /** * Create a dba_file structure. * * @param type * The type of data contained in the file. If -1 is passed, then * create will attempt to autodetect the file type from its first * byte. * @param name * The name of the file to access. "(stdin)", "(stdout)" and "(stderr)" are * special file names, that will use the corresponding stream instead of open * a file. * @param mode * The opening mode of the file, as used by fopen. * @returns * The newly allocated File, that needs to be deleted by the caller. */ static std::auto_ptr create(Encoding type, const std::string& name, const char* mode); }; } // namespace dballe /* vim:set ts=4 sw=4: */ #endif dballe-5.18/dballe/core/test-utils-core.h0000644000175000017500000002124511443762113015210 00000000000000/* * core/test-utils-core - Test utility functions for the core module * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include #include #include #include #include #include #include #include #include #include namespace dballe { namespace tests { /* static void _ensureRecordHas(const char* file, int line, dba_record rec, const char* key, int val) { int v; INNER_CHECKED(dba_enqi(rec, key, &v)); ensure_equals(v, val); } static void _ensureRecordHas(const char* file, int line, dba_record rec, const char* key, double val) { double v; INNER_CHECKED(dba_enqd(rec, key, &v)); ensure_equals(v, val); } static void _ensureRecordHas(const char* file, int line, dba_record rec, const char* key, const char* val) { const char* v; INNER_CHECKED(dba_enqc(rec, key, &v)); gen_ensure(strcmp(v, val) == 0); } #define ensureRecordHas(...) _ensureRecordHas(__FILE__, __LINE__, __VA_ARGS__) */ #if 0 class TestRecord { protected: class Test { public: virtual ~Test() {} virtual void setIn(const char* file, int line, dba_record rec) const = 0; virtual void checkIn(const char* file, int line, dba_record rec) const = 0; virtual Test* clone() const = 0; virtual bool sameTest(const Test* test) const = 0; }; template class TestKey : public Test { protected: dba_keyword m_key; VAL m_val; dba_err rset(dba_record r, dba_keyword k, int v) const { return dba_record_key_seti(r, k, v); } dba_err rset(dba_record r, dba_keyword k, double v) const { return dba_record_key_setd(r, k, v); } dba_err rset(dba_record r, dba_keyword k, const std::string& v) const { return dba_record_key_setc(r, k, v.c_str()); } public: TestKey(dba_keyword key, const VAL& val) : m_key(key), m_val(val) {} virtual void setIn(const char* file, int line, dba_record rec) const { INNER_CHECKED(rset(rec, m_key, m_val)); } virtual void checkIn(const char* file, int line, dba_record rec) const { dba_var var = dba_record_key_peek(rec, m_key); try { inner_ensure(var != NULL); inner_ensure_var_equals(var, m_val); } catch (tut::failure& f) { //dba_record_print(rec, stderr); string msg = f.what(); dba_varinfo info; dba_record_keyword_info(m_key, &info); msg += " comparing "; msg += info->desc; throw tut::failure(msg); } } virtual Test* clone() const { return new TestKey(m_key, m_val); } virtual bool sameTest(const Test* test) const { const TestKey* t = dynamic_cast(test); if (t == NULL) return false; return t->m_key == m_key; } }; template class TestVar : public Test { protected: dba_varcode m_key; VAL m_val; dba_err rset(dba_record r, dba_varcode k, int v) const { return dba_record_var_seti(r, k, v); } dba_err rset(dba_record r, dba_varcode k, double v) const { return dba_record_var_setd(r, k, v); } dba_err rset(dba_record r, dba_varcode k, const std::string& v) const { return dba_record_var_setc(r, k, v.c_str()); } public: TestVar(dba_varcode key, const VAL& val) : m_key(key), m_val(val) {} virtual void setIn(const char* file, int line, dba_record rec) const { INNER_CHECKED(rset(rec, m_key, m_val)); } virtual void checkIn(const char* file, int line, dba_record rec) const { dba_var var = dba_record_var_peek(rec, m_key); try { inner_ensure(var != NULL); inner_ensure_var_equals(var, m_val); } catch (tut::failure& f) { //dba_record_print(rec, stderr); string msg = f.what(); dba_varinfo info; dba_varinfo_query_local(m_key, &info); msg += " comparing "; msg += info->desc; throw tut::failure(msg); } } virtual Test* clone() const { return new TestVar(m_key, m_val); } virtual bool sameTest(const Test* test) const { const TestVar* t = dynamic_cast(test); if (t == NULL) return false; return t->m_key == m_key; } }; std::vector tests; void addTest(Test* test) { for (std::vector::iterator i = tests.begin(); i != tests.end(); i++) if ((*i)->sameTest(test)) { delete *i; *i = test; return; } tests.push_back(test); } public: TestRecord() {} TestRecord(const TestRecord& r) { for (std::vector::const_iterator i = r.tests.begin(); i != r.tests.end(); i++) tests.push_back((*i)->clone()); } ~TestRecord() throw () { for (std::vector::iterator i = tests.begin(); i != tests.end(); i++) delete *i; } TestRecord& operator=(const TestRecord& r) { for (std::vector::iterator i = tests.begin(); i != tests.end(); i++) delete *i; tests.clear(); for (std::vector::const_iterator i = r.tests.begin(); i != r.tests.end(); i++) tests.push_back((*i)->clone()); return *this; } void set(dba_keyword key, int val) { addTest(new TestKey(key, val)); } void set(dba_keyword key, double val) { addTest(new TestKey(key, val)); } void set(dba_keyword key, const char* val) { addTest(new TestKey(key, val)); } void set(dba_varcode key, int val) { addTest(new TestVar(key, val)); } void set(dba_varcode key, double val) { addTest(new TestVar(key, val)); } void set(dba_varcode key, const char* val) { addTest(new TestVar(key, val)); } void _copyTestDataToRecord(const char* file, int line, dba_record rec) { for (std::vector::const_iterator i = tests.begin(); i != tests.end(); i++) (*i)->setIn(file, line, rec); } #define copyTestDataToRecord(rec) _copyTestDataToRecord(__FILE__, __LINE__, rec) void ensureEquals(const char* file, int line, dba_record rec) { for (std::vector::const_iterator i = tests.begin(); i != tests.end(); i++) (*i)->checkIn(file, line, rec); } }; #define ensureTestRecEquals(rec, tr) tr.ensureEquals(__FILE__, __LINE__, rec) #endif /* Some utility random generator functions */ static inline int rnd(int min, int max) { return min + (int) ((max - min) * (rand() / (RAND_MAX + 1.0))); } static inline double rnd(double min, double max) { return min + (int) ((max - min) * (rand() / (RAND_MAX + 1.0))); } static inline std::string rnd(int len) { std::string res; int max = rnd(1, len); for (int i = 0; i < max; i++) res += (char)rnd('a', 'z'); return res; } static inline bool rnd(double prob) { return (rnd(0, 100) < prob*100) ? true : false; } #if 0 /* Random message generation functions */ class generator { std::vector reused_pseudoana_fixed; std::vector reused_pseudoana_mobile; std::vector reused_context; public: ~generator(); dba_err fill_pseudoana(dba_record rec, bool mobile); dba_err fill_context(dba_record rec); dba_err fill_record(dba_record rec); }; #endif /* Message reading functions */ /// Return the pathname of a test file std::string datafile(const std::string& fname); #if 0 class dba_raw_consumer { public: virtual ~dba_raw_consumer() {} virtual dba_err consume(dba_rawmsg raw) = 0; }; dba_err read_file(dba_encoding type, const std::string& name, dba_raw_consumer& cons); #endif std::auto_ptr _open_test_data(const wibble::tests::Location& loc, const char* filename, Encoding type); #define open_test_data(filename, type) dballe::tests::_open_test_data(wibble::tests::Location(__FILE__, __LINE__, "open " #filename " " #type), (filename), (type)) #define inner_open_test_data(filename, type) dballe::tests::_open_test_data(wibble::tests::Location(loc, __FILE__, __LINE__, #filename " " #type), (filename), (type)) std::auto_ptr _read_rawmsg(const wibble::tests::Location& loc, const char* filename, Encoding type); #define read_rawmsg(filename, type) dballe::tests::_read_rawmsg(wibble::tests::Location(__FILE__, __LINE__, "load " #filename " " #type), (filename), (type)) #define inner_read_rawmsg(filename, type) dballe::tests::_read_rawmsg(wibble::tests::Location(loc, __FILE__, __LINE__, "load " #filename " " #type), (filename), (type)) } } // vim:set ts=4 sw=4: dballe-5.18/dballe/core/mkkeydoc0000755000175000017500000002142311627727607013543 00000000000000#!/usr/bin/perl -w use strict; use warnings; # The values are: # required/optional/ignored on insert # required/optional/ignored on query # present/absent on results # comment about the field [optional value] our %comments = ( priority => [ "ignored", "optional", "present", "Every type of report has an associated priority that controls ". "which data are first returned when there is more than one in the ". "same physical space. It can be changed by editing ". "/etc/dballe/repinfo.csv"], priomax => [ "ignored", "optional", "absent" ], priomin => [ "ignored", "optional", "absent" ], rep_cod => [ "required this or rep_memo", "optional", "present" ], rep_memo => [ "required this or rep_cod", "optional", "present" ], ana_id => [ "optional", "optional", "present", "Internal DB-ALLe ID referring to a pseudoana entry, used as ". "a shortcut reference instead of specifying the full data" ], block => [ "optional", "optional", "present" ], station => [ "optional", "optional", "present" ], mobile => [ "required", "optional", "present", "Set to 1 if the station is mobile, such as a ship or a flight; else 0"], ident => [ "required if mobile=1", "optional", "present if mobile=1" ], name => [ "optional", "optional", "present" ], lat => [ "required", "optional", "present", "on insert, it has priority over ana_id" ], lon => [ "required", "optional", "present", "on insert, it has priority over ana_id" ], latmax => [ "ignored", "optional", "absent" ], latmin => [ "ignored", "optional", "absent" ], lonmax => [ "ignored", "optional", "absent" ], lonmin => [ "ignored", "optional", "absent" ], height => [ "optional", "optional", "present" ], heightbaro => [ "optional", "optional", "present" ], year_ident => [ "required if mobile=1", "optional", "present if mobile=1", "Only needed when the station is mobile"], month_ident => [ "required if mobile=1", "optional", "present if mobile=1", "Only needed when the station is mobile"], day_ident => [ "required if mobile=1", "optional", "present if mobile=1", "Only needed when the station is mobile"], hour_ident => [ "required if mobile=1", "optional", "present if mobile=1", "Only needed when the station is mobile"], min_ident => [ "required if mobile=1", "optional", "present if mobile=1", "Only needed when the station is mobile"], # datetime => [ "ignored", "ignored", "present", # "Convenience parameter: after a query it contains the datetime informations ", # " all in a single string"], year => [ "required", "optional", "present" ], month => [ "required", "optional", "present" ], day => [ "required", "optional", "present" ], hour => [ "required", "optional", "present" ], min => [ "required", "optional", "present" ], sec => [ "required", "optional", "present" ], yearmax => [ "ignored", "optional", "absent" ], yearmin => [ "ignored", "optional", "absent" ], monthmax => [ "ignored", "optional", "absent" ], monthmin => [ "ignored", "optional", "absent" ], daymax => [ "ignored", "optional", "absent" ], daymin => [ "ignored", "optional", "absent" ], hourmax => [ "ignored", "optional", "absent" ], hourmin => [ "ignored", "optional", "absent" ], minumax => [ "ignored", "optional", "absent" ], minumin => [ "ignored", "optional", "absent" ], secmax => [ "ignored", "optional", "absent" ], secmin => [ "ignored", "optional", "absent" ], leveltype => [ "required", "optional", "present" ], l1 => [ "required", "optional", "present" ], l2 => [ "required", "optional", "present" ], pindicator => [ "required", "optional", "present" ], p1 => [ "required", "optional", "present" ], p2 => [ "required", "optional", "present" ], var => [ "ignored", "optional", "present, indicates the name of the last variable returned" ], varlist => [ "ignored", "optional", "absent", "Comma-separated list of variable codes wanted on output" ], query => [ "ignored", "optional", "absent", "Comma-separated list of query modifiers. Can have one of: ". "'best', 'bigana', 'nosort', 'stream'. ". "Examples: 'best', 'nosort,stream'" ], ana_filter => [ "ignored", "optional", "absent", "Restricts the results to only those stations which ". "have a pseudoana value that matches the filter. ". "Examples: 'height>=1000', 'B02001=1', '1000<=height<=2000" ], data_filter => [ "ignored", "optional", "absent", "Restricts the results to only those stations which ". "have a data value that matches the filter. ". "Examples: 't<260', 'B22021>2', '10<=B22021<=20'" ], attr_filter => [ "ignored", "optional", "absent", "Restricts the results to only those data which ". "have an attribute that matches the filter. ". "Examples: 'conf>70', 'B33197=0', '25<=conf<=50'" ], limit => [ "ignored", "optional", "absent", "Maximum number of results to return" ], ); my $op = $ARGV[0]; # Read the data my @data; while () { chop(); if (/^([^,]+),([^,]+),(\d+),(\d+),(.+?)\s*$/) { push @data, [$1, $2, $3, $4, $5]; } } our ($tag, $unit, $format, $desc, $ins, $que, $res, $com); our $DoxIntro = q{/**@defgroup dba_record_keywords Keywords used by dba_record @ingroup tables This table lists the keywords used by ::dba_record. You can use them to query and set data using function such as dba_enqi() and dba_seti(). Every keyword is listed together with its measure unit, length in characters or digits and description. \verbatim }; format DoxTop = Name Unit Format Description . format Dox = @<<<<<<<<<<<< @<<<<<<<< @<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< $tag, $unit, $format, $desc . our $DoxBottom = q{\endverbatim */ }; our $RstIntro = q{.. table:: Standard parameter names ============= ========= ========== =========================== ========= ======== ========== =============================== Name Unit Format Description On Insert On query On results Comment ============= ========= ========== =========================== ========= ======== ========== =============================== }; format Rst = @<<<<<<<<<<<< @<<<<<<<< ^<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<< ^<<<<<<< ^<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< $tag, $unit, $format, $desc, $ins, $que, $res, $com ~~ ^<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<< ^<<<<<<< ^<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< $format, $desc, $ins, $que, $res, $com . our $RstBottom = ' ============= ========= ========== =========================== ========= ======== ========== ==============================='; sub mkformat($$$) { my ($unit, $len, $dec) = @_; if ($unit =~ /^CHARACTER|^CODE TABLE/) { return "$len chars"; } elsif ($dec == 0) { return "$len digits"; } else { return '#' x ($len - $dec) . '.' . '#' x $dec; } } if ($op eq 'dox') { print $DoxIntro; $^ = "DoxTop"; $~ = "Dox"; for my $d (@data) { my ($len, $dec); ($tag, $unit, $len, $dec, $desc) = @$d; $com = ($comments{$tag} or ''); $format = mkformat($unit, $len, $dec); write STDOUT; } print $DoxBottom; } elsif ($op eq 'rst') { print $RstIntro; #$^ = "RstTop"; $~ = "Rst"; for my $d (@data) { my ($len, $dec); ($tag, $unit, $len, $dec, $desc) = @$d; $ins = ($comments{$tag}[0] or ''); $que = ($comments{$tag}[1] or ''); $res = ($comments{$tag}[2] or ''); $com = ($comments{$tag}[3] or ''); $format = mkformat($unit, $len, $dec); write STDOUT; } print $RstBottom, "\n"; } elsif ($op eq 'tex') { my $nc = '@{\hspace{0.5mm}}l@{\hspace{0.5mm}}'; my $dsc = '@{\hspace{0.5mm}}p{2.0cm}@{\hspace{0.5mm}}'; my $onc = '@{\hspace{0.5mm}}p{1.4cm}@{\hspace{0.5mm}}'; my $cmc = '@{\hspace{0.5mm}}p{3.5cm}@{\hspace{0.5mm}}'; print qq#{\\begin{scriptsize} \\begin{longtable}{|$nc|$nc|$nc|$dsc|$onc|$onc|$onc|$cmc|} \\hline {\\em Name} & {\\em Unit} & {\\em Format} & {\\em Description} & {\\em On insert input} & {\\em On query input} & {\\em On output} & {\\em Comment} \\\\ \\hline \\endhead \\hline \\endfoot #; for my $d (@data) { my ($len, $dec); ($tag, $unit, $len, $dec, $desc) = @$d; $ins = ($comments{$tag}[0] or ''); $que = ($comments{$tag}[1] or ''); $res = ($comments{$tag}[2] or ''); $com = ($comments{$tag}[3] or ''); $format = mkformat($unit, $len, $dec); $format =~ s/(\#+\.\#+)/{\\tiny $1}/; $unit =~ s/CHARACTER/Character/; $unit =~ s/(NUMERIC|NUMBER)/Numeric/; my $out = join(' & ', ($tag, $unit, $format, $desc, $ins, $que, $res, $com))." \\\\\n"; $out =~ s/(_|#)/\\$1/g; print $out; } print q#\hline \end{longtable} \end{scriptsize} } #; } else { die "unknown output format ".$ARGV[0]; } dballe-5.18/dballe/core/tests/0000755000175000017500000000000011754670141013216 500000000000000dballe-5.18/dballe/core/tests/record.cc0000644000175000017500000003035211636647736014743 00000000000000/* * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "core/test-utils-core.h" #include "core/record.h" /* extern "C" { dba_err dba_record_keyword_selftest(); }; */ using namespace dballe; using namespace std; namespace tut { struct record_shar { Record rec; record_shar() { } ~record_shar() { } }; TESTGRP(record); /* #define fail_unless_chain_is(chain, param, compare) \ { \ dba_item item; \ dba_err err = dba_item_get(chain, param, &item); \ fail_unless(err == DBA_OK); \ fail_unless(item == compare); \ } void fail_unless_chain_hasnt(dba_item chain, dba_varcode param) { dba_item item = NULL; ensure(dba_item_get(chain, param, &item) == DBA_ERROR); } void fail_unless_is_it(dba_record rec, dba_varcode param) { dba_item item = NULL; dba_err err = dba_record_get_item(rec, param, &item); if (err) print_dba_error(); fail_unless(err == DBA_OK); fail_unless(item != NULL); fail_unless(dba_var_code(item->var) == param); fail_unless(atoi(dba_var_value(item->var)) == param); } void fail_unless_has(dba_record rec, dba_varcode param) { dba_item item = NULL; dba_err err = dba_record_get_item(rec, param, &item); if (err) print_dba_error(); fail_unless(err == DBA_OK); fail_unless(item != NULL); fail_unless(dba_var_code(item->var) == param); } void fail_unless_hasnt(dba_record rec, dba_varcode param) { dba_item item = NULL; fail_unless(dba_record_get_item(rec, param, &item) == DBA_ERROR); } */ #define fail_unless_int_is(keyvar, param, value) do { \ int found; \ int val; \ CHECKED(dba_record_##keyvar##_enqi(rec, param, &val, &found)); \ ensure_equals(found, 1); \ ensure_equals(val, value); \ } while (0) #define fail_unless_double_is(keyvar, param, value) do { \ int found; \ double val; \ CHECKED(dba_record_##keyvar##_enqd(rec, param, &val, &found)); \ ensure_equals(found, 1); \ ensure_equals(val, value); \ } while (0) #define fail_unless_char_is(keyvar, param, value) do { \ const char* val; \ CHECKED(dba_record_##keyvar##_enqc(rec, param, &val)); \ ensure(val != NULL); \ ensure_equals(string(val), string(value)); \ } while (0) // Check handling of keyword and variable information template<> template<> void to::test<1>() { // Keyword name resolution ensure(Record::keyword_byname("cippo") == DBA_KEY_ERROR); ensure(Record::keyword_byname("zzzip") == DBA_KEY_ERROR); ensure(Record::keyword_byname("ana_id") == DBA_KEY_ANA_ID); ensure(Record::keyword_byname_len("ana_idi", 6) == DBA_KEY_ANA_ID); ensure_equals(string(Record::keyword_info(DBA_KEY_ANA_ID)->desc), "Station database ID"); ensure(Record::keyword_byname("yearmin") == DBA_KEY_YEARMIN); ensure_equals(string(Record::keyword_info(DBA_KEY_YEARMIN)->desc), "Year or minimum year queried"); ensure(Record::keyword_byname("lat") == DBA_KEY_LAT); ensure_equals(string(Record::keyword_info(DBA_KEY_LAT)->desc), "Latitude"); ensure(Record::keyword_byname("lon") == DBA_KEY_LON); ensure_equals(string(Record::keyword_info(DBA_KEY_LON)->desc), "Longitude"); } // Test get and set methods template<> template<> void to::test<2>() { // Check that things don't exist at the beginning ensure(rec.key_peek(DBA_KEY_ANA_ID) == NULL); ensure(rec.key_peek(DBA_KEY_LAT) == NULL); ensure(rec.var_peek(WR_VAR(0, 20, 1)) == NULL); ensure(rec.var_peek(WR_VAR(0, 20, 3)) == NULL); // Set various things rec.key(DBA_KEY_ANA_ID).seti(-10); rec.key(DBA_KEY_LAT).seti(1234567); rec.key(DBA_KEY_LON).setd(76.54321); rec.key(DBA_KEY_YEARMIN).setc("1976"); rec.var(WR_VAR(0, 20, 1)).setc("456"); rec.var(WR_VAR(0, 20, 3)).setc("456"); // Check that they now exist ensure(rec.key_peek(DBA_KEY_ANA_ID) != NULL); ensure(rec.key_peek(DBA_KEY_LAT) != NULL); ensure(rec.var_peek(WR_VAR(0, 20, 1)) != NULL); ensure(rec.var_peek(WR_VAR(0, 20, 3)) != NULL); // Check that they have the right value ensure_equals(rec.key_peek(DBA_KEY_ANA_ID)->enqi(), -10); ensure_equals(rec.key_peek(DBA_KEY_ANA_ID)->enqd(), -10.0); ensure_equals(rec.key_peek(DBA_KEY_LON)->enqi(), 7654321); ensure_equals(rec.key_peek(DBA_KEY_LON)->enqd(), 76.54321); ensure_equals(string(rec.key_peek(DBA_KEY_LON)->enqc()), "7654321"); ensure_equals(rec.key_peek(DBA_KEY_LAT)->enqd(), 12.34567); ensure_equals(rec.key_peek(DBA_KEY_YEARMIN)->enqd(), 1976.0); ensure_equals(rec.var_peek(WR_VAR(0, 20, 1))->enqd(), 4560.0); ensure_equals(rec.var_peek(WR_VAR(0, 20, 3))->enqd(), 456); // See if unset works for keywords rec.key_unset(DBA_KEY_LAT); ensure(rec.key_peek(DBA_KEY_LAT) == NULL); // See if unset works for variables rec.var_unset(WR_VAR(0, 20, 1)); ensure(rec.var_peek(WR_VAR(0, 20, 1)) == NULL); /* fprintf(stderr, "IVAL: %d\n", ival); */ /* fprintf(stderr, "DVAL: %f\n", fval); */ /* { int i = 7654321; double f = (double)i / 100000; fprintf(stderr, "I: %d, F: %f\n", i, f); } */ // See if clear clears rec.clear(); ensure(rec.key_peek(DBA_KEY_LAT) == NULL); ensure(rec.var_peek(WR_VAR(0, 20, 3)) == NULL); rec.clear(); ensure(rec.key_peek(DBA_KEY_LAT) == NULL); ensure(rec.var_peek(WR_VAR(0, 20, 3)) == NULL); } // CHECKED(dba_record_keyword_selftest()); #if 0 { int i; /* Check that the elements in tag_defs are properly sorted */ for (i = 0; i < (sizeof(tag_defs) / sizeof(struct tagdef)) - 1; i++) fail_unless(strcmp(tag_defs[i].tag, tag_defs[i + 1].tag) < 0); } #endif /*CHECKED(dba_vartable_create("dballe", &vartable));*/ #if 0 { /* Test dba_item handling */ dba_item chain = NULL, item = NULL; CHECKED(dba_item_obtain(&chain, 1, &item)); CHECKED(dba_var_createc(info1, &(item->var), "1")); fail_unless_chain_is(chain, 1, chain); fail_unless_chain_hasnt(chain, 2); CHECKED(dba_item_obtain(&chain, 2, &item)); CHECKED(dba_var_createc(info2, &(item->var), "2")); ensure(item != chain); fail_unless_chain_is(chain, 1, chain); fail_unless_chain_is(chain, 2, item); dba_item_remove(&chain, 1); ensure(item == chain); fail_unless_chain_hasnt(chain, 1); fail_unless_chain_is(chain, 2, item); dba_item_remove(&chain, 2); ensure(chain == NULL); dba_item_delete(chain); } #endif #if 0 { /* Hash table handling */ dba_record rec; dba_item item = NULL; CHECKED(dba_record_create(&rec)); ensure(rec != NULL); fail_unless_hasnt(rec, 1); CHECKED(dba_record_obtain_item(rec, 1, &item)); CHECKED(dba_var_createc(info1, &(item->var), "1")); ensure(item != NULL); fail_unless_has(rec, 1); fail_unless_hasnt(rec, 2); CHECKED(dba_record_obtain_item(rec, 2, &item)); CHECKED(dba_var_createc(info2, &(item->var), "2")); ensure(item != NULL); fail_unless_has(rec, 1); fail_unless_has(rec, 2); fail_unless_is_it(rec, 1); fail_unless_is_it(rec, 2); dba_record_remove_item(rec, 1); fail_unless_hasnt(rec, 1); fail_unless_has(rec, 2); dba_record_remove_item(rec, 1); fail_unless_hasnt(rec, 1); fail_unless_has(rec, 2); dba_record_remove_item(rec, 3); fail_unless_hasnt(rec, 1); fail_unless_has(rec, 2); dba_record_remove_item(rec, 2); fail_unless_hasnt(rec, 1); fail_unless_hasnt(rec, 2); dba_record_remove_item(rec, 3); fail_unless_hasnt(rec, 1); fail_unless_hasnt(rec, 2); dba_record_delete(rec); } #endif // This used to cause a segfault template<> template<> void to::test<4>() { Record rec; rec.key(DBA_KEY_IDENT).setc("nosort"); Record rec1; rec = rec; rec.key(DBA_KEY_IDENT).setc("nosort"); } // Test dba_record_equals template<> template<> void to::test<5>() { Record rec; rec.key(DBA_KEY_ANA_ID).seti(-10); rec.key(DBA_KEY_LAT).seti(1234567); rec.key(DBA_KEY_LON).setd(76.54321); rec.key(DBA_KEY_YEARMIN).setc("1976"); rec.var(WR_VAR(0, 20, 1)).setc("456"); rec.var(WR_VAR(0, 20, 3)).setc("456"); Record rec1; rec1 = rec; ensure(rec == rec1); ensure(rec1 == rec); ensure(!(rec != rec1)); ensure(!(rec1 != rec)); rec1.key(DBA_KEY_YEARMIN).seti(1975); ensure(rec != rec1); ensure(rec1 != rec); ensure(!(rec == rec1)); ensure(!(rec1 == rec)); rec1 = rec; ensure(rec == rec1); ensure(rec1 == rec); rec1.key_unset(DBA_KEY_YEARMIN); ensure(rec != rec1); ensure(rec1 != rec); rec1 = rec; ensure(rec == rec1); ensure(rec1 == rec); rec1.var(WR_VAR(0, 20, 1)).setc("45"); ensure(rec != rec1); ensure(rec1 != rec); rec1 = rec; ensure(rec == rec1); ensure(rec1 == rec); rec1.var_unset(WR_VAR(0, 20, 1)); ensure(rec != rec1); ensure(rec1 != rec); } // Test keyword metadata template<> template<> void to::test<6>() { wreport::Varinfo info = Record::keyword_info(DBA_KEY_REP_MEMO); ensure(info->is_string()); } #if 0 // Test set_from_string template<> template<> void to::test<6>() { int found; int ival; double dval; dba_record_clear(rec); CHECKED(dba_record_set_from_string(rec, "ana_id=10")); CHECKED(dba_record_set_from_string(rec, "lat=-10")); CHECKED(dba_record_set_from_string(rec, "lon=-10.45")); CHECKED(dba_record_set_from_string(rec, "B20001=4560")); CHECKED(dba_record_set_from_string(rec, "height=654")); CHECKED(dba_record_contains_key(rec, DBA_KEY_ANA_ID, &ival)); ensure_equals(ival, 1); CHECKED(dba_record_contains_key(rec, DBA_KEY_LAT, &ival)); ensure_equals(ival, 1); CHECKED(dba_record_contains_key(rec, DBA_KEY_LON, &ival)); ensure_equals(ival, 1); CHECKED(dba_record_contains_var(rec, WR_VAR(0, 20, 1), &ival)); ensure_equals(ival, 1); CHECKED(dba_record_contains_var(rec, WR_VAR(0, 7, 1), &ival)); ensure_equals(ival, 1); CHECKED(dba_record_key_enqi(rec, DBA_KEY_ANA_ID, &ival, &found)); ensure_equals(found, 1); ensure_equals(ival, 10); CHECKED(dba_record_key_enqd(rec, DBA_KEY_LAT, &dval, &found)); ensure_equals(found, 1); ensure_equals(dval, -10.0); CHECKED(dba_record_key_enqd(rec, DBA_KEY_LON, &dval, &found)); ensure_equals(found, 1); ensure_equals(dval, -10.45); CHECKED(dba_record_var_enqd(rec, WR_VAR(0, 20, 1), &dval, &found)); ensure_equals(found, 1); ensure_equals(dval, 4560.0); CHECKED(dba_record_var_enqd(rec, WR_VAR(0, 7, 1), &dval, &found)); ensure_equals(found, 1); ensure_equals(dval, 654.0); } // Test get and set methods using strings template<> template<> void to::test<7>() { int ival; double dval; const char* cval; int found; dba_record_clear(rec); // Keywords CHECKED(dba_record_key_seti(rec, DBA_KEY_ANA_ID, 3)); CHECKED(dba_record_enqi(rec, "ana_id", &ival, &found)); ensure_equals(found, 1); ensure_equals(ival, 3); CHECKED(dba_record_key_setd(rec, DBA_KEY_LAT, 15.2)); CHECKED(dba_record_enqd(rec, "lat", &dval, &found)); ensure_equals(found, 1); ensure_equals(dval, 15.2); CHECKED(dba_record_key_setc(rec, DBA_KEY_IDENT, "ciao")); CHECKED(dba_record_enqc(rec, "ident", &cval)); ensure(cval != NULL); ensure_equals(string(cval), "ciao"); // Values CHECKED(dba_record_var_seti(rec, WR_VAR(0, 1, 1), 5)); CHECKED(dba_record_enqi(rec, "block", &ival, &found)); ensure_equals(found, 1); ensure_equals(ival, 5); CHECKED(dba_record_enqi(rec, "B01001", &ival, &found)); ensure_equals(found, 1); ensure_equals(ival, 5); CHECKED(dba_record_var_setd(rec, WR_VAR(0, 12, 101), 12.5)); CHECKED(dba_record_enqd(rec, "t", &dval, &found)); ensure_equals(found, 1); ensure_equals(dval, 12.5); CHECKED(dba_record_enqd(rec, "B12101", &dval, &found)); ensure_equals(found, 1); ensure_equals(dval, 12.5); CHECKED(dba_record_var_setc(rec, WR_VAR(0, 1, 19), "oaic")); CHECKED(dba_record_enqc(rec, "name", &cval)); ensure(cval != NULL); ensure_equals(string(cval), "oaic"); CHECKED(dba_record_enqc(rec, "B01019", &cval)); ensure(cval != NULL); ensure_equals(string(cval), "oaic"); } // Test getters and setters of various elements template<> template<> void to::test<8>() { // Start from cases that failed in the past only CHECKED(dba_record_key_seti(rec, DBA_KEY_P2, 2)); } #endif } /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/core/tests/defs.cc0000644000175000017500000000375511636647676014420 00000000000000/* * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "core/test-utils-core.h" #include "core/defs.h" using namespace dballe; using namespace std; namespace tut { struct defs_shar { }; TESTGRP(defs); // Try to get descriptions for all the layers template<> template<> void to::test<1>() { for (int i = 0; i < 261; ++i) { Level(i).describe(); Level(i, 0).describe(); Level(i, MISSING_INT, i, MISSING_INT).describe(); Level(i, 0, i, 0).describe(); } } // Try to get descriptions for all the time ranges template<> template<> void to::test<2>() { for (int i = 0; i < 256; ++i) { Trange(i).describe(); Trange(i, 0).describe(); Trange(i, 0, 0).describe(); } } // Verify some well-known descriptions template<> template<> void to::test<3>() { ensure_equals(Level().describe(), "-"); ensure_equals(Level(103, 2000).describe(), "2.000m above ground"); ensure_equals(Level(103, 2000, 103, 4000).describe(), "Layer from [2.000m above ground] to [4.000m above ground]"); ensure_equals(Trange(254, 86400).describe(), "Instantaneous value"); ensure_equals(Trange(2, 0, 43200).describe(), "Maximum over 12h at forecast time 0"); ensure_equals(Trange(3, 194400, 43200).describe(), "Minimum over 12h at forecast time 2d 6h"); } } /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/core/tests/tut-main.cpp0000644000175000017500000000361111442157676015410 00000000000000#include #include #include #include namespace tut { test_runner_singleton runner; } using namespace wibble; void signal_to_exception(int) { throw std::runtime_error("killing signal catched"); } int main(int argc,const char* argv[]) { tut::reporter visi; signal(SIGSEGV,signal_to_exception); signal(SIGILL,signal_to_exception); if( (argc == 2 && (! strcmp ("help", argv[1]))) || argc > 3 ) { std::cout << "TUT example test application." << std::endl; std::cout << "Usage: example [regression] | [list] | [ group] [test]" << std::endl; std::cout << " List all groups: example list" << std::endl; std::cout << " Run all tests: example regression" << std::endl; std::cout << " Run one group: example std::auto_ptr" << std::endl; std::cout << " Run one test: example std::auto_ptr 3" << std::endl;; } // std::cout << "\nFAILURE and EXCEPTION in these tests are FAKE ;)\n\n"; tut::runner.get().set_callback(&visi); try { if( argc == 1 || (argc == 2 && std::string(argv[1]) == "regression") ) { tut::runner.get().run_tests(); } else if( argc == 2 && std::string(argv[1]) == "list" ) { std::cout << "registered test groups:" << std::endl; tut::groupnames gl = tut::runner.get().list_groups(); tut::groupnames::const_iterator i = gl.begin(); tut::groupnames::const_iterator e = gl.end(); while( i != e ) { std::cout << " " << *i << std::endl; ++i; } } else if( argc == 2 && std::string(argv[1]) != "regression" ) { tut::runner.get().run_tests(argv[1]); } else if( argc == 3 ) { tut::runner.get().run_test(argv[1],::atoi(argv[2])); } } catch( const std::exception& ex ) { std::cerr << "tut raised exception: " << ex.what() << std::endl; } return 0; } dballe-5.18/dballe/core/tests/aliases.cc0000644000175000017500000000271211636647650015100 00000000000000/* * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "core/test-utils-core.h" #include "core/aliases.h" using namespace dballe; namespace tut { struct aliases_shar { aliases_shar() { } ~aliases_shar() { } }; TESTGRP(aliases); // Test variable creation template<> template<> void to::test<1>() { ensure_equals(varcode_alias_resolve("block"), WR_VAR(0, 1, 1)); ensure_equals(varcode_alias_resolve("station"), WR_VAR(0, 1, 2)); ensure_equals(varcode_alias_resolve("height"), WR_VAR(0, 7, 30)); ensure_equals(varcode_alias_resolve("heightbaro"), WR_VAR(0, 7, 31)); ensure_equals(varcode_alias_resolve("name"), WR_VAR(0, 1, 19)); ensure_equals(varcode_alias_resolve("cippolippo"), 0); } } /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/core/tests/file.cc0000644000175000017500000000526211636647711014377 00000000000000/* * DB-ALLe - Archive for punctual meteorological data * * Copyright (C) 2005,2006 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "core/test-utils-core.h" #include "core/file.h" using namespace dballe; using namespace std; namespace tut { struct file_shar { file_shar() { } ~file_shar() { } }; TESTGRP(file); // BUFR Read test template<> template<> void to::test<1>() { auto_ptr f(File::create(BUFR, tests::datafile("bufr/bufr1"), "r")); Rawmsg msg; ensure(f->read(msg)); ensure_equals(msg.size(), 182u); } // CREX Read test template<> template<> void to::test<2>() { auto_ptr f(File::create(CREX, tests::datafile("crex/test-synop0.crex"), "r")); Rawmsg msg; ensure(f->read(msg)); ensure_equals(msg.size(), 251u); } // AOF Read test template<> template<> void to::test<3>() { auto_ptr f(File::create(AOF, tests::datafile("aof/obs1-11.0.aof"), "r")); Rawmsg msg; ensure(f->read(msg)); ensure_equals(msg.size(), 140u); } #if 0 static void test_parse(const char* src, int line, const char* fname, struct bufr_match* m) { bufr_message msg; int found; char* str; int val; /* Create the message to test */ CHECKED(bufr_message_create(&msg)); /* Resetting an empty message should do no harm */ bufr_message_reset(msg); /* Read the data from file */ CHECKED(bufr_file_read(file, msg, &found)); tb_fail_unless(found == 1); /* Parse it */ CHECKED(bufr_message_parse(msg)); /* Check the parsed values */ test_bufr(src, line, msg, m); /* Try reencoding it */ bufr_message_reset_encoded(msg); CHECKED(bufr_message_encode(msg)); CHECKED(bufrex_message_get_raw(msg, &str, &val)); fail_unless(val != 0); fail_unless(str[0] != 0); /* fprintf(stderr, "Encoded:\n - - -\n%.*s\n - - -\n", val, str); */ /* Try reparsing it */ bufr_message_reset_decoded(msg); CHECKED(bufr_message_parse(msg)); /* Check the reparsed values */ test_bufr(src, line, msg, m); bufr_message_delete(msg); bufr_file_delete(file); } #endif } /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/core/tests/rawmsg.cc0000644000175000017500000000262711636647723014765 00000000000000/* * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "core/test-utils-core.h" #include "core/rawmsg.h" using namespace std; using namespace dballe; namespace tut { struct rawmsg_shar { rawmsg_shar() { } ~rawmsg_shar() { } }; TESTGRP(rawmsg); // Basic generic tests template<> template<> void to::test<1>() { Rawmsg msg; ensure(msg.file.empty()); ensure_equals(msg.offset, 0); ensure_equals(msg.index, 0); ensure_equals(msg.size(), 0u); /* Resetting an empty message should do anything special */ msg.clear(); ensure(msg.file.empty()); ensure_equals(msg.offset, 0); ensure_equals(msg.index, 0); ensure_equals(msg.size(), 0u); } } /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/core/record.h0000644000175000017500000003032011533745010013412 00000000000000/* * dballe/record - groups of related variables * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #ifndef DBA_RECORD_H #define DBA_RECORD_H /** @file * @ingroup core * Implement a storage object for a group of related observation data */ #include #include #include namespace dballe { /** * Keyword used to quickly access context and query information from a record. */ enum _dba_keyword { DBA_KEY_ERROR = -1, DBA_KEY_PRIORITY = 0, DBA_KEY_PRIOMAX = 1, DBA_KEY_PRIOMIN = 2, DBA_KEY_REP_COD = 3, DBA_KEY_REP_MEMO = 4, DBA_KEY_ANA_ID = 5, DBA_KEY_MOBILE = 6, DBA_KEY_IDENT = 7, DBA_KEY_LAT = 8, DBA_KEY_LON = 9, DBA_KEY_LATMAX = 10, DBA_KEY_LATMIN = 11, DBA_KEY_LONMAX = 12, DBA_KEY_LONMIN = 13, DBA_KEY_YEAR = 14, DBA_KEY_MONTH = 15, DBA_KEY_DAY = 16, DBA_KEY_HOUR = 17, DBA_KEY_MIN = 18, DBA_KEY_SEC = 19, DBA_KEY_YEARMAX = 20, DBA_KEY_YEARMIN = 21, DBA_KEY_MONTHMAX = 22, DBA_KEY_MONTHMIN = 23, DBA_KEY_DAYMAX = 24, DBA_KEY_DAYMIN = 25, DBA_KEY_HOURMAX = 26, DBA_KEY_HOURMIN = 27, DBA_KEY_MINUMAX = 28, DBA_KEY_MINUMIN = 29, DBA_KEY_SECMAX = 30, DBA_KEY_SECMIN = 31, DBA_KEY_LEVELTYPE1 = 32, DBA_KEY_L1 = 33, DBA_KEY_LEVELTYPE2 = 34, DBA_KEY_L2 = 35, DBA_KEY_PINDICATOR = 36, DBA_KEY_P1 = 37, DBA_KEY_P2 = 38, DBA_KEY_VAR = 39, DBA_KEY_VARLIST = 40, DBA_KEY_CONTEXT_ID = 41, DBA_KEY_QUERY = 42, DBA_KEY_ANA_FILTER = 43, DBA_KEY_DATA_FILTER = 44, DBA_KEY_ATTR_FILTER = 45, DBA_KEY_LIMIT = 46, DBA_KEY_VAR_RELATED = 47, DBA_KEY_COUNT = 48, }; /** @copydoc ::_dba_keyword */ typedef enum _dba_keyword dba_keyword; /** DB-All.E record. * * A Record is a container for one observation of meteorological values, that * includes anagraphical informations, physical location of the observation in * time and space, and all the observed variables. */ class Record { protected: /* The storage for the core keyword data */ wreport::Var* keydata[DBA_KEY_COUNT]; /* The variables */ std::vector m_vars; /// Find an item by wreport::Varcode, returning -1 if not found int find_item(wreport::Varcode code) const throw (); /// Find an item by wreport::Varcode, raising an exception if not found wreport::Var& get_item(wreport::Varcode code); /// Find an item by wreport::Varcode, raising an exception if not found const wreport::Var& get_item(wreport::Varcode code) const; /// Remove an item by wreport::Varcode void remove_item(wreport::Varcode code); public: Record(); Record(const Record& rec); ~Record(); Record& operator=(const Record& rec); bool operator==(const Record& rec) const; bool operator!=(const Record& rec) const { return !operator==(rec); } /// Remove all data from the record void clear(); /// Remove all variables from the record, leaving the keywords intact void clear_vars(); /** * Copy all data from the record source into dest. At the end of the function, * dest will contain its previous values, plus the values in source. If a * value is present both in source and in dest, the one in dest will be * overwritten. * * @param source * The record to copy data from. */ void add(const Record& source); /** * Return true if all elements of \a subset are present in this record, * with the same value */ bool contains(const Record& subset) const; /** * Set the record to contain only those fields that change source1 into source2. * * If a field has been deleted from source1 to source2, it will not be copied * in dest. * * @param source1 * The original record to compute the changes from. * @param source2 * The new record that has changes over source1. */ void set_to_difference(const Record& source1, const Record& source2); /** * Look at the value of a parameter * * @return * A const pointer to the internal variable, or NULL if the variable has not * been found. */ const wreport::Var* key_peek(dba_keyword parameter) const throw (); /** * Look at the value of a variable * * @return * A const pointer to the internal variable, or NULL if the variable has not * been found. */ const wreport::Var* var_peek(wreport::Varcode code) const throw (); /** * Get the variable for an item * * @param name * The name of the item to get the value for */ const wreport::Var* peek(const char* name) const; /// Shortcut for key_peek const wreport::Var* peek(dba_keyword parameter) const throw () { return key_peek(parameter); } /// Shortcut for var_peek const wreport::Var* peek(wreport::Varcode code) const throw () { return var_peek(code); } /** * Look at the raw value of a keyword in the record, without raising errors. * * @param parameter * The keyword to get the value for. * @return * The raw string value, or NULL if the keyword has no value. */ const char* key_peek_value(dba_keyword parameter) const throw (); /** * Look at the raw value of a variable in the record, without raising errors. * * @param code * The variable to get the value for. See @ref vartable.h * @return * The raw string value, or NULL if the variable has no value. */ const char* var_peek_value(wreport::Varcode code) const throw (); /** * Get the string value for an item * * @param name * The name of the item to get the value for */ const char* peek_value(const char* name) const; /// Shortcut for key_peek_value const char* peek_value(dba_keyword parameter) const throw () { return key_peek_value(parameter); } /// Shortcut for var_peek_value const char* peek_value(wreport::Varcode code) const throw () { return var_peek_value(code); } /** * Return the Var for a key, throwing an error it if it missing */ const wreport::Var& key(dba_keyword parameter) const; /** * Return the Var for a variable, throwing an error it if it missing */ const wreport::Var& var(wreport::Varcode code) const; /** * Return the Var for a key, creating it if it missing */ wreport::Var& key(dba_keyword parameter); /** * Return the Var for a variable, creating it if it missing */ wreport::Var& var(wreport::Varcode code); /// Shortcuts // @{ const wreport::Var& get(dba_keyword parameter) const { return key(parameter); } const wreport::Var& get(wreport::Varcode code) const { return var(code); } const wreport::Var& get(const char* name) const; wreport::Var& get(dba_keyword parameter) { return key(parameter); } wreport::Var& get(wreport::Varcode code) { return var(code); } wreport::Var& get(const char* name); template T get(K name, T default_value) const { if (const wreport::Var* v = peek(name)) return v->enq(default_value); else return default_value; } const wreport::Var& operator[](dba_keyword parameter) const { return key(parameter); } const wreport::Var& operator[](wreport::Varcode code) const { return var(code); } const wreport::Var& operator[](const char* name) const { return get(name); } wreport::Var& operator[](dba_keyword parameter) { return key(parameter); } wreport::Var& operator[](wreport::Varcode code) { return var(code); } wreport::Var& operator[](const char* name) { return get(name); } template void set(const P& field, const V& val) { get(field).set(val); } void set(const wreport::Var& var) { get(var.code()).set(var); } void unset(dba_keyword parameter) { key_unset(parameter); } void unset(wreport::Varcode code) { var_unset(code); } void unset(const char* name); // @} /** * Set the date, level and timerange values to match the anagraphical context. */ void set_ana_context(); /** * Return the vector with the variables */ const std::vector& vars() const; /** * Remove a parameter from the record. * * @param parameter * The parameter to remove. */ void key_unset(dba_keyword parameter); /** * Remove a parameter from the record. * * @param code * The variable to remove. See @ref vartable.h */ void var_unset(wreport::Varcode code); /** * Parse the date extremes set in Record. * * This function will examine the values yearmin, monthmin, daymin, hourmin, * minumin, secmin, yearmax, monthmax, daymax, hourmax, minumax, secmax, year, * month, day, hour, min and sec, and will compute the two datetime extremes * that bound the interval they represent. * * @retval minvalues * An array of 6 integers that will be filled with the minimum year, month, * day, hour, minute and seconds. * @retval maxvalues * An array of 6 integers that will be filled with the maximum year, month, * day, hour, minute and seconds. */ void parse_date_extremes(int* minvalues, int* maxvalues) const; /** * Parse the date set in the Record. * * This function will examine the values year, month, day, hour, min and * sec, and will compute the lower bound of the datetime they represent. * * @retval values * An array of 6 integers that will be filled with the minimum year, month, * day, hour, minute and seconds. */ void parse_date(int* values) const; /** * Set a value in the record according to an assignment encoded in a string. * * String can use keywords, aliases and varcodes. Examples: ana_id=3, * name=Bologna, B12012=32.4 * * @param rec * The record where the value is to be set. * @param str * The string containing the assignment. * @return * The error indicator for the function. */ void set_from_string(const char* str); /** * Print the contents of this record to the given file descriptor * * @param out * The output file descriptor */ void print(FILE* out) const; /** * Return the name of a dba_keyword * * @return * The keyword name, or NULL if keyword is not a valid keyword */ static const char* keyword_name(dba_keyword keyword); /** * Return informations about a keyword * * @return * The wreport::Varinfo structure with the informations. */ static wreport::Varinfo keyword_info(dba_keyword keyword); /** * Get the dba_keyword corresponding to the given name * * @returns * The corresponding dba_keyword, or DBA_KEY_ERROR if tag does not match a * valid keyword. */ static dba_keyword keyword_byname(const char* tag); /** * Get the dba_keyword corresponding to the given name * * @param tag * The name to query. * @param len * The length of the name in tag. * @returns * The corresponding dba_keyword, or DBA_KEY_ERROR if tag does not match a * valid keyword. */ static dba_keyword keyword_byname_len(const char* tag, int len); }; #if 0 /** * Print the difference between two records to an output stream. * If there is no difference, it does not print anything. * * @param rec1 * The first record to compare * @param rec2 * The second record to compare * @retval diffs * Incremented by 1 if the variables differ * @param out * The output stream to use for printing */ void dba_record_diff(dba_record rec1, dba_record rec2, int* diffs, FILE* out); #endif struct MatchedRecord : public Matched { const Record& r; MatchedRecord(const Record& r); ~MatchedRecord(); virtual matcher::Result match_var_id(int val) const; virtual matcher::Result match_station_id(int val) const; virtual matcher::Result match_station_wmo(int block, int station=-1) const; virtual matcher::Result match_date(const int* min, const int* max) const; virtual matcher::Result match_coords(int latmin, int latmax, int lonmin, int lonmax) const; virtual matcher::Result match_rep_memo(const char* memo) const; }; } /* vim:set ts=4 sw=4: */ #endif dballe-5.18/dballe/core/mkaliasdoc0000755000175000017500000000322111447100204014012 00000000000000#!/usr/bin/perl -w use strict; use warnings; my $op = $ARGV[0]; # Skip the declaration section while () { last if $_ eq "%%\n"; } # Read the data my @data; my $pos = 0; while () { chop(); last if $_ eq '%%'; my ($name, $val) = split(/,\s*/, $_, 2); $val =~ s/WR_VAR\(0,\s*([0-9]+),\s*([0-9]+)\)/sprintf("B%02d%03d", $1, $2)/e; push @data, [$name, $val]; } @data = sort { $a->[0] cmp $b->[0] } @data; our ($alias, $var); our $DoxIntro = q{/**@defgroup dba_core_aliases Variable aliases @ingroup tables This table lists the aliases that can be used to refer to varcodes. \verbatim }; format DoxTop = Alias Variable . format Dox = @<<<<<<<<<<<< @<<<<< $alias, $var, . our $DoxBottom = q{\endverbatim */ }; if ($op eq 'dox') { print $DoxIntro; $^ = "DoxTop"; $~ = "Dox"; for my $d (@data) { ($alias, $var) = @$d; write STDOUT; } print $DoxBottom; } elsif ($op eq 'tex') { print qq#{\\begin{scriptsize} \\begin{tabular}{|l|l|} \\hline {\\em Alias} & {\\em Variable} \\\\ \\hline #; for my $d (@data) { ($alias, $var) = @$d; $alias =~ s/_/\\_/g; print join(' & ', $alias, $var), "\\\\\n"; } print q#\hline \end{tabular} \end{scriptsize} } #; } elsif ($op eq 'revsolver') { print qq| #include using namespace wreport; namespace dballe { const char* varcode_alias_resolve_reverse(Varcode code) { switch (code) { |; for my $d (@data) { ($alias, $var) = @$d; $var =~ s/B(\d{2})(\d{3})/sprintf("WR_VAR(0, %d, %d)", $1, $2)/e; print "\t\tcase $var: return \"$alias\";\n" } print qq| default: return 0; } } } // namespace dballe |; } else { die "unknown output format ".$ARGV[0]; } dballe-5.18/dballe/core/aliases-reverse.cc0000644000175000017500000000240111636653401015371 00000000000000 #include using namespace wreport; namespace dballe { const char* varcode_alias_resolve_reverse(Varcode code) { switch (code) { case WR_VAR(0, 1, 1): return "block"; case WR_VAR(0, 33, 7): return "conf"; case WR_VAR(0, 33, 195): return "data_id"; case WR_VAR(0, 7, 30): return "height"; case WR_VAR(0, 7, 31): return "heightbaro"; case WR_VAR(0, 10, 51): return "mslp"; case WR_VAR(0, 22, 1): return "mwd"; case WR_VAR(0, 22, 74): return "mwp"; case WR_VAR(0, 1, 19): return "name"; case WR_VAR(0, 15, 192): return "no"; case WR_VAR(0, 15, 193): return "no2"; case WR_VAR(0, 15, 194): return "o3"; case WR_VAR(0, 10, 4): return "p"; case WR_VAR(0, 15, 195): return "pm10"; case WR_VAR(0, 22, 71): return "pp1d"; case WR_VAR(0, 13, 1): return "q"; case WR_VAR(0, 13, 3): return "rh"; case WR_VAR(0, 1, 2): return "station"; case WR_VAR(0, 22, 70): return "swh"; case WR_VAR(0, 12, 101): return "t"; case WR_VAR(0, 12, 103): return "td"; case WR_VAR(0, 12, 11): return "tmax"; case WR_VAR(0, 12, 12): return "tmin"; case WR_VAR(0, 13, 11): return "tp"; case WR_VAR(0, 11, 3): return "u"; case WR_VAR(0, 11, 4): return "v"; case WR_VAR(0, 10, 3): return "z"; default: return 0; } } } // namespace dballe dballe-5.18/dballe/core/match-wreport.h0000644000175000017500000000541111471212245014733 00000000000000/* * dballe/match-wreport - Matched implementation for wreport bulletins * * Copyright (C) 2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #ifndef DBALLE_CORE_MATCH_WREPORT_H #define DBALLE_CORE_MATCH_WREPORT_H /** @file * @ingroup core * Implement a storage object for a group of related observation data */ #include namespace wreport { struct Var; struct Subset; struct Bulletin; } namespace dballe { struct MatchedSubset : public Matched { const wreport::Subset& r; MatchedSubset(const wreport::Subset& r); ~MatchedSubset(); /** * Return YES if the subset contains at least one var with the given B33195 * attribute; else return NA. */ virtual matcher::Result match_var_id(int val) const; virtual matcher::Result match_station_id(int val) const; virtual matcher::Result match_station_wmo(int block, int station=-1) const; virtual matcher::Result match_date(const int* min, const int* max) const; virtual matcher::Result match_coords(int latmin, int latmax, int lonmin, int lonmax) const; virtual matcher::Result match_rep_memo(const char* memo) const; protected: int date[6]; int lat, lon; const wreport::Var* var_ana_id; const wreport::Var* var_block; const wreport::Var* var_station; const wreport::Var* var_rep_memo; }; /** * Match all subsets in turn, returning true if at least one subset matches */ struct MatchedBulletin : public Matched { const wreport::Bulletin& r; MatchedBulletin(const wreport::Bulletin& r); ~MatchedBulletin(); virtual matcher::Result match_var_id(int val) const; virtual matcher::Result match_station_id(int val) const; virtual matcher::Result match_station_wmo(int block, int station=-1) const; virtual matcher::Result match_date(const int* min, const int* max) const; virtual matcher::Result match_coords(int latmin, int latmax, int lonmin, int lonmax) const; virtual matcher::Result match_rep_memo(const char* memo) const; protected: const MatchedSubset** subsets; }; } /* vim:set ts=4 sw=4: */ #endif dballe-5.18/dballe/core/record_keyword.gperf0000644000175000017500000002256711732344323016053 00000000000000/* * dballe/record_keyword - fast resolution of string record keywords * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ %define slot-name tag %define class-name RecordKeywords %define lookup-function-name find %struct-type %language=C++ %global-table %compare-strncmp /* Using %switch may be faster (remember to check when doing optimizations) */ %{ #include #include #include "dballe/core/var.h" #include "dballe/core/record.h" using namespace wreport; namespace dballe { %} struct tagdef { const char* tag; dba_keyword index; }; %% priority, DBA_KEY_PRIORITY priomax, DBA_KEY_PRIOMAX priomin, DBA_KEY_PRIOMIN rep_cod, DBA_KEY_REP_COD rep_memo, DBA_KEY_REP_MEMO ana_id, DBA_KEY_ANA_ID mobile, DBA_KEY_MOBILE ident, DBA_KEY_IDENT lat, DBA_KEY_LAT lon, DBA_KEY_LON latmax, DBA_KEY_LATMAX latmin, DBA_KEY_LATMIN lonmax, DBA_KEY_LONMAX lonmin, DBA_KEY_LONMIN year, DBA_KEY_YEAR month, DBA_KEY_MONTH day, DBA_KEY_DAY hour, DBA_KEY_HOUR min, DBA_KEY_MIN sec, DBA_KEY_SEC yearmax, DBA_KEY_YEARMAX yearmin, DBA_KEY_YEARMIN monthmax, DBA_KEY_MONTHMAX monthmin, DBA_KEY_MONTHMIN daymax, DBA_KEY_DAYMAX daymin, DBA_KEY_DAYMIN hourmax, DBA_KEY_HOURMAX hourmin, DBA_KEY_HOURMIN minumax, DBA_KEY_MINUMAX minumin, DBA_KEY_MINUMIN secmax, DBA_KEY_SECMAX secmin, DBA_KEY_SECMIN leveltype1, DBA_KEY_LEVELTYPE1 l1, DBA_KEY_L1 leveltype2, DBA_KEY_LEVELTYPE2 l2, DBA_KEY_L2 pindicator, DBA_KEY_PINDICATOR p1, DBA_KEY_P1 p2, DBA_KEY_P2 var, DBA_KEY_VAR varlist, DBA_KEY_VARLIST context_id, DBA_KEY_CONTEXT_ID query, DBA_KEY_QUERY ana_filter, DBA_KEY_ANA_FILTER data_filter, DBA_KEY_DATA_FILTER attr_filter, DBA_KEY_ATTR_FILTER limit, DBA_KEY_LIMIT var_related, DBA_KEY_VAR_RELATED %% #define DEF_STRING(len) 0, 0, len, 0, len*8 #define DEF_MAXINT 0, 0, 10, 0, 31 #define DEF_INT(digits) 0, 0, digits, 0, digits*8 namespace { struct keyword_infos { struct _Varinfo infos[DBA_KEY_COUNT]; keyword_infos() { infos[DBA_KEY_PRIORITY ].set(0, "Priority of this type of report", "NUMBER", DEF_MAXINT); infos[DBA_KEY_PRIOMAX ].set(0, "Maximum priority of reports queried", "NUMBER", DEF_MAXINT); infos[DBA_KEY_PRIOMIN ].set(0, "Minimum priority of reports queried", "NUMBER", DEF_MAXINT); infos[DBA_KEY_REP_COD ].set(0, "Type of report", "NUMBER", DEF_MAXINT); infos[DBA_KEY_REP_MEMO ].set(0, "Mnemonic alias for type of report", "CCITTIA5", DEF_STRING(20)); infos[DBA_KEY_ANA_ID ].set(0, "Station database ID", "NUMERIC", DEF_MAXINT); infos[DBA_KEY_MOBILE ].set(0, "Station is mobile", "NUMERIC", DEF_MAXINT); infos[DBA_KEY_IDENT ].set(0, "Identifier of flight or ship", "CCITTIA5", DEF_STRING(64)); infos[DBA_KEY_LAT ].set(0, "Latitude", "DEGREE", 5, 0, 7, -9000000, 25); infos[DBA_KEY_LON ].set(0, "Longitude", "DEGREE", 5, 0, 8, -18000000, 26); infos[DBA_KEY_LATMAX ].set(0, "Maximum latitude queried", "DEGREE", 5, 0, 7, -9000000, 25); infos[DBA_KEY_LATMIN ].set(0, "Minimum latitude queried", "DEGREE", 5, 0, 7, -9000000, 25); infos[DBA_KEY_LONMAX ].set(0, "Maximum longitude queried", "DEGREE", 5, 0, 8, -18000000, 26); infos[DBA_KEY_LONMIN ].set(0, "Minimum longitude queried", "DEGREE", 5, 0, 8, -18000000, 26); infos[DBA_KEY_YEAR ].set(0, "Year", "YEAR", DEF_INT(4)); infos[DBA_KEY_MONTH ].set(0, "Month", "MONTH", DEF_INT(2)); infos[DBA_KEY_DAY ].set(0, "Day", "DAY", DEF_INT(2)); infos[DBA_KEY_HOUR ].set(0, "Hour", "HOUR", DEF_INT(2)); infos[DBA_KEY_MIN ].set(0, "Minutes", "MINUTE", DEF_INT(2)); infos[DBA_KEY_SEC ].set(0, "Seconds", "SECOND", DEF_INT(2)); infos[DBA_KEY_YEARMAX ].set(0, "Maximum year queried", "YEAR", DEF_INT(4)); infos[DBA_KEY_YEARMIN ].set(0, "Year or minimum year queried", "YEAR", DEF_INT(4)); infos[DBA_KEY_MONTHMAX ].set(0, "Maximum month queried", "MONTH", DEF_INT(2)); infos[DBA_KEY_MONTHMIN ].set(0, "Minimum month queried", "MONTH", DEF_INT(2)); infos[DBA_KEY_DAYMAX ].set(0, "Maximum day queried", "DAY", DEF_INT(2)); infos[DBA_KEY_DAYMIN ].set(0, "Minimum day queried", "DAY", DEF_INT(2)); infos[DBA_KEY_HOURMAX ].set(0, "Maximum hour queried", "HOUR", DEF_INT(2)); infos[DBA_KEY_HOURMIN ].set(0, "Minumum hour queried", "HOUR", DEF_INT(2)); infos[DBA_KEY_MINUMAX ].set(0, "Maxminum minutes queried", "MINUTE", DEF_INT(2)); infos[DBA_KEY_MINUMIN ].set(0, "Minimum minutes queried", "MINUTE", DEF_INT(2)); infos[DBA_KEY_SECMAX ].set(0, "Maxminum seconds queried", "SECOND", DEF_INT(2)); infos[DBA_KEY_SECMIN ].set(0, "Minimum seconds queried", "SECOND", DEF_INT(2)); infos[DBA_KEY_LEVELTYPE1 ].set(0, "Type of first level", "NUMBER", DEF_MAXINT); infos[DBA_KEY_L1 ].set(0, "Level layer L1", "NUMBER", DEF_MAXINT); infos[DBA_KEY_LEVELTYPE2 ].set(0, "Type of second level", "NUMBER", DEF_MAXINT); infos[DBA_KEY_L2 ].set(0, "Level layer L2", "NUMBER", DEF_MAXINT); infos[DBA_KEY_PINDICATOR ].set(0, "P indicator for time range", "NUMBER", DEF_MAXINT); infos[DBA_KEY_P1 ].set(0, "Time range P1", "SECOND", DEF_MAXINT); infos[DBA_KEY_P2 ].set(0, "Time range P2", "SECOND", DEF_MAXINT); infos[DBA_KEY_VAR ].set(0, "Variable queried", "CCITTIA5", DEF_STRING(7)); infos[DBA_KEY_VARLIST ].set(0, "List of variables to query", "CCITTIA5", DEF_STRING(255)); infos[DBA_KEY_CONTEXT_ID ].set(0, "Context ID of the variable", "NUMERIC", DEF_MAXINT); infos[DBA_KEY_QUERY ].set(0, "Query behaviour modifier", "CCITTIA5", DEF_STRING(255)); infos[DBA_KEY_ANA_FILTER ].set(0, "Filter on anagraphical data", "CCITTIA5", DEF_STRING(255)); infos[DBA_KEY_DATA_FILTER].set(0, "Filter on data", "CCITTIA5", DEF_STRING(255)); infos[DBA_KEY_ATTR_FILTER].set(0, "Filter on data attributes", "CCITTIA5", DEF_STRING(255)); infos[DBA_KEY_LIMIT ].set(0, "Maximum number of results to return", "NUMBER", DEF_MAXINT); infos[DBA_KEY_VAR_RELATED].set(0, "Variable related to attribute queried", "CCITTIA5", DEF_STRING(6)); // Increment refcounts for (int i = 0; i < DBA_KEY_COUNT; ++i) infos[i].do_ref(); } }; static struct keyword_infos* infos = NULL; } static const char* keyword_names[] = { "priority", "priomax", "priomin", "rep_cod", "rep_memo", "ana_id", "mobile", "ident", "lat", "lon", "latmax", "latmin", "lonmax", "lonmin", "year", "month", "day", "hour", "min", "sec", "yearmax", "yearmin", "monthmax", "monthmin", "daymax", "daymin", "hourmax", "hourmin", "minumax", "minumin", "secmax", "secmin", "leveltype1", "l1", "leveltype2", "l2", "pindicator", "p1", "p2", "var", "varlist", "context_id", "query", "ana_filter", "data_filter", "attr_filter", "limit", "var_related", }; const char* Record::keyword_name(dba_keyword key) { return keyword_names[key]; } Varinfo Record::keyword_info(dba_keyword keyword) { if (infos == NULL) infos = new keyword_infos; return &(infos->infos[keyword]); } dba_keyword Record::keyword_byname(const char* tag) { struct tagdef* res = RecordKeywords::find(tag, strlen(tag)); if (res == NULL) return DBA_KEY_ERROR; else return res->index; } dba_keyword Record::keyword_byname_len(const char* tag, int len) { struct tagdef* res = RecordKeywords::find(tag, len); if (res == NULL) return DBA_KEY_ERROR; else return res->index; } /* dba_err dba_record_keyword_selftest() { dba_keyword i, j; for (i = 0; i < DBA_KEY_COUNT; i++) { if (wordlist[i + 1].index != i) return dba_error_consistency("wordlist entry %d has index %d that does not match the position", i, wordlist[i + 1].index); j = dba_record_keyword_byname(wordlist[i + 1].tag); if (j != i) return dba_error_consistency("hashing of entry '%s' did not give expected index %d", wordlist[i + 1].tag, i); } return dba_error_ok(); } */ } /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/core/match-wreport.cc0000644000175000017500000001577111471212360015101 00000000000000/* * dballe/match-wreport - Matched implementation for wreport bulletins * * Copyright (C) 2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include #include #include #include #include #include using namespace wreport; using namespace std; namespace dballe { MatchedSubset::MatchedSubset(const Subset& r) : r(r), lat(MISSING_INT), lon(MISSING_INT), var_ana_id(0), var_block(0), var_station(0), var_rep_memo(0) { for (int i = 0; i < 6; ++i) date[i] = -1; // Scan message taking note of significant values for (Subset::const_iterator i = r.begin(); i != r.end(); ++i) { switch (i->code()) { case WR_VAR(0, 1, 1): var_block = &*i; break; case WR_VAR(0, 1, 2): var_station = &*i; break; case WR_VAR(0, 1, 192): var_ana_id = &*i; break; case WR_VAR(0, 1, 194): var_rep_memo = &*i; break; case WR_VAR(0, 4, 1): date[0] = i->enq(-1); break; case WR_VAR(0, 4, 2): date[1] = i->enq(-1); break; case WR_VAR(0, 4, 3): date[2] = i->enq(-1); break; case WR_VAR(0, 4, 4): date[3] = i->enq(-1); break; case WR_VAR(0, 4, 5): date[4] = i->enq(-1); break; case WR_VAR(0, 4, 6): date[5] = i->enq(-1); break; case WR_VAR(0, 4, 7): date[5] = (int)rint(i->enq(-1.0)); break; case WR_VAR(0, 5, 1): case WR_VAR(0, 5, 2): if (i->isset()) lat = i->enqd() * 100000; break; case WR_VAR(0, 6, 1): case WR_VAR(0, 6, 2): if (i->isset()) lon = i->enqd() * 100000; break; } } // Fill in missing date bits if (date[0] != -1) { date[1] = date[1] != -1 ? date[1] : 1; date[2] = date[2] != -1 ? date[2] : 1; date[3] = date[3] != -1 ? date[3] : 0; date[4] = date[4] != -1 ? date[4] : 0; date[5] = date[5] != -1 ? date[5] : 0; } } MatchedSubset::~MatchedSubset() { } matcher::Result MatchedSubset::match_var_id(int val) const { for (Subset::const_iterator i = r.begin(); i != r.end(); ++i) { if (const Var* a = i->enqa(WR_VAR(0, 33, 195))) if (a->enqi() == val) return matcher::MATCH_YES; } return matcher::MATCH_NA; } matcher::Result MatchedSubset::match_station_id(int val) const { if (!var_ana_id) return matcher::MATCH_NA; if (!var_ana_id->isset()) return matcher::MATCH_NA; return var_ana_id->enqi() == val ? matcher::MATCH_YES : matcher::MATCH_NO; } matcher::Result MatchedSubset::match_station_wmo(int block, int station) const { if (!var_block) return matcher::MATCH_NA; if (!var_block->isset()) return matcher::MATCH_NA; if (var_block->enqi() != block) return matcher::MATCH_NO; if (station == -1) return matcher::MATCH_YES; if (!var_station) return matcher::MATCH_NA; if (!var_station->isset()) return matcher::MATCH_NA; if (var_station->enqi() != station) return matcher::MATCH_NO; return matcher::MATCH_YES; } matcher::Result MatchedSubset::match_date(const int* min, const int* max) const { if (date[0] == -1) return matcher::MATCH_NA; return Matched::date_in_range(date, min, max); } matcher::Result MatchedSubset::match_coords(int latmin, int latmax, int lonmin, int lonmax) const { matcher::Result r1 = matcher::MATCH_NA; if (lat != MISSING_INT) r1 = Matched::int_in_range(lat, latmin, latmax); else if (latmin == MISSING_INT && latmax == MISSING_INT) r1 = matcher::MATCH_YES; matcher::Result r2 = matcher::MATCH_NA; if (lon != MISSING_INT) r2 = Matched::int_in_range(lon, lonmin, lonmax); else if (lonmin == MISSING_INT && lonmax == MISSING_INT) r2 = matcher::MATCH_YES; if (r1 == matcher::MATCH_YES && r2 == matcher::MATCH_YES) return matcher::MATCH_YES; if (r1 == matcher::MATCH_NO || r2 == matcher::MATCH_NO) return matcher::MATCH_NO; return matcher::MATCH_NA; } matcher::Result MatchedSubset::match_rep_memo(const char* memo) const { if (const char* var = var_rep_memo ? var_rep_memo->value() : 0) { return strcmp(memo, var) == 0 ? matcher::MATCH_YES : matcher::MATCH_NO; } else return matcher::MATCH_NA; } MatchedBulletin::MatchedBulletin(const wreport::Bulletin& r) : r(r) { subsets = new const MatchedSubset*[r.subsets.size()]; for (unsigned i = 0; i < r.subsets.size(); ++i) subsets[i] = new MatchedSubset(r.subsets[i]); } MatchedBulletin::~MatchedBulletin() { for (unsigned i = 0; i < r.subsets.size(); ++i) delete subsets[i]; delete[] subsets; } matcher::Result MatchedBulletin::match_var_id(int val) const { for (unsigned i = 0; i < r.subsets.size(); ++i) if (subsets[i]->match_var_id(val) == matcher::MATCH_YES) return matcher::MATCH_YES; return matcher::MATCH_NA; } matcher::Result MatchedBulletin::match_station_id(int val) const { for (unsigned i = 0; i < r.subsets.size(); ++i) if (subsets[i]->match_station_id(val) == matcher::MATCH_YES) return matcher::MATCH_YES; return matcher::MATCH_NA; } matcher::Result MatchedBulletin::match_station_wmo(int block, int station) const { for (unsigned i = 0; i < r.subsets.size(); ++i) if (subsets[i]->match_station_wmo(block, station) == matcher::MATCH_YES) return matcher::MATCH_YES; return matcher::MATCH_NA; } matcher::Result MatchedBulletin::match_date(const int* min, const int* max) const { for (unsigned i = 0; i < r.subsets.size(); ++i) if (subsets[i]->match_date(min, max) == matcher::MATCH_YES) return matcher::MATCH_YES; return matcher::MATCH_NA; } matcher::Result MatchedBulletin::match_coords(int latmin, int latmax, int lonmin, int lonmax) const { for (unsigned i = 0; i < r.subsets.size(); ++i) if (subsets[i]->match_coords(latmin, latmax, lonmin, lonmax) == matcher::MATCH_YES) return matcher::MATCH_YES; return matcher::MATCH_NA; } matcher::Result MatchedBulletin::match_rep_memo(const char* memo) const { for (unsigned i = 0; i < r.subsets.size(); ++i) if (subsets[i]->match_rep_memo(memo) == matcher::MATCH_YES) return matcher::MATCH_YES; return matcher::MATCH_NA; } } /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/core/matcher.cc0000644000175000017500000002422311471210657013727 00000000000000/* * dballe/matcher - Local query match infrastructure * * Copyright (C) 2009--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * Author: Enrico Zini */ #include #include #include #include using namespace std; using namespace wreport; namespace dballe { matcher::Result Matched::match_var_id(int) const { return matcher::MATCH_NA; } matcher::Result Matched::match_station_id(int) const { return matcher::MATCH_NA; } matcher::Result Matched::match_station_wmo(int, int) const { return matcher::MATCH_NA; } matcher::Result Matched::match_date(const int*, const int*) const { return matcher::MATCH_NA; } matcher::Result Matched::match_coords(int, int, int, int) const { return matcher::MATCH_NA; } matcher::Result Matched::match_rep_memo(const char* memo) const { return matcher::MATCH_NA; } /// Return true if v1 < v2 static bool lt(const int* v1, const int* v2) { for (int i = 0; i < 5; ++i) { if (v1[i] < v2[i]) return true; if (v1[i] > v2[i]) return false; } return v1[5] < v2[5]; } matcher::Result Matched::date_in_range(const int* date, const int* min, const int* max) { if (min[0] != -1 && lt(date, min)) return matcher::MATCH_NO; if (max[1] != -1 && lt(max, date)) return matcher::MATCH_NO; return matcher::MATCH_YES; } matcher::Result Matched::int_in_range(int val, int min, int max) { if (min != MISSING_INT && val < min) return matcher::MATCH_NO; if (max != MISSING_INT && max < val) return matcher::MATCH_NO; return matcher::MATCH_YES; } namespace matcher { struct And : public Matcher { /** * Matchers added to exprs are *owned* and will be deallocated in the * destructor */ std::vector exprs; virtual ~And() { for (std::vector::iterator i = exprs.begin(); i != exprs.end(); ++i) delete *i; } Result match(const Matched& item) const { if (exprs.empty()) return MATCH_YES; Result res = MATCH_NA; for (std::vector::const_iterator i = exprs.begin(); i != exprs.end() && res != MATCH_NO; ++i) { switch ((*i)->match(item)) { case MATCH_YES: res = MATCH_YES; break; case MATCH_NO: res = MATCH_NO; break; case MATCH_NA: break; } } return res; } virtual void to_record(dballe::Record& query) const { for (std::vector::const_iterator i = exprs.begin(); i != exprs.end(); ++i) (*i)->to_record(query); } }; struct VarIDMatcher : public Matcher { // Variable ID to match int var_id; VarIDMatcher(int var_id) : var_id(var_id) {} virtual Result match(const Matched& v) const { return v.match_var_id(var_id) == MATCH_YES ? MATCH_YES : MATCH_NO; } virtual void to_record(Record& query) const { query.set(WR_VAR(0, 33, 195), var_id); } }; struct AnaIDMatcher : public Matcher { // Station ID to match int ana_id; AnaIDMatcher(int ana_id) : ana_id(ana_id) {} virtual Result match(const Matched& v) const { return v.match_station_id(ana_id) == MATCH_YES ? MATCH_YES : MATCH_NO; } virtual void to_record(Record& query) const { query.set(DBA_KEY_ANA_ID, ana_id); } }; struct WMOMatcher : public Matcher { int block; int station; WMOMatcher(int block, int station=-1) : block(block), station(station) {} virtual Result match(const Matched& v) const { return v.match_station_wmo(block, station) == MATCH_YES ? MATCH_YES : MATCH_NO; } virtual void to_record(Record& query) const { query.set(WR_VAR(0, 1, 1), block); if (station != -1) query.set(WR_VAR(0, 1, 2), station); } }; struct DateMatcher : public Matcher { int datemin[6]; int datemax[6]; DateMatcher(const int minvalues[6], const int maxvalues[6]) { for (int i = 0; i < 6; ++i) { datemin[i] = minvalues[i]; datemax[i] = maxvalues[i]; } } /// Return true if v1 == v2 bool eq(const int* v1, const int* v2) const { for (int i = 0; i < 6; ++i) if (v1[i] != v2[i]) return false; return true; } virtual Result match(const Matched& v) const { return v.match_date(datemin, datemax) == MATCH_YES ? MATCH_YES : MATCH_NO; } virtual void to_record(Record& query) const { if (datemin[0] != -1 && datemax[0] != -1 && eq(datemin, datemax)) { query.set(DBA_KEY_YEAR, datemin[0]); query.set(DBA_KEY_MONTH, datemin[1]); query.set(DBA_KEY_DAY, datemin[2]); query.set(DBA_KEY_HOUR, datemin[3]); query.set(DBA_KEY_MIN, datemin[4]); query.set(DBA_KEY_SEC, datemin[5]); } else { if (datemin[0] != -1) { query.set(DBA_KEY_YEARMIN, datemin[0]); query.set(DBA_KEY_MONTHMIN, datemin[1]); query.set(DBA_KEY_DAYMIN, datemin[2]); query.set(DBA_KEY_HOURMIN, datemin[3]); query.set(DBA_KEY_MINUMIN, datemin[4]); query.set(DBA_KEY_SECMIN, datemin[5]); } if (datemax[0] != -1) { query.set(DBA_KEY_YEARMAX, datemax[0]); query.set(DBA_KEY_MONTHMAX, datemax[1]); query.set(DBA_KEY_DAYMAX, datemax[2]); query.set(DBA_KEY_HOURMAX, datemax[3]); query.set(DBA_KEY_MINUMAX, datemax[4]); query.set(DBA_KEY_SECMAX, datemax[5]); } } } }; struct CoordMatcher : public Matcher { int latmin, latmax; int lonmin, lonmax; CoordMatcher(int latmin, int latmax, int lonmin, int lonmax) : latmin(latmin), latmax(latmax), lonmin(lonmin), lonmax(lonmax) {} virtual Result match(const Matched& v) const { return v.match_coords(latmin, latmax, lonmin, lonmax) == MATCH_YES ? MATCH_YES : MATCH_NO; } virtual void to_record(Record& query) const { if (latmin != MISSING_INT) query.set(DBA_KEY_LATMIN, latmin); if (latmax != MISSING_INT) query.set(DBA_KEY_LATMAX, latmax); if (lonmin != MISSING_INT) query.set(DBA_KEY_LONMIN, lonmin); if (lonmax != MISSING_INT) query.set(DBA_KEY_LONMAX, lonmax); } }; static string tolower(const std::string& s) { string res(s); for (string::iterator i = res.begin(); i != res.end(); ++i) *i = ::tolower(*i); return res; } struct ReteMatcher : public Matcher { string rete; ReteMatcher(const std::string& rete) : rete(tolower(rete)) {} virtual Result match(const Matched& v) const { return v.match_rep_memo(rete.c_str()) == MATCH_YES ? MATCH_YES : MATCH_NO; } virtual void to_record(Record& query) const { query.set(DBA_KEY_REP_MEMO, rete.c_str()); } }; } static inline int int_or_missing(const Record& query, dba_keyword key) { if (const Var* var = query.key_peek(key)) return var->enqi(); else return MISSING_INT; } // Returns false if no date filter was found at all // Limits are degrees * 100000 static bool parse_lat_extremes(const Record& query, int* rlatmin, int* rlatmax, int* rlonmin, int* rlonmax) { int lat = int_or_missing(query, DBA_KEY_LAT); if (lat != MISSING_INT) { *rlatmin = lat; *rlatmax = lat; } else { *rlatmin = int_or_missing(query, DBA_KEY_LATMIN); *rlatmax = int_or_missing(query, DBA_KEY_LATMAX); } int lon = int_or_missing(query, DBA_KEY_LON); if (lon != MISSING_INT) { *rlonmin = lon; *rlonmax = lon; } else { *rlonmin = int_or_missing(query, DBA_KEY_LONMIN); *rlonmax = int_or_missing(query, DBA_KEY_LONMAX); } if (*rlatmin == MISSING_INT && *rlatmax == MISSING_INT && *rlonmin == MISSING_INT && *rlonmax == MISSING_INT) return false; return true; } std::auto_ptr Matcher::create(const Record& query) { using namespace matcher; std::auto_ptr res(new And); if (const Var* var = query.var_peek(WR_VAR(0, 33, 195))) res->exprs.push_back(new VarIDMatcher(var->enqi())); if (const Var* var = query.key_peek(DBA_KEY_ANA_ID)) res->exprs.push_back(new AnaIDMatcher(var->enqi())); if (const Var* block = query.var_peek(WR_VAR(0, 1, 1))) { if (const Var* station = query.var_peek(WR_VAR(0, 1, 2))) res->exprs.push_back(new WMOMatcher(block->enqi(), station->enqi())); else res->exprs.push_back(new WMOMatcher(block->enqi())); } int minvalues[6], maxvalues[6]; query.parse_date_extremes(minvalues, maxvalues); if (minvalues[0] != -1 || maxvalues[0] != -1) res->exprs.push_back(new DateMatcher(minvalues, maxvalues)); int latmin = 0, latmax = 0, lonmin = 0, lonmax = 0; if (parse_lat_extremes(query, &latmin, &latmax, &lonmin, &lonmax)) res->exprs.push_back(new CoordMatcher(latmin, latmax, lonmin, lonmax)); if (const char* rete = query.key_peek_value(DBA_KEY_REP_MEMO)) res->exprs.push_back(new ReteMatcher(rete)); return auto_ptr(res.release()); } } /* vim:set syntax=cpp ts=4 sw=4 si: */ dballe-5.18/dballe/core/csv-tut.cc0000644000175000017500000001103611522520107013676 00000000000000/* * Copyright (C) 2011 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * Author: Enrico Zini */ #include "test-utils-core.h" #include "csv.h" #include #include using namespace std; using namespace dballe; namespace tut { struct csv_shar { }; TESTGRP(csv); // Test CSV string escaping template<> template<> void to::test<1>() { stringstream s; csv_output_quoted_string(s, ""); ensure_equals(s.str(), ""); ensure_equals(CSVReader::unescape(s.str()), ""); s.str(std::string()); csv_output_quoted_string(s, "1"); ensure_equals(s.str(), "1"); ensure_equals(CSVReader::unescape(s.str()), "1"); s.str(std::string()); csv_output_quoted_string(s, "12"); ensure_equals(s.str(), "12"); ensure_equals(CSVReader::unescape(s.str()), "12"); s.str(std::string()); csv_output_quoted_string(s, "123"); ensure_equals(s.str(), "123"); ensure_equals(CSVReader::unescape(s.str()), "123"); s.str(std::string()); csv_output_quoted_string(s, ","); ensure_equals(s.str(), "\",\""); ensure_equals(CSVReader::unescape(s.str()), ","); s.str(std::string()); csv_output_quoted_string(s, "antani, blinda"); ensure_equals(s.str(), "\"antani, blinda\""); ensure_equals(CSVReader::unescape(s.str()), "antani, blinda"); s.str(std::string()); csv_output_quoted_string(s, "antani, \"blinda\""); ensure_equals(s.str(), "\"antani, \"\"blinda\"\"\""); ensure_equals(CSVReader::unescape(s.str()), "antani, \"blinda\""); s.str(std::string()); csv_output_quoted_string(s, "\""); ensure_equals(s.str(), "\"\"\"\""); ensure_equals(CSVReader::unescape(s.str()), "\""); s.str(std::string()); csv_output_quoted_string(s, "\",\""); ensure_equals(s.str(), "\"\"\",\"\"\""); ensure_equals(CSVReader::unescape(s.str()), "\",\""); ensure_equals(CSVReader::unescape("\""), "\""); ensure_equals(CSVReader::unescape("\"\""), ""); ensure_equals(CSVReader::unescape("\"\"\""), "\""); ensure_equals(CSVReader::unescape("\"\"\"\""), "\""); ensure_equals(CSVReader::unescape("\"\"\"\"\""), "\"\""); ensure_equals(CSVReader::unescape("a\"b"), "a\"b"); } // Test CSV reader template<> template<> void to::test<2>() { { stringstream in(""); IstreamCSVReader reader(in); ensure(!reader.next()); } { stringstream in("\n"); IstreamCSVReader reader(in); ensure(reader.next()); ensure(reader.cols.empty()); ensure(!reader.next()); } { stringstream in("1,2\n"); IstreamCSVReader reader(in); ensure(reader.next()); ensure_equals(reader.cols.size(), 2u); ensure_equals(reader.cols[0], "1"); ensure_equals(reader.cols[1], "2"); ensure(!reader.next()); } { stringstream in( "1,\",\",2\n" "antani,,blinda\n" ",\n" ); IstreamCSVReader reader(in); ensure(reader.next()); ensure_equals(reader.cols.size(), 3u); ensure_equals(reader.cols[0], "1"); ensure_equals(reader.cols[1], ","); ensure_equals(reader.cols[2], "2"); ensure(reader.next()); ensure_equals(reader.cols.size(), 3u); ensure_equals(reader.cols[0], "antani"); ensure_equals(reader.cols[1], ""); ensure_equals(reader.cols[2], "blinda"); ensure(reader.next()); ensure_equals(reader.cols.size(), 1u); ensure_equals(reader.cols[0], ""); ensure(!reader.next()); } { stringstream in("1,2"); IstreamCSVReader reader(in); ensure(reader.next()); ensure_equals(reader.cols.size(), 2u); ensure_equals(reader.cols[0], "1"); ensure_equals(reader.cols[1], "2"); ensure(!reader.next()); } } } // vim:set ts=4 sw=4: dballe-5.18/dballe/core/vasprintf.h0000644000175000017500000000375311674642017014173 00000000000000#ifndef DBALLE_CORE_VASPRINTF_H #define DBALLE_CORE_VASPRINTF_H #include "config.h" #include #include #include #include #if USE_OWN_VASPRINTF static int vasprintf (char **result, const char *format, va_list args) { const char *p = format; /* Add one to make sure that it is never zero, which might cause malloc to return NULL. */ int total_width = strlen (format) + 1; va_list ap; memcpy ((void *)&ap, (void *)&args, sizeof (va_list)); while (*p != '\0') { if (*p++ == '%') { while (strchr ("-+ #0", *p)) ++p; if (*p == '*') { ++p; total_width += abs (va_arg (ap, int)); } else total_width += strtoul (p, (char **) &p, 10); if (*p == '.') { ++p; if (*p == '*') { ++p; total_width += abs (va_arg (ap, int)); } else total_width += strtoul (p, (char **) &p, 10); } while (strchr ("hlL", *p)) ++p; /* Should be big enough for any format specifier except %s and floats. */ total_width += 30; switch (*p) { case 'd': case 'i': case 'o': case 'u': case 'x': case 'X': case 'c': (void) va_arg (ap, int); break; case 'f': case 'e': case 'E': case 'g': case 'G': (void) va_arg (ap, double); /* Since an ieee double can have an exponent of 307, we'll make the buffer wide enough to cover the gross case. */ total_width += 307; break; case 's': total_width += strlen (va_arg (ap, char *)); break; case 'p': case 'n': (void) va_arg (ap, char *); break; } p++; } } *result = (char*)malloc (total_width); if (*result != NULL) { return vsprintf (*result, format, args);} else { return 0; } } static int asprintf (char **result, const char *format, ...) { va_list ap; va_start(ap, format); int res = vasprintf(result, format, ap); va_end(ap); return res; } #endif #endif dballe-5.18/dballe/core/aoffile.cc0000644000175000017500000002313311674641737013724 00000000000000/* * dballe/aoffile - AOF File I/O * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "aoffile.h" #include "rawmsg.h" #include #include #include #include "dballe/core/byteswap.h" #include using namespace wreport; using namespace std; namespace dballe { AofFile::AofFile(const std::string& name, FILE* fd, bool close_on_exit) : File(name, fd, close_on_exit) {} AofFile::~AofFile() {} bool AofFile::read(Rawmsg& msg) { msg.clear(); msg.file = m_name; msg.encoding = AOF; /* If we are at the beginning of the file, then skip the file header */ if (ftell(fd) == 0) read_header(); msg.offset = ftell(fd); /* Read the Observation Header */ read_record(msg); if (msg.empty()) return false; const uint32_t* rec = (const uint32_t*)msg.data(); if (rec[1] != 4) error_parse::throwf(name().c_str(), ftell(fd), "value '01 length of preliminary record' should be 4, either big or little endian (it is %d (%08x) instead)", rec[1], rec[1]); return true; } void AofFile::write(const Rawmsg& msg) { long pos = ftell(fd); if (pos == -1 && errno != ESPIPE) error_system::throwf("reading current position in output file %s", name().c_str()); /* If it's a non-seekable file, we use idx to see if we're at the beginning */ if (pos == -1 && errno == ESPIPE && idx == 0) pos = 0; /* If we are at the beginning of the file, write a dummy header */ if (pos == 0) write_dummy_header(); write_record(msg); } bool AofFile::read_record(std::string& res) { uint32_t len_word, len_word1; int swapwords = 0; /* Read the first Fortran length of record word */ if (fread(&len_word, 4, 1, fd) == 0) { if (feof(fd)) { return false; } error_system::throwf("reading a record-length first word in %s", name().c_str()); } if ((len_word & 0xFF000000) != 0) { swapwords = 1; len_word = bswap_32(len_word); } if (len_word % 4 != 0) error_parse::throwf(name().c_str(), ftell(fd), "length of record (%d) is not a multiple of 4", len_word); // Allocate space res.resize(len_word); // Read the record uint32_t* buf = (uint32_t*)res.data(); if (fread(buf, len_word, 1, fd) == 0) { error_system::throwf("reading a %d-bytes record from %s", len_word, name().c_str()); } // Read the last Fortran length of record word if (fread(&len_word1, 4, 1, fd) == 0) error_system::throwf("reading a record-length last word in %s", name().c_str()); // Swap words if needed if (swapwords) { for (unsigned i = 0; i < len_word / 4; i++) buf[i] = bswap_32(buf[i]); len_word1 = bswap_32(len_word1); } if (len_word != len_word1) throw error_parse(name().c_str(), ftell(fd), "initial length of record is different than the final length of record"); return true; } static enum { INVALID = 0, END_ARCH = 1, END_LE = 2, END_BE = 3 } writer_endianness = INVALID; static void init_writer_endiannes_if_needed() { if (writer_endianness == INVALID) { char* env_swap = getenv("DBA_AOF_ENDIANNESS"); if (env_swap == NULL) writer_endianness = END_ARCH; else if (strcmp(env_swap, "ARCH") == 0) writer_endianness = END_ARCH; else if (strcmp(env_swap, "LE") == 0) writer_endianness = END_LE; else if (strcmp(env_swap, "BE") == 0) writer_endianness = END_BE; else writer_endianness = END_ARCH; } } void AofFile::write_word(uint32_t word) { uint32_t oword; switch (writer_endianness) { case END_ARCH: oword = word; break; #if __BYTE_ORDER == __BIG_ENDIAN case END_LE: oword = bswap_32(word); break; case END_BE: oword = word; break; #else #if __BYTE_ORDER == __LITTLE_ENDIAN case END_LE: oword = word; break; case END_BE: oword = bswap_32(word); break; #else case END_LE: oword = bswap_32(htonl(word)); break; case END_BE: oword = htonl(word); break; #endif #endif case INVALID: throw error_consistency("trying to write a word without knowing its endianness"); } if (fwrite(&oword, sizeof(uint32_t), 1, fd) != 1) error_system::throwf("writing 4 bytes on %s", name().c_str()); } void AofFile::write_record(const std::string& res) { const uint32_t* rec = (const uint32_t*)res.data(); write_record(rec, res.size() / sizeof(uint32_t)); } void AofFile::write_record(const uint32_t* words, size_t wordcount) { init_writer_endiannes_if_needed(); /* Write the leading length of record word */ write_word(wordcount * sizeof(uint32_t)); for (unsigned i = 0; i < wordcount; ++i) write_word(words[i]); /* Write the trailing length of record word */ write_word(wordcount * sizeof(uint32_t)); } // Read the file header, performing some consistency checks then discarding // the data void AofFile::read_header() { string buf; /* Read the First Data Record */ if (!read_record(buf)) throw error_parse(name().c_str(), ftell(fd), "AOF file is empty or does not contain AOF data"); if (buf.size() / sizeof(uint32_t) != 14) error_parse::throwf(name().c_str(), ftell(fd), "FDR contains %zd octets instead of 14", buf.size()); uint32_t* fdr = (uint32_t*)buf.data(); /* Consistency checks */ if (fdr[0] != 14) error_parse::throwf(name().c_str(), ftell(fd), "first word of FDR is %d instead of 14", fdr[0]); /* Read Data Descriptor Record */ if (!read_record(buf)) error_parse::throwf(name().c_str(), ftell(fd), "AOF file is truncated after First Data Record"); if (buf.size() / sizeof(uint32_t) != 17) error_parse::throwf(name().c_str(), ftell(fd), "DDR contains %zd octets instead of 17", buf.size()); // uint32_t* ddr = (uint32_t*)buf.data(); #if 0 reader->start.tm_hour = ddr[10] % 100; reader->start.tm_mday = ((ddr[10] / 100) % 100); reader->start.tm_mon = ((ddr[10] / 10000) % 100) - 1; reader->start.tm_year = (ddr[10] / 1000000) - 1900; reader->end.tm_hour = ddr[12] % 100; reader->end.tm_mday = ((ddr[12] / 100) % 100); reader->end.tm_mon = ((ddr[12] / 10000) % 100) - 1; reader->end.tm_year = (ddr[12] / 1000000) - 1900; #endif } void AofFile::write_dummy_header() { uint32_t fdr[14]; uint32_t ddr[17]; /* Use 'now' for start and end times */ time_t tnow = time(NULL); struct tm* now = gmtime(&tnow); struct tm* start = now; struct tm* end = now; /* Write FDR */ fdr[ 0] = 14; fdr[ 1] = 13; fdr[ 2] = 0; fdr[ 3] = 2048; fdr[ 4] = 2; fdr[ 5] = (now->tm_year + 1900) * 10000 + (now->tm_mon + 1) * 100 + now->tm_mday; fdr[ 6] = now->tm_hour * 100 + now->tm_min; fdr[ 7] = ((uint32_t)1 << 31) - 1; fdr[ 8] = 1; fdr[ 9] = 60; fdr[10] = ((uint32_t)1 << 31) - 1; fdr[11] = ((uint32_t)1 << 31) - 1; fdr[12] = 1; fdr[13] = ((uint32_t)1 << 31) - 1; write_record(fdr, 14); /* Write DDR */ ddr[ 0] = 17; ddr[ 1] = 16; ddr[ 2] = 0; ddr[ 3] = 820; ddr[ 4] = 2; ddr[ 5] = (now->tm_year + 1900) * 10000 + (now->tm_mon + 1) * 100 + now->tm_mday; ddr[ 6] = now->tm_hour * 100 + now->tm_min; ddr[ 7] = ((uint32_t)1 << 31) - 1; ddr[ 8] = ((uint32_t)1 << 31) - 1; ddr[ 9] = 60; ddr[10] = (start->tm_year + 1900) * 1000000 + (start->tm_mon + 1) * 10000 + (start->tm_mday * 100) + start->tm_hour; ddr[11] = 1; ddr[12] = (end->tm_year + 1900) * 1000000 + (end->tm_mon + 1) * 10000 + (end->tm_mday * 100) + end->tm_hour; ddr[13] = ((uint32_t)1 << 31) - 1; ddr[14] = ((uint32_t)1 << 31) - 1; ddr[15] = 2; ddr[16] = ((uint32_t)1 << 31) - 1; write_record(ddr, 17); } void AofFile::fix_header() { string buf; uint32_t start = 0xffffffff; uint32_t end = 0; size_t pos = 0; /* Read the FDR */ read_record(buf); pos += buf.size(); /* Read the DDR */ read_record(buf); pos += buf.size(); /* Iterate through all the records in the file */ while (read_record(buf)) { if (buf.size() < 11) error_parse::throwf(name().c_str(), pos, "observation record is too short (%zd bytes)", buf.size()); const uint32_t* rec = (const uint32_t*)buf.data(); /* Compute the extremes of start and end */ uint32_t cur = rec[10-1] * 100 + rec[11-1]/100; if (cur < start) start = cur; if (cur > end) end = cur; pos += buf.size(); } /* Update the header with the new extremes */ /* Check if we need to swap bytes to match the header encoding */ if (fseek(fd, 0, SEEK_SET) == -1) error_system::throwf("trying to seek to start of file %s", name().c_str()); uint32_t endianness_test; if (fread(&endianness_test, 4, 1, fd) == 0) error_system::throwf("reading the first word of file %s", name().c_str()); if ((endianness_test & 0xFF000000) != 0) { start = bswap_32(start); end = bswap_32(end); } /* Write start of observation period */ if (fseek(fd, 14 + 10, SEEK_SET) == -1) error_system::throwf("trying to seek in file %s", name().c_str()); if (fwrite(&start, sizeof(uint32_t), 1, fd) != 1) error_system::throwf("rewriting 4 bytes on %s", name().c_str()); /* Write end of observation period */ if (fseek(fd, 14 + 12, SEEK_SET) == -1) error_system::throwf("trying to seek in file %s", name().c_str()); if (fwrite(&end, sizeof(uint32_t), 1, fd) != 1) error_system::throwf("rewriting 4 bytes on %s", name().c_str()); } } // namespace dballe /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/core/match-wreport-tut.cc0000644000175000017500000004467111576401516015725 00000000000000/* * Copyright (C) 2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * Author: Enrico Zini */ #include "test-utils-core.h" #include "match-wreport.h" #include #include #include #include using namespace std; using namespace dballe; using namespace wreport; namespace tut { struct match_wreport_shar { BufrBulletin* bulletin; match_wreport_shar() : bulletin(0) { } ~match_wreport_shar() { if (bulletin) delete bulletin; } BufrBulletin& init() { if (bulletin) delete bulletin; bulletin = BufrBulletin::create().release(); BufrBulletin& b = *bulletin; b.edition = 4; b.centre = 200; b.subcentre = 0; b.master_table = 14; b.local_table = 0; b.load_tables(); return b; } }; TESTGRP(match_wreport); // Test var_id matcher template<> template<> void to::test<1>() { Record matcher; matcher.set("data_id", 1); std::auto_ptr m = Matcher::create(matcher); Subset s(Vartable::get("dballe")); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_NO); s.store_variable_i(WR_VAR(0, 1, 1), 1); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_NO); s.back().seta(newvar(WR_VAR(0, 33, 195), 1)); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_YES); } // Test station_id matcher template<> template<> void to::test<2>() { Record matcher; matcher.set("ana_id", 1); std::auto_ptr m = Matcher::create(matcher); Subset s(Vartable::get("dballe")); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_NO); s.store_variable_i(WR_VAR(0, 1, 1), 1); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_NO); s.store_variable_i(WR_VAR(0, 1, 192), 1); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_YES); } // Test station WMO matcher template<> template<> void to::test<3>() { { Record matcher; matcher.set("block", 11); std::auto_ptr m = Matcher::create(matcher); Subset s(Vartable::get("dballe")); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_NO); s.store_variable_i(WR_VAR(0, 1, 1), 1); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_NO); s.back().seti(11); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_YES); s.store_variable_i(WR_VAR(0, 1, 2), 222); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_YES); } { Record matcher; matcher.set("block", 11); matcher.set("station", 222); std::auto_ptr m = Matcher::create(matcher); Subset s(Vartable::get("dballe")); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_NO); s.store_variable_i(WR_VAR(0, 1, 1), 1); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_NO); s.back().seti(11); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_NO); s.store_variable_i(WR_VAR(0, 1, 2), 22); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_NO); s.back().seti(222); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_YES); s[0].seti(1); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_NO); s[0] = var(WR_VAR(0, 1, 192)); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_NO); } } // Test date matcher template<> template<> void to::test<4>() { { Record matcher; matcher.set("yearmin", 2000); std::auto_ptr m = Matcher::create(matcher); Subset s(Vartable::get("dballe")); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_NO); s.store_variable_i(WR_VAR(0, 4, 1), 1999); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_NO); s[0].seti(2000); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_YES); } { Record matcher; matcher.set("yearmax", 2000); std::auto_ptr m = Matcher::create(matcher); Subset s(Vartable::get("dballe")); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_NO); s.store_variable_i(WR_VAR(0, 4, 1), 2001); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_NO); s[0].seti(2000); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_YES); } { Record matcher; matcher.set("yearmin", 2000); matcher.set("yearmax", 2010); std::auto_ptr m = Matcher::create(matcher); Subset s(Vartable::get("dballe")); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_NO); s.store_variable_i(WR_VAR(0, 4, 1), 1999); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_NO); s[0].seti(2011); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_NO); s[0].seti(2000); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_YES); s[0].seti(2005); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_YES); s[0].seti(2010); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_YES); } } // Test coordinates matcher template<> template<> void to::test<5>() { { Record matcher; matcher.set("latmin", 4500000); std::auto_ptr m = Matcher::create(matcher); Subset s(Vartable::get("dballe")); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_NO); s.store_variable_d(WR_VAR(0, 5, 1), 43.0); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_NO); s[0].setd(45.0); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_YES); s[0].setd(46.0); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_YES); } { Record matcher; matcher.set("latmax", 4500000); std::auto_ptr m = Matcher::create(matcher); Subset s(Vartable::get("dballe")); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_NO); s.store_variable_d(WR_VAR(0, 5, 1), 46.0); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_NO); s[0].setd(45.0); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_YES); s[0].setd(44.0); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_YES); } { Record matcher; matcher.set("lonmin", 1100000); std::auto_ptr m = Matcher::create(matcher); Subset s(Vartable::get("dballe")); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_NO); s.store_variable_d(WR_VAR(0, 6, 1), 10.0); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_NO); s[0].setd(11.0); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_YES); s[0].setd(12.0); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_YES); } { Record matcher; matcher.set("lonmax", 1100000); std::auto_ptr m = Matcher::create(matcher); Subset s(Vartable::get("dballe")); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_NO); s.store_variable_d(WR_VAR(0, 6, 1), 12.0); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_NO); s[0].setd(11.0); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_YES); s[0].setd(10.0); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_YES); } { Record matcher; matcher.set("latmin", 4500000); matcher.set("latmax", 4600000); matcher.set("lonmin", 1000000); matcher.set("lonmax", 1200000); std::auto_ptr m = Matcher::create(matcher); Subset s(Vartable::get("dballe")); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_NO); s.store_variable_d(WR_VAR(0, 5, 1), 45.5); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_NO); s.store_variable_d(WR_VAR(0, 6, 1), 13.0); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_NO); s[1].setd(11.0); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_YES); } } // Test rep_memo matcher template<> template<> void to::test<6>() { Record matcher; matcher.set(DBA_KEY_REP_MEMO, "synop"); std::auto_ptr m = Matcher::create(matcher); Subset s(Vartable::get("dballe")); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_NO); s.store_variable_c(WR_VAR(0, 1, 194), "temp"); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_NO); s[0].setc("synop"); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_YES); } // Test empty matcher template<> template<> void to::test<7>() { Record matcher; std::auto_ptr m = Matcher::create(matcher); Subset s(Vartable::get("dballe")); ensure(m->match(MatchedSubset(s)) == matcher::MATCH_YES); } // Test var_id matcher template<> template<> void to::test<8>() { Record matcher; matcher.set("data_id", 1); std::auto_ptr m = Matcher::create(matcher); BufrBulletin& b = init(); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_NO); b.obtain_subset(1).store_variable_i(WR_VAR(0, 1, 1), 1); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_NO); b.obtain_subset(1).back().seta(newvar(WR_VAR(0, 33, 195), 1)); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_YES); } // Test station_id matcher template<> template<> void to::test<9>() { Record matcher; matcher.set("ana_id", 1); std::auto_ptr m = Matcher::create(matcher); BufrBulletin& b = init(); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_NO); b.obtain_subset(1).store_variable_i(WR_VAR(0, 1, 1), 1); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_NO); b.obtain_subset(0).store_variable_i(WR_VAR(0, 1, 192), 1); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_YES); } // Test station WMO matcher template<> template<> void to::test<10>() { { Record matcher; matcher.set("block", 11); std::auto_ptr m = Matcher::create(matcher); BufrBulletin& b = init(); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_NO); b.obtain_subset(1).store_variable_i(WR_VAR(0, 1, 1), 1); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_NO); b.obtain_subset(1).back().seti(11); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_YES); b.obtain_subset(1).store_variable_i(WR_VAR(0, 1, 2), 222); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_YES); } { Record matcher; matcher.set("block", 11); matcher.set("station", 222); std::auto_ptr m = Matcher::create(matcher); BufrBulletin& b = init(); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_NO); b.obtain_subset(0).store_variable_i(WR_VAR(0, 1, 1), 1); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_NO); b.obtain_subset(0).back().seti(11); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_NO); b.obtain_subset(0).store_variable_i(WR_VAR(0, 1, 2), 22); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_NO); b.obtain_subset(0).back().seti(222); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_YES); b.obtain_subset(0)[0].seti(1); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_NO); b.obtain_subset(0)[0] = var(WR_VAR(0, 1, 192)); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_NO); } // Valid block and station must be in the same subset { Record matcher; matcher.set("block", 11); matcher.set("station", 222); std::auto_ptr m = Matcher::create(matcher); BufrBulletin& b = init(); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_NO); b.obtain_subset(0).store_variable_i(WR_VAR(0, 1, 1), 11); b.obtain_subset(1).store_variable_i(WR_VAR(0, 1, 2), 222); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_NO); b.obtain_subset(0).store_variable_i(WR_VAR(0, 1, 2), 222); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_YES); } } // Test date matcher template<> template<> void to::test<11>() { { Record matcher; matcher.set("yearmin", 2000); std::auto_ptr m = Matcher::create(matcher); BufrBulletin& b = init(); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_NO); b.obtain_subset(0).store_variable_i(WR_VAR(0, 4, 1), 1999); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_NO); b.obtain_subset(0)[0].seti(2000); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_YES); } { Record matcher; matcher.set("yearmax", 2000); std::auto_ptr m = Matcher::create(matcher); BufrBulletin& b = init(); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_NO); b.obtain_subset(0).store_variable_i(WR_VAR(0, 4, 1), 2001); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_NO); b.obtain_subset(0)[0].seti(2000); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_YES); } { Record matcher; matcher.set("yearmin", 2000); matcher.set("yearmax", 2010); std::auto_ptr m = Matcher::create(matcher); BufrBulletin& b = init(); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_NO); b.obtain_subset(0).store_variable_i(WR_VAR(0, 4, 1), 1999); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_NO); b.obtain_subset(0)[0].seti(2011); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_NO); b.obtain_subset(0)[0].seti(2000); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_YES); b.obtain_subset(0)[0].seti(2005); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_YES); b.obtain_subset(0)[0].seti(2010); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_YES); } } // Test coordinates matcher template<> template<> void to::test<12>() { { Record matcher; matcher.set("latmin", 4500000); std::auto_ptr m = Matcher::create(matcher); BufrBulletin& b = init(); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_NO); b.obtain_subset(1).store_variable_d(WR_VAR(0, 5, 1), 43.0); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_NO); b.obtain_subset(1)[0].setd(45.0); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_YES); b.obtain_subset(1)[0].setd(46.0); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_YES); } { Record matcher; matcher.set("latmax", 4500000); std::auto_ptr m = Matcher::create(matcher); BufrBulletin& b = init(); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_NO); b.obtain_subset(1).store_variable_d(WR_VAR(0, 5, 1), 46.0); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_NO); b.obtain_subset(1)[0].setd(45.0); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_YES); b.obtain_subset(1)[0].setd(44.0); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_YES); } { Record matcher; matcher.set("lonmin", 1100000); std::auto_ptr m = Matcher::create(matcher); BufrBulletin& b = init(); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_NO); b.obtain_subset(0).store_variable_d(WR_VAR(0, 6, 1), 10.0); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_NO); b.obtain_subset(0)[0].setd(11.0); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_YES); b.obtain_subset(0)[0].setd(12.0); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_YES); } { Record matcher; matcher.set("lonmax", 1100000); std::auto_ptr m = Matcher::create(matcher); BufrBulletin& b = init(); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_NO); b.obtain_subset(0).store_variable_d(WR_VAR(0, 6, 1), 12.0); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_NO); b.obtain_subset(0)[0].setd(11.0); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_YES); b.obtain_subset(0)[0].setd(10.0); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_YES); } { Record matcher; matcher.set("latmin", 4500000); matcher.set("latmax", 4600000); matcher.set("lonmin", 1000000); matcher.set("lonmax", 1200000); std::auto_ptr m = Matcher::create(matcher); BufrBulletin& b = init(); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_NO); b.obtain_subset(0).store_variable_d(WR_VAR(0, 5, 1), 45.5); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_NO); b.obtain_subset(0).store_variable_d(WR_VAR(0, 6, 1), 13.0); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_NO); b.obtain_subset(0)[1].setd(11.0); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_YES); } } // Test rep_memo matcher template<> template<> void to::test<13>() { Record matcher; matcher.set(DBA_KEY_REP_MEMO, "synop"); std::auto_ptr m = Matcher::create(matcher); BufrBulletin& b = init(); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_NO); b.obtain_subset(0).store_variable_c(WR_VAR(0, 1, 194), "temp"); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_NO); b.obtain_subset(0)[0].setc("synop"); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_YES); } // Test empty matcher template<> template<> void to::test<14>() { Record matcher; std::auto_ptr m = Matcher::create(matcher); BufrBulletin& b = init(); ensure(m->match(MatchedBulletin(b)) == matcher::MATCH_YES); } } // vim:set ts=4 sw=4: dballe-5.18/dballe/core/var.cc0000644000175000017500000000603611636405310013071 00000000000000/* * dballe/var - DB-All.e specialisation of wreport variable * * Copyright (C) 2005,2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "var.h" #include using namespace wreport; using namespace std; namespace dballe { const Vartable* local = NULL; wreport::Varinfo varinfo(wreport::Varcode code) { if (local == NULL) local = Vartable::get("dballe"); return local->query(code); } void format_code(wreport::Varcode code, char* buf) { // Format variable code char type; switch (WR_VAR_F(code)) { case 0: type = 'B'; break; case 1: type = 'R'; break; case 2: type = 'C'; break; case 3: type = 'D'; break; default: type = '?'; break; } snprintf(buf, 7, "%c%02d%03d", type, WR_VAR_X(code), WR_VAR_Y(code)); } std::string format_code(wreport::Varcode code) { char buf[8]; format_code(code, buf); return buf; } wreport::Varcode map_code_to_dballe(wreport::Varcode code) { switch (code) { case WR_VAR(0, 7, 1): return WR_VAR(0, 7, 30); case WR_VAR(0, 10, 3): return WR_VAR(0, 10, 8); case WR_VAR(0, 10, 61): return WR_VAR(0, 10, 60); case WR_VAR(0, 12, 1): return WR_VAR(0, 12, 101); case WR_VAR(0, 12, 3): return WR_VAR(0, 12, 103); default: return code; } } std::auto_ptr var_copy_without_unset_attrs(const wreport::Var& var) { auto_ptr copy(newvar(var.code())); copy->copy_val_only(var); // Copy value performing conversions for (const Var* a = var.next_attr(); a; a = a->next_attr()) { // Skip undefined attributes if (!a->isset()) continue; auto_ptr acopy(newvar(map_code_to_dballe(a->code()))); acopy->copy_val_only(*a); copy->seta(acopy); } return copy; } std::auto_ptr var_copy_without_unset_attrs( const wreport::Var& var, wreport::Varcode code) { auto_ptr copy(newvar(code)); copy->copy_val_only(var); // Copy value performing conversions for (const Var* a = var.next_attr(); a; a = a->next_attr()) { // Skip undefined attributes if (!a->isset()) continue; auto_ptr acopy(newvar(map_code_to_dballe(a->code()))); acopy->copy_val_only(*a); copy->seta(acopy); } return copy; } } /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/core/verbose.h0000644000175000017500000000360211173330007013600 00000000000000/* * DB-ALLe - Archive for punctual meteorological data * * Copyright (C) 2005,2006 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #ifndef VERBOSE_H #define VERBOSE_H #ifdef __cplusplus extern "C" { #endif /** @file * @ingroup core * Debugging aid framework that allows to print, at user request, runtime * verbose messages about internal status and operation. */ /** * The output stream where verbose messages will be sent */ #define DBA_VERBOSE_STREAM stderr /** * The various contexts for verbose messages (they will be OR-ed together) */ enum { DBA_VERB_NONE = 0, DBA_VERB_DB_INPUT = 1, DBA_VERB_DB_SQL = 2, DBA_VERB_BUFREX_MSG = 4, }; /** * Initialize the verbose printing interface, taking the allowed verbose level * from the environment and printing a little informational banner if any * level of verbose messages are enabled. */ void dba_verbose_init(); /** * Return 1 if the given verbose level has been requested in output, else 0 */ int dba_verbose_is_allowed(int lev); /** * Output a message on the verbose stream, if the given level of verbosity has * been requested */ void dba_verbose(int lev, const char* fmt, ...); #ifdef __cplusplus } #endif #endif dballe-5.18/dballe/core/aoffile.h0000644000175000017500000000533611444072427013560 00000000000000/* * dballe/aoffile - AOF File I/O * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #ifndef DBA_CORE_AOFFILE_H #define DBA_CORE_AOFFILE_H /** @file * @ingroup core * AOF File I/O * * This module provides a dballe::File implementation for AOF files. */ #include #include namespace dballe { class AofFile : public dballe::File { protected: /** * Read a Fortran Unformatted Sequential Binary record from a file * * @param res * The data read. The resulting data is an array of 32bit words that will * be byteswapped to native endianness if needed. * @return true if a record was found, false on EOF */ bool read_record(std::string& res); /** * Write a Fortran Unformatted Sequential Binary record to a file * * @param res * The data to be written, considered an array of 32bit words that will be * byteswapped for endianness if needed */ void write_record(const std::string& res); /** * Write a Fortran Unformatted Sequential Binary record to a file * * @param words * The data to be written, as an array of 32bit words that will be * byteswapped for endianness if needed */ void write_record(const uint32_t* words, size_t wordcount); /** * Write a word to the file, byteswapping it for endianness if needed */ void write_word(uint32_t word); public: AofFile(const std::string& name, FILE* fd, bool close_on_exit=true); virtual ~AofFile(); virtual Encoding type() const throw () { return AOF; } bool read(Rawmsg& msg); void write(const Rawmsg& msg); /** * Read the file header, perform some consistency checks then discard the * data */ void read_header(); /// Write a dummy file header void write_dummy_header(); /** * Rewrite the file header, scanning the file to compute a correct one */ void fix_header(); }; } // namespace dballe /* vim:set ts=4 sw=4: */ #endif dballe-5.18/dballe/core/aliases.h0000644000175000017500000000354411447100272013564 00000000000000/* * wreport/aliases - Aliases for commonly used variable codes * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #ifndef WREPORT_CORE_ALIASES_H #define WREPORT_CORE_ALIASES_H /** @file * @ingroup core * Resolve aliases to variable codes */ #include namespace dballe { /** * Resolve a variable alias. * * @param alias * The alias to resolve * @return * The varcode corresponding to the aliase, or 0 if no variable has the given * alias. See @ref vartable.h */ wreport::Varcode varcode_alias_resolve(const char* alias); /** * Resolve a variable alias. * * @param alias * The alias to resolve (does not need to be null-terminated) * @param len * The length of the string * @return * The varcode corresponding to the aliase, or 0 if no variable has the given * alias. See @ref vartable.h */ wreport::Varcode varcode_alias_resolve_substring(const char* alias, int len); /** * Look for the aliase for a Varcode. * * @returns The alias string, or NULL if the varcode has no alias */ const char* varcode_alias_resolve_reverse(wreport::Varcode code); } /* vim:set ts=4 sw=4: */ #endif dballe-5.18/dballe/core/aliases.cc0000644000175000017500000001311211636653401013721 00000000000000/* C++ code produced by gperf version 3.0.3 */ /* Command-line: gperf */ /* Computed positions: -k'$' */ #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) /* The character set is not based on ISO-646. */ #error "gperf generated tables don't work with this execution character set. Please report a bug to ." #endif #include #include using namespace wreport; namespace dballe { struct aliasdef { const char* alias; Varcode var; }; #define TOTAL_KEYWORDS 27 #define MIN_WORD_LENGTH 1 #define MAX_WORD_LENGTH 10 #define MIN_HASH_VALUE 1 #define MAX_HASH_VALUE 34 /* maximum key range = 34, duplicates = 0 */ class VarcodeAliases { private: static inline unsigned int hash (const char *str, unsigned int len); public: static struct aliasdef *find (const char *str, unsigned int len); }; inline unsigned int VarcodeAliases::hash (register const char *str, register unsigned int len) { static unsigned char asso_values[] = { 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 30, 35, 10, 30, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 5, 25, 20, 35, 25, 35, 35, 0, 35, 35, 15, 15, 0, 30, 35, 35, 5, 25, 20, 35, 10, 35, 15, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35 }; return len + asso_values[(unsigned char)str[len - 1]]; } static struct aliasdef wordlist[] = { {""}, {"p", WR_VAR(0, 10, 4)}, {"tp", WR_VAR(0, 13, 11)}, {"mwp", WR_VAR(0, 22, 74)}, {"mslp", WR_VAR(0, 10, 51)}, {"block", WR_VAR(0, 1, 1)}, {"t", WR_VAR(0, 12, 101)}, {"td", WR_VAR(0, 12, 103)}, {"mwd", WR_VAR(0, 22, 1)}, {"pp1d", WR_VAR(0, 22, 71)}, {""}, {"height", WR_VAR(0, 7, 30)}, {"data_id", WR_VAR(0, 33, 195)}, {"no2", WR_VAR(0, 15, 193)}, {"tmax", WR_VAR(0, 12, 11)}, {""}, {"z", WR_VAR(0, 10, 3)}, {"no", WR_VAR(0, 15, 192)}, {""}, {"tmin", WR_VAR(0, 12, 12)}, {""}, {"v", WR_VAR(0, 11, 4)}, {"station", WR_VAR(0, 1, 2)}, {""}, {"conf", WR_VAR(0, 33, 7)}, {"heightbaro", WR_VAR(0, 7, 31)}, {"u", WR_VAR(0, 11, 3)}, {"rh", WR_VAR(0, 13, 3)}, {"swh", WR_VAR(0, 22, 70)}, {"name", WR_VAR(0, 1, 19)}, {""}, {"q", WR_VAR(0, 13, 1)}, {"o3", WR_VAR(0, 15, 194)}, {""}, {"pm10", WR_VAR(0, 15, 195)} }; struct aliasdef * VarcodeAliases::find (register const char *str, register unsigned int len) { if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register int key = hash (str, len); if (key <= MAX_HASH_VALUE && key >= 0) { register const char *s = wordlist[key].alias; if (*str == *s && !strncmp (str + 1, s + 1, len - 1) && s[len] == '\0') return &wordlist[key]; } } return 0; } Varcode varcode_alias_resolve(const char* alias) { struct aliasdef* res = VarcodeAliases::find(alias, strlen(alias)); if (res == NULL) return 0; else return res->var; } Varcode varcode_alias_resolve_substring(const char* alias, int len) { struct aliasdef* res = VarcodeAliases::find(alias, len); if (res == NULL) return 0; else return res->var; } } /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/core/file.cc0000644000175000017500000001115411450573072013222 00000000000000/* * dballe/file - File I/O * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "file.h" #include "aoffile.h" #include "rawmsg.h" #include #include #include #include #include using namespace wreport; using namespace std; namespace dballe { File::File(const std::string& name, FILE* fd, bool close_on_exit) : m_name(name), fd(fd), close_on_exit(close_on_exit), idx(0) { } namespace { struct fd_tracker { FILE* fd; bool close_on_exit; fd_tracker() : fd(NULL), close_on_exit(true) {} ~fd_tracker() { if (fd && close_on_exit) fclose(fd); } void track(FILE* fd, bool close_on_exit=true) { this->fd = fd; this->close_on_exit = close_on_exit; } FILE* release() { FILE* res = fd; fd = NULL; return res; } }; class BufrFile : public dballe::File { public: BufrFile(const std::string& name, FILE* fd, bool close_on_exit=true) : File(name, fd, close_on_exit) {} virtual Encoding type() const throw () { return BUFR; } bool read(Rawmsg& msg) { msg.file = m_name; msg.encoding = BUFR; return BufrBulletin::read(fd, msg, m_name.c_str(), &msg.offset); } void write(const Rawmsg& msg) { BufrBulletin::write(msg, fd, m_name.c_str()); } }; class CrexFile : public dballe::File { public: CrexFile(const std::string& name, FILE* fd, bool close_on_exit=true) : File(name, fd, close_on_exit) {} virtual Encoding type() const throw () { return CREX; } bool read(Rawmsg& msg) { msg.file = m_name; msg.encoding = CREX; return CrexBulletin::read(fd, msg, m_name.c_str(), &msg.offset); } void write(const Rawmsg& msg) { CrexBulletin::write(msg, fd, m_name.c_str()); } }; } // anonymous namespace auto_ptr File::create(Encoding type, const std::string& name, const char* mode) { fd_tracker fdt; /* Open the file */ if (name == "(stdin)") fdt.track(stdin, false); else if (name == "(stdout)") fdt.track(stdout, false); else if (name == "(stderr)") fdt.track(stderr, false); else { fdt.track(fopen(name.c_str(), mode), true); if (fdt.fd == NULL) error_system::throwf("opening %s with mode '%s'", name.c_str(), mode); } /* Attempt auto-detect if needed */ if (type == -1) { int c = getc(fdt.fd); if (c == EOF) { // In case of EOF, pick any type that will handle EOF gracefully. c = 'B'; } else if (ungetc(c, fdt.fd) == EOF) error_system::throwf("putting the first byte of %s back into the input stream", name.c_str()); switch (c) { case 'B': type = BUFR; break; case 'C': type = CREX; break; case 0: type = AOF; break; case 0x38: type = AOF; break; default: throw error_notfound("could not detect the encoding of " + name); } } switch (type) { case BUFR: return auto_ptr(new BufrFile(name, fdt.release(), fdt.close_on_exit)); case CREX: return auto_ptr(new CrexFile(name, fdt.release(), fdt.close_on_exit)); case AOF: return auto_ptr(new AofFile(name, fdt.release(), fdt.close_on_exit)); } error_consistency::throwf("requested unknown %d file type", (int)type); } File::~File() { if (fd && close_on_exit) fclose(fd); } void File::write(const Rawmsg& msg) { if (fwrite(msg.data(), msg.size(), 1, fd) != 1) error_system::throwf("writing message data (%zd bytes) on output", msg.size()); } #if 0 dba_err dba_file_read(dba_file file, dba_rawmsg msg, int* found) { if (file->fun_read == NULL) return dba_error_unimplemented("reading %s files is not implemented", dba_encoding_name(file->type)); else { DBA_RUN_OR_RETURN(file->fun_read(file, msg, found)); ++file->idx; return dba_error_ok(); } } dba_err dba_file_write(dba_file file, dba_rawmsg msg) { if (file->fun_write == NULL) return dba_error_unimplemented("writing %s files is not implemented", dba_encoding_name(file->type)); else { DBA_RUN_OR_RETURN(file->fun_write(file, msg)); ++file->idx; return dba_error_ok(); } } #endif } /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/msg/0000755000175000017500000000000011754670141011712 500000000000000dballe-5.18/dballe/msg/repinfo.cc0000644000175000017500000000215511443506500013576 00000000000000/* * DB-ALLe - Archive for punctual meteorological data * * Copyright (C) 2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "repinfo.h" #include "config.h" #include namespace dballe { const char* repinfo_default_filename() { const char* deffile = getenv("DBA_REPINFO"); if (deffile == 0 || deffile[0] == 0) return TABLE_DIR "/repinfo.csv"; return deffile; } } // namespace dballe dballe-5.18/dballe/msg/msg.h0000644000175000017500000003742411535375703012606 00000000000000/* * dballe/msg - Hold an interpreted weather bulletin * * Copyright (C) 2005--2011 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #ifndef DBA_MSG_H #define DBA_MSG_H /** @file * @ingroup msg * * Abstraction for a weather report message which is independent from the * encoding, used to make sense of decoded information and to carry data between * the various import and export modules of DB-ALLe. * * The internal representation is as connected as possible to physics rather than * to observations. dba_msg is a container for related weather information, * stored in a nonambiguous way. * * To understand what is the difference betwee ::dba_msg and other ways of * representing weather data, it is important to keep in mind how a value is * usually defined in the various encodings: * * \li by previous values and position, as in the AOF encoding * \li by previous values, data descriptor and sometimes position, as in the BUFR * encoding * \li by measure type and physical coordinates, as in ::dba_msg and the DB-ALLe * database * * ::dba_msg contains values as tuples (variable, level layer, time range). * * The variable is represented by a dba_var. The dba_varcode of the dba_var * refers to a local B table which lists physical measurements unambiguously. * * Level layer is a triple (level type, l1, l2) and time range is a triple * (pindicator, p1, p2). The values of these two triples follow what is used in * the GRIB encoding plus some local extensions, and an explanation of their * possible value is found in the document "DB-ALLe Guide of the Fortran API". * * Importers and exporters have to implement a mapping between their * representation and the unambiguous physical representation. Luckily this is * necessarily possible, because the ultimate purpose of the various message * encodings is to correctly transmit those physical data. * * Since to work with the full physical coordinates one needs to specify a lot of * different parameters in order to identify a value (BLocal value, level layer, * time range), there is a var.h module available with shortcut functions to * the values that are used more commonly. */ #include #include #include #include #include #include #include #include struct lua_State; namespace dballe { struct Record; struct CSVReader; namespace msg { struct Context; } /** * Source of the data */ enum MsgType { MSG_GENERIC, /**< Data from unspecified source */ MSG_SYNOP, /**< Synop measured data */ MSG_PILOT, /**< Pilot sounding data */ MSG_TEMP, /**< Temp sounding data */ MSG_TEMP_SHIP, /**< Temp ship sounding data */ MSG_AIREP, /**< Airep airplane data */ MSG_AMDAR, /**< Amdar airplane data */ MSG_ACARS, /**< Acars airplane data */ MSG_SHIP, /**< Ship measured data */ MSG_BUOY, /**< Buoy measured data */ MSG_METAR, /**< Metar data */ MSG_SAT, /**< Satellite data */ MSG_POLLUTION /**< Pollution data */ }; /** * Return a string with the name of a dba_msg_type * * @param type * The dba_msg_type value to name * @return * The name, as a const string. This function is thread safe. */ const char* msg_type_name(MsgType type); /** * Storage for related physical data */ class Msg { protected: /** * Return the index of the given context, or -1 if it was not found */ int find_index(const Level& lev, const Trange& tr) const; public: /** Source of the data */ MsgType type; /** Context in the message */ std::vector data; /** * Create a new dba_msg * * By default, type is MSG_GENERIC */ Msg(); ~Msg(); Msg(const Msg& m); Msg& operator=(const Msg& m); /// Remove all information from Msg void clear(); /** * Add a missing context, taking care of its memory management * * Note: if the context already exists, an exception is thrown */ void add_context(std::auto_ptr ctx); /** * Remove a context from the message * * @return true if the context was removed, false if it did not exist */ bool remove_context(const Level& lev, const Trange& tr); /** * Find a msg::Context given its description * * @param lev * The Level to query * @param tr * The Trange to query * @return * The context found, or NULL if it was not found. */ const msg::Context* find_context(const Level& lev, const Trange& tr) const; /** * Find the station info context * * @return * The context found, or NULL if it was not found. */ const msg::Context* find_station_context() const; /** * Find a msg::Context given its description * * @param lev * The Level to query * @param tr * The Trange to query * @return * The context found, or NULL if it was not found. */ msg::Context* edit_context(const Level& lev, const Trange& tr); /** * Find a msg::Context given its description, creating it if it does not * exist * * @param lev * The Level to query * @param tr * The Trange to query * @return * The context found */ msg::Context& obtain_context(const Level& lev, const Trange& tr); /** * Find a variable given its description * * @param code * The ::dba_varcode of the variable to query. See @ref vartable.h * @param lev * The Level to query * @param tr * The Trange to query * @return * The variable found, or NULL if it was not found. */ const wreport::Var* find(wreport::Varcode code, const Level& lev, const Trange& tr) const; /** * Find a variable given its description * * @param code * The ::dba_varcode of the variable to query. See @ref vartable.h * @param lev * The Level to query * @param tr * The Trange to query * @return * The variable found, or NULL if it was not found. */ wreport::Var* edit(wreport::Varcode code, const Level& lev, const Trange& tr); /** * Find a datum given its shortcut ID * * @param msg * The message to query * @param id * Shortcut ID of the value to set (see @ref vars.h) * @return * The value found, or NULL if it was not found. */ const wreport::Var* find_by_id(int id) const; /** * Find a contexts given level and timerange found in a shortcut ID * * @param msg * The message to query * @param id * Shortcut ID with the level information to use * @return * The context found, or NULL if it was not found. */ const msg::Context* find_context_by_id(int id) const; /** * Find a datum given its shortcut ID * * @param msg * The message to query * @param id * Shortcut ID of the value to set (see @ref vars.h) * @return * The value found, or NULL if it was not found. */ wreport::Var* edit_by_id(int id); /** * Add or replace a value * * @param var * The Var with the value to set * @param code * The dba_varcode of the destination value. If it is different than the * varcode of var, a conversion will be attempted. * @param lev * The Level of the value * @param tr * The Trange of the value */ void set(const wreport::Var& var, wreport::Varcode code, const Level& lev, const Trange& tr); /** * Add or replace a value * * @param var * The Var with the value to set * @param shortcut * Shortcut ID of the value to set */ void set_by_id(const wreport::Var& var, int shortcut); /** * Add or replace a value, taking ownership of the source variable without * copying it. * * @param msg * The Var with the value to set. This Msg will take ownership of memory * management. * @param lev * The Level of the value * @param tr * The Trange of the value */ void set(std::auto_ptr var, const Level& lev, const Trange& tr); /** * Add or replace an integer value in the dba_msg * * @param code * The dba_varcode of the destination value.. See @ref vartable.h * @param val * The integer value of the data * @param conf * The confidence interval of the data, as the value of a B33007 WMO B (per * cent confidence) table entry, that is, a number between 0 and 100 * inclusive. -1 means no confidence interval attribute. * @param lev * The Level of the value * @param tr * The Trange of the value */ void seti(wreport::Varcode code, int val, int conf, const Level& lev, const Trange& tr); /** * Add or replace a double value in the dba_msg * * @param code * The dba_varcode of the destination value. See @ref vartable.h * @param val * The double value of the data * @param conf * The confidence interval of the data, as the value of a B33007 WMO B (per * cent confidence) table entry, that is, a number between 0 and 100 * inclusive. -1 means no confidence interval attribute. * @param lev * The Level of the value * @param tr * The Trange of the value */ void setd(wreport::Varcode code, double val, int conf, const Level& lev, const Trange& tr); /** * Add or replace a string value in the dba_msg * * @param code * The dba_varcode of the destination value. See @ref vartable.h * @param val * The string value of the data * @param conf * The confidence interval of the data, as the value of a B33007 WMO B (per * cent confidence) table entry, that is, a number between 0 and 100 * inclusive. -1 means no confidence interval attribute. * @param lev * The Level of the value * @param tr * The Trange of the value */ void setc(wreport::Varcode code, const char* val, int conf, const Level& lev, const Trange& tr); /// Set the date from a string in the format "YYYY-MM-DD HH:MM:SS" void set_date(const char* date); /** * Copy to dest all the variable in this message that match \a filter * TODO: to be implemented */ //void filter(const Record& filter, Msg& dest) const; /** * Copy a Msg, removing the sounding significance from the level * descriptions and packing together the data at the same pressure level. * * This is used to postprocess data after decoding, where the l2 field of the * level description is temporarily used to store the vertical sounding * significance, to simplify decoding. */ void sounding_pack_levels(Msg& dst) const; #if 0 /** * Copy a Msg, adding the sounding significance from the level descriptions * and moving the data at the same pressure level to the resulting * pseudolevels. * * This is used to preprocess data before encoding, where the l2 field of the * level description is temporarily used to store the vertical sounding * significance, to simplify encoding. */ void sounding_unpack_levels(Msg& dst) const; #endif /** * Parse the date set in the Msg. * * This function will examine the values year, month, day, hour, min and * sec, and will compute the lower bound of the datetime they represent. * * @retval values * An array of 6 integers that will be filled with the minimum year, month, * day, hour, minute and seconds. */ void parse_date(int* values) const; /** * Read data from a CSV input. * * Reading stops when one of Longitude, Latitude, Report or Date changes. * * @return true if some CSV data has been found, false on EOF */ bool from_csv(CSVReader& in); /** * Output in CSV format */ void to_csv(std::ostream& out) const; /// Output the CSV header static void csv_header(std::ostream& out); /** * Dump all the contents of the message to the given stream * * @param out * The stream to dump the contents of the dba_msg to. */ void print(FILE* out) const; /** * Compute the differences between two Msg * * Details of the differences found will be formatted using the notes * system (@see notes.h). * * @param msg * Message to compare this one to * @returns * The number of differences found */ unsigned diff(const Msg& msg) const; /** * Get the message source type corresponding to the given report code */ static MsgType type_from_repmemo(const char* repmemo); /** * Get the report code corresponding to the given message source type */ static const char* repmemo_from_type(MsgType type); #include /** * Push the variable as an object in the lua stack */ void lua_push(struct lua_State* L); /** * Check that the element at \a idx is a dba_msg * * @return the dba_msg element, or NULL if the check failed */ static Msg* lua_check(struct lua_State* L, int idx); }; /** * Consumer interface used to stream messages as they are produced */ struct MsgConsumer { virtual ~MsgConsumer() {} virtual void operator()(std::auto_ptr) = 0; }; /** * Match adapter for Msg */ struct MatchedMsg : public Matched { const Msg& m; MatchedMsg(const Msg& r); ~MatchedMsg(); virtual matcher::Result match_var_id(int val) const; virtual matcher::Result match_station_id(int val) const; virtual matcher::Result match_station_wmo(int block, int station=-1) const; virtual matcher::Result match_date(const int* min, const int* max) const; virtual matcher::Result match_coords(int latmin, int latmax, int lonmin, int lonmax) const; virtual matcher::Result match_rep_memo(const char* memo) const; }; #if 0 /** * Add or replace a value in the dba_msg * * @param msg * The message to operate on * @param var * The dba_var with the value to set, that will be copied into the dba_msg. * @param id * Shortcut ID of the value to set (see @ref vars.h) * @return * The error indicator for the function (See @ref error.h) */ dba_err dba_msg_set_by_id(dba_msg msg, dba_var var, int id); /** * Add or replace a value in the dba_msg, taking ownership of the source * variable witout copying it. * * @param msg * The message to operate on * @param var * The dba_var with the value to set. This dba_msg will take ownership of * memory management. * @param id * Shortcut ID of the value to set (see @ref vars.h) * @return * The error indicator for the function (See @ref error.h) */ dba_err dba_msg_set_nocopy_by_id(dba_msg msg, dba_var var, int id); /** * Get the source of the data * * @param msg * The dba_msg to query * @return * The query source type */ dba_msg_type dba_msg_get_type(dba_msg msg); #endif } // vim:set ts=4 sw=4: #endif dballe-5.18/dballe/msg/filter.cc0000644000175000017500000000452711634672332013437 00000000000000/* * DB-ALLe - Archive for punctual meteorological data * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "msg.h" #include "context.h" /* * 1: the message matches * 0: the message does not match */ static bool match_message(const Msg& m, const Record& filter) { #warning to be implemented return true; }; /* * 1: the context matches * 0: the context does not match */ static int match_context(dba_msg m, dba_msg_context l, dba_record filter) { #warning to be implemented return 1; }; /* * 1: the variable matches * 0: the variable does not match */ static int match_var(dba_msg m, dba_msg_context l, dba_var var, dba_record filter) { #warning to be implemented return 1; } dba_err dba_msg_filter_copy(dba_msg src, dba_msg* dst, dba_record filter) { dba_err err = DBA_OK; dba_msg res = NULL; int li, di; int copied = 0; if (!match_message(src, filter)) { *dst = NULL; return dba_error_ok(); } DBA_RUN_OR_RETURN(dba_msg_create(&res)); for (li = 0; li < src->data_count; ++li) { dba_msg_context l = src->data[li]; if (!match_context(src, l, filter)) continue; for (di = 0; di < l->data_count; ++di) { dba_var var = l->data[di]; if (!match_var(src, l, var, filter)) continue; DBA_RUN_OR_GOTO(cleanup, dba_msg_set(res, var, dba_var_code(var), l->ltype1, l->l1, l->ltype2, l->l2, l->pind, l->p1, l->p2)); ++copied; } } if (!copied) { dba_msg_delete(res); res = NULL; } // Hand over the new message to the caller *dst = res; res = NULL; cleanup: if (res) dba_msg_delete(res); return err == DBA_OK ? dba_error_ok() : err; } /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/msg/msgs.cc0000644000175000017500000001114411535376602013115 00000000000000/* * msg/msgs - Hold a group of similar Msg * * Copyright (C) 2005--2011 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "msgs.h" #include #include #include #include #include using namespace std; using namespace wreport; namespace dballe { Msgs::Msgs() { } Msgs::~Msgs() { for (iterator i = begin(); i != end(); ++i) delete *i; } void Msgs::acquire(const Msg& msg) { push_back(new Msg(msg)); } void Msgs::acquire(auto_ptr msg) { push_back(msg.release()); } bool Msgs::from_csv(CSVReader& in) { string old_rep; bool first = true; while (true) { // Seek to beginning, skipping empty lines if (!in.move_to_data()) return !first; if (in.cols.size() != 13) error_consistency::throwf("cannot parse CSV line has %zd fields instead of 13", in.cols.size()); if (first) { // If we are the first run, initialse old_* markers with the contents of this line old_rep = in.cols[2]; first = false; } else if (old_rep != in.cols[2]) // If Report changes, we are done break; auto_ptr msg(new Msg); bool has_next = msg->from_csv(in); acquire(msg); if (!has_next) break; } return true; } void Msgs::to_csv(std::ostream& out) const { for (const_iterator i = begin(); i != end(); ++i) (*i)->to_csv(out); } void Msgs::print(FILE* out) const { for (unsigned i = 0; i < size(); ++i) { fprintf(out, "Subset %d:\n", i); (*this)[i]->print(out); } } unsigned Msgs::diff(const Msgs& msgs) const { unsigned diffs = 0; if (size() != msgs.size()) { notes::logf("the message groups contain a different number of messages (first is %zd, second is %zd)\n", size(), msgs.size()); ++diffs; } unsigned count = size() < msgs.size() ? size() : msgs.size(); for (unsigned i = 0; i < count; ++i) diffs += (*this)[i]->diff(*msgs[i]); return diffs; } MatchedMsgs::MatchedMsgs(const Msgs& m) : m(m) { } MatchedMsgs::~MatchedMsgs() { } matcher::Result MatchedMsgs::match_var_id(int val) const { for (Msgs::const_iterator i = m.begin(); i != m.end(); ++i) if (MatchedMsg(**i).match_var_id(val) == matcher::MATCH_YES) return matcher::MATCH_YES; return matcher::MATCH_NA; } matcher::Result MatchedMsgs::match_station_id(int val) const { for (Msgs::const_iterator i = m.begin(); i != m.end(); ++i) if (MatchedMsg(**i).match_station_id(val) == matcher::MATCH_YES) return matcher::MATCH_YES; return matcher::MATCH_NA; } matcher::Result MatchedMsgs::match_station_wmo(int block, int station) const { for (Msgs::const_iterator i = m.begin(); i != m.end(); ++i) if (MatchedMsg(**i).match_station_wmo(block, station) == matcher::MATCH_YES) return matcher::MATCH_YES; return matcher::MATCH_NA; } matcher::Result MatchedMsgs::match_date(const int* min, const int* max) const { for (Msgs::const_iterator i = m.begin(); i != m.end(); ++i) if (MatchedMsg(**i).match_date(min, max) == matcher::MATCH_YES) return matcher::MATCH_YES; return matcher::MATCH_NA; } matcher::Result MatchedMsgs::match_coords(int latmin, int latmax, int lonmin, int lonmax) const { for (Msgs::const_iterator i = m.begin(); i != m.end(); ++i) if (MatchedMsg(**i).match_coords(latmin, latmax, lonmin, lonmax) == matcher::MATCH_YES) return matcher::MATCH_YES; return matcher::MATCH_NA; } matcher::Result MatchedMsgs::match_rep_memo(const char* memo) const { for (Msgs::const_iterator i = m.begin(); i != m.end(); ++i) if (MatchedMsg(**i).match_rep_memo(memo) == matcher::MATCH_YES) return matcher::MATCH_YES; return matcher::MATCH_NA; } } // namespace dballe /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/msg/test-utils-msg.h0000644000175000017500000001771611634607643014724 00000000000000/* * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include #include #include #if 0 #include #include #include #include #include #endif #include namespace wreport { struct Vartable; } namespace dballe { namespace tests { typedef wibble::tests::Location Location; std::auto_ptr _read_msgs(const Location& loc, const char* filename, Encoding type, const dballe::msg::Importer::Options& opts=dballe::msg::Importer::Options()); #define read_msgs(filename, type) dballe::tests::_read_msgs(wibble::tests::Location(__FILE__, __LINE__, "load " #filename " " #type), (filename), (type)) #define inner_read_msgs(filename, type) dballe::tests::_read_msgs(wibble::tests::Location(loc, __FILE__, __LINE__, "load " #filename " " #type), (filename), (type)) #define read_msgs_opts(filename, type, opts) dballe::tests::_read_msgs(wibble::tests::Location(__FILE__, __LINE__, "load " #filename " " #type), (filename), (type), (opts)) #define inner_read_msgs_opts(filename, type, opts) dballe::tests::_read_msgs(wibble::tests::Location(loc, __FILE__, __LINE__, "load " #filename " " #type), (filename), (type), (opts)) std::auto_ptr _read_msgs_csv(const Location& loc, const char* filename); #define read_msgs_csv(filename) dballe::tests::_read_msgs_csv(wibble::tests::Location(__FILE__, __LINE__, "load csv " #filename), (filename)) #define inner_read_msgs_csv(filename) dballe::tests::_read_msgs_csv(wibble::tests::Location(loc, __FILE__, __LINE__, "load csv " #filename), (filename)) void track_different_msgs(const Msg& msg1, const Msg& msg2, const std::string& prefix); void track_different_msgs(const Msgs& msgs1, const Msgs& msgs2, const std::string& prefix); extern const char* bufr_files[]; extern const char* crex_files[]; extern const char* aof_files[]; void _ensure_msg_undef(const Location& loc, const Msg& msg, int shortcut); #define ensure_msg_undef(msg, id) dballe::tests::_ensure_msg_undef(wibble::tests::Location(__FILE__, __LINE__, #msg " has undefined " #id), (msg), (id)) #define inner_ensure_msg_undef(msg, id) dballe::tests::_ensure_msg_undef(wibble::tests::Location(loc, __FILE__, __LINE__, #msg " has undefined " #id), (msg), (id)) const wreport::Var& _want_var(const Location& loc, const Msg& msg, int shortcut); const wreport::Var& _want_var(const Location& loc, const Msg& msg, wreport::Varcode code, const dballe::Level& lev, const dballe::Trange& tr); #define want_var(msg, ...) dballe::tests::_want_var(wibble::tests::Location(__FILE__, __LINE__, #msg " needs to have var " #__VA_ARGS__), (msg), __VA_ARGS__) void dump(const std::string& tag, const Msg& msg, const std::string& desc="message"); void dump(const std::string& tag, const Msgs& msgs, const std::string& desc="message"); void dump(const std::string& tag, const wreport::Bulletin& bul, const std::string& desc="message"); void dump(const std::string& tag, const Rawmsg& msg, const std::string& desc="message"); void dump(const std::string& tag, const std::string& str, const std::string& desc="message"); struct MessageTweaker { virtual ~MessageTweaker() {} virtual void tweak(Msgs&) {} virtual std::string desc() const = 0; }; namespace tweaks { // Strip attributes from all variables in a Msgs struct StripAttrs : public MessageTweaker { std::vector codes; void tweak(Msgs& msgs); virtual std::string desc() const { return "StripAttrs"; } }; // Strip attributes from all variables in a Msgs struct StripQCAttrs : public StripAttrs { StripQCAttrs(); virtual std::string desc() const { return "StripQCAttrs"; } }; // Strip attributes with substituted values struct StripSubstituteAttrs : public MessageTweaker { void tweak(Msgs& msgs); virtual std::string desc() const { return "StripSubstituteAttrs"; } }; // Strip context attributes from all variables in a Msgs struct StripContextAttrs : public StripAttrs { StripContextAttrs(); virtual std::string desc() const { return "StripContextAttrs"; } }; // Strip a user-defined list of vars from all levels struct StripVars : public MessageTweaker { std::vector codes; void tweak(Msgs& msgs); virtual std::string desc() const { return "StripVars"; } }; // Round variables to account for a passage through legacy vars struct RoundLegacyVars : public MessageTweaker { const wreport::Vartable* table; RoundLegacyVars(); void tweak(Msgs& msgs); virtual std::string desc() const { return "RoundLegacyVars"; } }; // Remove synop vars present in WMO templates but not in ECMWF templates struct RemoveSynopWMOOnlyVars : public MessageTweaker { void tweak(Msgs& msgs); virtual std::string desc() const { return "RemoveSynopWMOOnlyVars"; } }; // Remove temp vars present in WMO templates but not in ECMWF templates struct RemoveTempWMOOnlyVars : public MessageTweaker { void tweak(Msgs& msgs); virtual std::string desc() const { return "RemoveTempWMOOnlyVars"; } }; // Remove temp vars present only in an odd temp template for which we have // messages in the test suite struct RemoveOddTempTemplateOnlyVars : public StripVars { RemoveOddTempTemplateOnlyVars(); virtual std::string desc() const { return "RemoveOddTempTemplateOnlyVars"; } }; // Remove ground level with missing length of statistical processing, that // cannot be encoded in ECMWF templates struct RemoveSynopWMOOddprec : public MessageTweaker { void tweak(Msgs& msgs); virtual std::string desc() const { return "RemoveSynopWMOOddprec"; } }; // Truncate station name to its canonical length struct TruncStName : public MessageTweaker { void tweak(Msgs& msgs); virtual std::string desc() const { return "TruncStName"; } }; // Round geopotential with a B10003->B10008->B10009->B10008->B10003 round trip struct RoundGeopotential : public MessageTweaker { const wreport::Vartable* table; RoundGeopotential(); void tweak(Msgs& msgs); virtual std::string desc() const { return "RoundGeopotential"; } }; // Round vertical sounding significance with a B08042->B08001->B08042 round trip struct RoundVSS : public MessageTweaker { void tweak(Msgs& msgs); virtual std::string desc() const { return "RoundVSS"; } }; } #if 0 /* Random message generation functions */ class msg_generator : public generator { public: dba_err fill_message(dba_msg msg, bool mobile); }; /* Message reading functions */ class msg_vector : public dba_raw_consumer, public std::vector { public: virtual ~msg_vector() { for (iterator i = begin(); i != end(); i++) dba_msgs_delete(*i); } virtual dba_err consume(dba_rawmsg raw) { dba_msgs msgs; DBA_RUN_OR_RETURN(dba_marshal_decode(raw, &msgs)); push_back(msgs); return dba_error_ok(); } }; template void my_ensure_msg_equals(const char* file, int line, dba_msg msg, int id, const char* idname, const T& value) { dba_var var = my_want_var(file, line, msg, id, idname); inner_ensure_var_equals(var, value); } #define gen_ensure_msg_equals(msg, id, value) my_ensure_msg_equals(__FILE__, __LINE__, (msg), (id), #id, (value)) #define inner_ensure_msg_equals(msg, id, value) my_ensure_msg_equals(file, line, (msg), (id), #id, (value)) #endif } } // vim:set ts=4 sw=4: dballe-5.18/dballe/msg/aof_codec.h0000644000175000017500000001065411534132563013710 00000000000000/* * dballe/aof_codec - AOF import * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #ifndef DBALLE_AOF_CODEC_H #define DBALLE_AOF_CODEC_H /** @file * @ingroup aof * * AOF message codec. * * It provides various AOF encoding and decoding functions, and implements * dba_file reading and writing of AOF files. * * AOF records can be read, written and interpreted into a dba_msg. Encoding * from a dba_msg is not yet implemented. A "makeaof" tool exists, not part of * DB-All.e, that can convert BUFR messages into AOF. * * Endianness of the written records can be controlled by the environment * variable DBA_AOF_ENDIANNESS: * * \li \b ARCH writes using the host endianness * \li \n LE writes using little endian * \li \n BE writes using big endian * * If the environment variable is not set, the default is to write using the * host endianness. */ #include #include namespace dballe { struct Msg; namespace msg { class AOFImporter : public Importer { protected: // Message-specific code static void read_synop(const uint32_t* obs, int obs_len, Msg& msg); static void read_flight(const uint32_t* obs, int obs_len, Msg& msg); static void read_satob(const uint32_t* obs, int obs_len, Msg& msg); static void read_dribu(const uint32_t* obs, int obs_len, Msg& msg); static void read_temp(const uint32_t* obs, int obs_len, Msg& msg); static void read_pilot(const uint32_t* obs, int obs_len, Msg& msg); static void read_satem(const uint32_t* obs, int obs_len, Msg& msg); /// Parse WMO block and station numbers in the Observation Header static void parse_st_block_station(const uint32_t* obs, Msg& msg); /// Parse station altitude the Observation Header static void parse_altitude(const uint32_t* obs, Msg& msg); /// Parse string ident in the Observation Header static void parse_st_ident(const uint32_t* obs, Msg& msg); /** * Parse latitude, longitude, date and time in the Observation Header * * @returns the hour, which can be used to take decisions later */ static int parse_lat_lon_datetime(const uint32_t* obs, Msg& msg); /// Parse 27 Weather group in Synop observations static void parse_weather_group(const uint32_t* obs, Msg& msg, int hour); /// Parse 28 General cloud group in Synop observations static void parse_general_cloud_group(const uint32_t* obs, Msg& msg); /// Parse a bit-packed cloud group in Synop observations static void parse_cloud_group(uint32_t val, int* ns, int* c, int* h); public: AOFImporter(const Options& opts=Options()); virtual ~AOFImporter(); /** * Decode a message from its raw encoded representation * * @param rmsg * Encoded message * @retval msgs * The resulting ::dba_msg * @return * The error indicator for the function. See @ref error.h */ virtual void from_rawmsg(const Rawmsg& msg, Msgs& msgs) const; /** * Import a decoded BUFR/CREX message */ virtual void from_bulletin(const wreport::Bulletin& msg, Msgs& msgs) const; /** * Get category and subcategory of an AOF message * * @param msg * The message to scan * @retval category * The AOF category of the message * @retval subcategory * The AOF subcategory of the message */ static void get_category(const Rawmsg& msg, int* category, int* subcategory); /** * Print the contents of the AOF message * * @param msg * The encoded message to dump * @param out * The stream to use to print the message */ static void dump(const Rawmsg& msg, FILE* out); }; } // namespace msg } // namespace dballe /* vim:set ts=4 sw=4: */ #endif dballe-5.18/dballe/msg/msg-extravars.h0000644000175000017500000017102011636653401014606 00000000000000/** Set the value of "WMO block number" from a variable of type int */ inline void set_block(int val, int conf=-1) { seti(WR_VAR(0, 1, 1), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "WMO block number" from a ::dba_var */ inline void set_block_var(const wreport::Var& val) { set(val, WR_VAR(0, 1, 1), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "WMO block number" physical value stored in the message */ inline const wreport::Var* get_block_var() const { return find_by_id(DBA_MSG_BLOCK); } /** Set the value of "WMO station number" from a variable of type int */ inline void set_station(int val, int conf=-1) { seti(WR_VAR(0, 1, 2), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "WMO station number" from a ::dba_var */ inline void set_station_var(const wreport::Var& val) { set(val, WR_VAR(0, 1, 2), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "WMO station number" physical value stored in the message */ inline const wreport::Var* get_station_var() const { return find_by_id(DBA_MSG_STATION); } /** Set the value of "Aircraft registration number or other identification" from a variable of type const char* */ inline void set_flight_reg_no(const char* val, int conf=-1) { setc(WR_VAR(0, 1, 8), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "Aircraft registration number or other identification" from a ::dba_var */ inline void set_flight_reg_no_var(const wreport::Var& val) { set(val, WR_VAR(0, 1, 8), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "Aircraft registration number or other identification" physical value stored in the message */ inline const wreport::Var* get_flight_reg_no_var() const { return find_by_id(DBA_MSG_FLIGHT_REG_NO); } /** Set the value of "Mobile station identifier" from a variable of type const char* */ inline void set_ident(const char* val, int conf=-1) { setc(WR_VAR(0, 1, 11), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "Mobile station identifier" from a ::dba_var */ inline void set_ident_var(const wreport::Var& val) { set(val, WR_VAR(0, 1, 11), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "Mobile station identifier" physical value stored in the message */ inline const wreport::Var* get_ident_var() const { return find_by_id(DBA_MSG_IDENT); } /** Set the value of "Station or site name" from a variable of type const char* */ inline void set_st_name(const char* val, int conf=-1) { setc(WR_VAR(0, 1, 19), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "Station or site name" from a ::dba_var */ inline void set_st_name_var(const wreport::Var& val) { set(val, WR_VAR(0, 1, 19), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "Station or site name" physical value stored in the message */ inline const wreport::Var* get_st_name_var() const { return find_by_id(DBA_MSG_ST_NAME); } /** Set the value of "ICAO location indicator" from a variable of type const char* */ inline void set_st_name_icao(const char* val, int conf=-1) { setc(WR_VAR(0, 1, 63), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "ICAO location indicator" from a ::dba_var */ inline void set_st_name_icao_var(const wreport::Var& val) { set(val, WR_VAR(0, 1, 63), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "ICAO location indicator" physical value stored in the message */ inline const wreport::Var* get_st_name_icao_var() const { return find_by_id(DBA_MSG_ST_NAME_ICAO); } /** Set the value of "Report mnemonic" from a variable of type const char* */ inline void set_rep_memo(const char* val, int conf=-1) { setc(WR_VAR(0, 1, 194), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "Report mnemonic" from a ::dba_var */ inline void set_rep_memo_var(const wreport::Var& val) { set(val, WR_VAR(0, 1, 194), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "Report mnemonic" physical value stored in the message */ inline const wreport::Var* get_rep_memo_var() const { return find_by_id(DBA_MSG_REP_MEMO); } /** Set the value of "Air quality observing station local code" from a variable of type int */ inline void set_poll_lcode(int val, int conf=-1) { seti(WR_VAR(0, 1, 212), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "Air quality observing station local code" from a ::dba_var */ inline void set_poll_lcode_var(const wreport::Var& val) { set(val, WR_VAR(0, 1, 212), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "Air quality observing station local code" physical value stored in the message */ inline const wreport::Var* get_poll_lcode_var() const { return find_by_id(DBA_MSG_POLL_LCODE); } /** Set the value of "Airbase air quality observing station code" from a variable of type int */ inline void set_poll_scode(int val, int conf=-1) { seti(WR_VAR(0, 1, 213), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "Airbase air quality observing station code" from a ::dba_var */ inline void set_poll_scode_var(const wreport::Var& val) { set(val, WR_VAR(0, 1, 213), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "Airbase air quality observing station code" physical value stored in the message */ inline const wreport::Var* get_poll_scode_var() const { return find_by_id(DBA_MSG_POLL_SCODE); } /** Set the value of "GEMS air quality observing station code" from a variable of type int */ inline void set_poll_gemscode(int val, int conf=-1) { seti(WR_VAR(0, 1, 214), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "GEMS air quality observing station code" from a ::dba_var */ inline void set_poll_gemscode_var(const wreport::Var& val) { set(val, WR_VAR(0, 1, 214), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "GEMS air quality observing station code" physical value stored in the message */ inline const wreport::Var* get_poll_gemscode_var() const { return find_by_id(DBA_MSG_POLL_GEMSCODE); } /** Set the value of "Air quality observing station dominant emission source" from a variable of type int */ inline void set_poll_source(int val, int conf=-1) { seti(WR_VAR(0, 1, 215), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "Air quality observing station dominant emission source" from a ::dba_var */ inline void set_poll_source_var(const wreport::Var& val) { set(val, WR_VAR(0, 1, 215), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "Air quality observing station dominant emission source" physical value stored in the message */ inline const wreport::Var* get_poll_source_var() const { return find_by_id(DBA_MSG_POLL_SOURCE); } /** Set the value of "Air quality observing station area type" from a variable of type int */ inline void set_poll_atype(int val, int conf=-1) { seti(WR_VAR(0, 1, 216), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "Air quality observing station area type" from a ::dba_var */ inline void set_poll_atype_var(const wreport::Var& val) { set(val, WR_VAR(0, 1, 216), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "Air quality observing station area type" physical value stored in the message */ inline const wreport::Var* get_poll_atype_var() const { return find_by_id(DBA_MSG_POLL_ATYPE); } /** Set the value of "Air quality observing station terrain type" from a variable of type int */ inline void set_poll_ttype(int val, int conf=-1) { seti(WR_VAR(0, 1, 217), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "Air quality observing station terrain type" from a ::dba_var */ inline void set_poll_ttype_var(const wreport::Var& val) { set(val, WR_VAR(0, 1, 217), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "Air quality observing station terrain type" physical value stored in the message */ inline const wreport::Var* get_poll_ttype_var() const { return find_by_id(DBA_MSG_POLL_TTYPE); } /** Set the value of "Type of station" from a variable of type int */ inline void set_st_type(int val, int conf=-1) { seti(WR_VAR(0, 2, 1), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "Type of station" from a ::dba_var */ inline void set_st_type_var(const wreport::Var& val) { set(val, WR_VAR(0, 2, 1), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "Type of station" physical value stored in the message */ inline const wreport::Var* get_st_type_var() const { return find_by_id(DBA_MSG_ST_TYPE); } /** Set the value of "Type of instrumentation for wind measurement" from a variable of type int */ inline void set_wind_inst(int val, int conf=-1) { seti(WR_VAR(0, 2, 2), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "Type of instrumentation for wind measurement" from a ::dba_var */ inline void set_wind_inst_var(const wreport::Var& val) { set(val, WR_VAR(0, 2, 2), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "Type of instrumentation for wind measurement" physical value stored in the message */ inline const wreport::Var* get_wind_inst_var() const { return find_by_id(DBA_MSG_WIND_INST); } /** Set the value of "Precision of temperature observation" from a variable of type double */ inline void set_temp_precision(double val, int conf=-1) { setd(WR_VAR(0, 2, 5), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "Precision of temperature observation" from a ::dba_var */ inline void set_temp_precision_var(const wreport::Var& val) { set(val, WR_VAR(0, 2, 5), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "Precision of temperature observation" physical value stored in the message */ inline const wreport::Var* get_temp_precision_var() const { return find_by_id(DBA_MSG_TEMP_PRECISION); } /** Set the value of "Aircraft navigational system" from a variable of type int */ inline void set_navsys(int val, int conf=-1) { seti(WR_VAR(0, 2, 61), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "Aircraft navigational system" from a ::dba_var */ inline void set_navsys_var(const wreport::Var& val) { set(val, WR_VAR(0, 2, 61), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "Aircraft navigational system" physical value stored in the message */ inline const wreport::Var* get_navsys_var() const { return find_by_id(DBA_MSG_NAVSYS); } /** Set the value of "Aircraft data relay system" from a variable of type int */ inline void set_data_relay(int val, int conf=-1) { seti(WR_VAR(0, 2, 62), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "Aircraft data relay system" from a ::dba_var */ inline void set_data_relay_var(const wreport::Var& val) { set(val, WR_VAR(0, 2, 62), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "Aircraft data relay system" physical value stored in the message */ inline const wreport::Var* get_data_relay_var() const { return find_by_id(DBA_MSG_DATA_RELAY); } /** Set the value of "Aircraft roll angle" from a variable of type double */ inline void set_flight_roll(double val, int conf=-1) { setd(WR_VAR(0, 2, 63), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "Aircraft roll angle" from a ::dba_var */ inline void set_flight_roll_var(const wreport::Var& val) { set(val, WR_VAR(0, 2, 63), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "Aircraft roll angle" physical value stored in the message */ inline const wreport::Var* get_flight_roll_var() const { return find_by_id(DBA_MSG_FLIGHT_ROLL); } /** Set the value of "Original specification of latitude/longitude" from a variable of type int */ inline void set_latlon_spec(int val, int conf=-1) { seti(WR_VAR(0, 2, 70), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "Original specification of latitude/longitude" from a ::dba_var */ inline void set_latlon_spec_var(const wreport::Var& val) { set(val, WR_VAR(0, 2, 70), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "Original specification of latitude/longitude" physical value stored in the message */ inline const wreport::Var* get_latlon_spec_var() const { return find_by_id(DBA_MSG_LATLON_SPEC); } /** Set the value of "Year of the observation" from a variable of type int */ inline void set_year(int val, int conf=-1) { seti(WR_VAR(0, 4, 1), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "Year of the observation" from a ::dba_var */ inline void set_year_var(const wreport::Var& val) { set(val, WR_VAR(0, 4, 1), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "Year of the observation" physical value stored in the message */ inline const wreport::Var* get_year_var() const { return find_by_id(DBA_MSG_YEAR); } /** Set the value of "Month of the observation" from a variable of type int */ inline void set_month(int val, int conf=-1) { seti(WR_VAR(0, 4, 2), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "Month of the observation" from a ::dba_var */ inline void set_month_var(const wreport::Var& val) { set(val, WR_VAR(0, 4, 2), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "Month of the observation" physical value stored in the message */ inline const wreport::Var* get_month_var() const { return find_by_id(DBA_MSG_MONTH); } /** Set the value of "Day of the observation" from a variable of type int */ inline void set_day(int val, int conf=-1) { seti(WR_VAR(0, 4, 3), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "Day of the observation" from a ::dba_var */ inline void set_day_var(const wreport::Var& val) { set(val, WR_VAR(0, 4, 3), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "Day of the observation" physical value stored in the message */ inline const wreport::Var* get_day_var() const { return find_by_id(DBA_MSG_DAY); } /** Set the value of "Hour of the observation" from a variable of type int */ inline void set_hour(int val, int conf=-1) { seti(WR_VAR(0, 4, 4), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "Hour of the observation" from a ::dba_var */ inline void set_hour_var(const wreport::Var& val) { set(val, WR_VAR(0, 4, 4), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "Hour of the observation" physical value stored in the message */ inline const wreport::Var* get_hour_var() const { return find_by_id(DBA_MSG_HOUR); } /** Set the value of "Minute of the observation" from a variable of type int */ inline void set_minute(int val, int conf=-1) { seti(WR_VAR(0, 4, 5), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "Minute of the observation" from a ::dba_var */ inline void set_minute_var(const wreport::Var& val) { set(val, WR_VAR(0, 4, 5), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "Minute of the observation" physical value stored in the message */ inline const wreport::Var* get_minute_var() const { return find_by_id(DBA_MSG_MINUTE); } /** Set the value of "Second of the observation" from a variable of type int */ inline void set_second(int val, int conf=-1) { seti(WR_VAR(0, 4, 6), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "Second of the observation" from a ::dba_var */ inline void set_second_var(const wreport::Var& val) { set(val, WR_VAR(0, 4, 6), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "Second of the observation" physical value stored in the message */ inline const wreport::Var* get_second_var() const { return find_by_id(DBA_MSG_SECOND); } /** Set the value of "Latitude of the station" from a variable of type double */ inline void set_latitude(double val, int conf=-1) { setd(WR_VAR(0, 5, 1), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "Latitude of the station" from a ::dba_var */ inline void set_latitude_var(const wreport::Var& val) { set(val, WR_VAR(0, 5, 1), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "Latitude of the station" physical value stored in the message */ inline const wreport::Var* get_latitude_var() const { return find_by_id(DBA_MSG_LATITUDE); } /** Set the value of "Longiture of the station" from a variable of type double */ inline void set_longitude(double val, int conf=-1) { setd(WR_VAR(0, 6, 1), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "Longiture of the station" from a ::dba_var */ inline void set_longitude_var(const wreport::Var& val) { set(val, WR_VAR(0, 6, 1), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "Longiture of the station" physical value stored in the message */ inline const wreport::Var* get_longitude_var() const { return find_by_id(DBA_MSG_LONGITUDE); } /** Set the value of "Isobaric surface" from a variable of type double */ inline void set_isobaric_surface(double val, int conf=-1) { setd(WR_VAR(0, 7, 4), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "Isobaric surface" from a ::dba_var */ inline void set_isobaric_surface_var(const wreport::Var& val) { set(val, WR_VAR(0, 7, 4), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "Isobaric surface" physical value stored in the message */ inline const wreport::Var* get_isobaric_surface_var() const { return find_by_id(DBA_MSG_ISOBARIC_SURFACE); } /** Set the value of "Height of release of sonde above msl" from a variable of type double */ inline void set_height_release(double val, int conf=-1) { setd(WR_VAR(0, 7, 7), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "Height of release of sonde above msl" from a ::dba_var */ inline void set_height_release_var(const wreport::Var& val) { set(val, WR_VAR(0, 7, 7), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "Height of release of sonde above msl" physical value stored in the message */ inline const wreport::Var* get_height_release_var() const { return find_by_id(DBA_MSG_HEIGHT_RELEASE); } /** Set the value of "Height of station" from a variable of type double */ inline void set_height_station(double val, int conf=-1) { setd(WR_VAR(0, 7, 30), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "Height of station" from a ::dba_var */ inline void set_height_station_var(const wreport::Var& val) { set(val, WR_VAR(0, 7, 30), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "Height of station" physical value stored in the message */ inline const wreport::Var* get_height_station_var() const { return find_by_id(DBA_MSG_HEIGHT_STATION); } /** Set the value of "Height of barometer above mean sea level" from a variable of type double */ inline void set_height_baro(double val, int conf=-1) { setd(WR_VAR(0, 7, 31), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "Height of barometer above mean sea level" from a ::dba_var */ inline void set_height_baro_var(const wreport::Var& val) { set(val, WR_VAR(0, 7, 31), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "Height of barometer above mean sea level" physical value stored in the message */ inline const wreport::Var* get_height_baro_var() const { return find_by_id(DBA_MSG_HEIGHT_BARO); } /** Set the value of "Phase of aircraft flight" from a variable of type int */ inline void set_flight_phase(int val, int conf=-1) { seti(WR_VAR(0, 8, 4), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "Phase of aircraft flight" from a ::dba_var */ inline void set_flight_phase_var(const wreport::Var& val) { set(val, WR_VAR(0, 8, 4), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "Phase of aircraft flight" physical value stored in the message */ inline const wreport::Var* get_flight_phase_var() const { return find_by_id(DBA_MSG_FLIGHT_PHASE); } /** Set the value of "Time significance" from a variable of type int */ inline void set_timesig(int val, int conf=-1) { seti(WR_VAR(0, 8, 21), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "Time significance" from a ::dba_var */ inline void set_timesig_var(const wreport::Var& val) { set(val, WR_VAR(0, 8, 21), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "Time significance" physical value stored in the message */ inline const wreport::Var* get_timesig_var() const { return find_by_id(DBA_MSG_TIMESIG); } /** Set the value of "Station elevation quality mark (for mobile stations)" from a variable of type int */ inline void set_station_height_quality(int val, int conf=-1) { seti(WR_VAR(0, 33, 24), val, conf, Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Set the value of "Station elevation quality mark (for mobile stations)" from a ::dba_var */ inline void set_station_height_quality_var(const wreport::Var& val) { set(val, WR_VAR(0, 33, 24), Level(257, MISSING_INT, MISSING_INT, MISSING_INT), Trange(MISSING_INT, MISSING_INT, MISSING_INT)); } /** Get the "Station elevation quality mark (for mobile stations)" physical value stored in the message */ inline const wreport::Var* get_station_height_quality_var() const { return find_by_id(DBA_MSG_STATION_HEIGHT_QUALITY); } /** Set the value of "Total cloud cover (N)" from a variable of type int */ inline void set_cloud_n(int val, int conf=-1) { seti(WR_VAR(0, 20, 10), val, conf, Level(256, MISSING_INT, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Set the value of "Total cloud cover (N)" from a ::dba_var */ inline void set_cloud_n_var(const wreport::Var& val) { set(val, WR_VAR(0, 20, 10), Level(256, MISSING_INT, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Get the "Total cloud cover (N)" physical value stored in the message */ inline const wreport::Var* get_cloud_n_var() const { return find_by_id(DBA_MSG_CLOUD_N); } /** Set the value of "Cloud amount (N4)" from a variable of type int */ inline void set_cloud_n4(int val, int conf=-1) { seti(WR_VAR(0, 20, 11), val, conf, Level(256, MISSING_INT, 259, 4), Trange(254, 0, 0)); } /** Set the value of "Cloud amount (N4)" from a ::dba_var */ inline void set_cloud_n4_var(const wreport::Var& val) { set(val, WR_VAR(0, 20, 11), Level(256, MISSING_INT, 259, 4), Trange(254, 0, 0)); } /** Get the "Cloud amount (N4)" physical value stored in the message */ inline const wreport::Var* get_cloud_n4_var() const { return find_by_id(DBA_MSG_CLOUD_N4); } /** Set the value of "Cloud amount (C4)" from a variable of type int */ inline void set_cloud_c4(int val, int conf=-1) { seti(WR_VAR(0, 20, 12), val, conf, Level(256, MISSING_INT, 259, 4), Trange(254, 0, 0)); } /** Set the value of "Cloud amount (C4)" from a ::dba_var */ inline void set_cloud_c4_var(const wreport::Var& val) { set(val, WR_VAR(0, 20, 12), Level(256, MISSING_INT, 259, 4), Trange(254, 0, 0)); } /** Get the "Cloud amount (C4)" physical value stored in the message */ inline const wreport::Var* get_cloud_c4_var() const { return find_by_id(DBA_MSG_CLOUD_C4); } /** Set the value of "Height of base of cloud (H4)" from a variable of type double */ inline void set_cloud_h4(double val, int conf=-1) { setd(WR_VAR(0, 20, 13), val, conf, Level(256, MISSING_INT, 259, 4), Trange(254, 0, 0)); } /** Set the value of "Height of base of cloud (H4)" from a ::dba_var */ inline void set_cloud_h4_var(const wreport::Var& val) { set(val, WR_VAR(0, 20, 13), Level(256, MISSING_INT, 259, 4), Trange(254, 0, 0)); } /** Get the "Height of base of cloud (H4)" physical value stored in the message */ inline const wreport::Var* get_cloud_h4_var() const { return find_by_id(DBA_MSG_CLOUD_H4); } /** Set the value of "Cloud amount (N3)" from a variable of type int */ inline void set_cloud_n3(int val, int conf=-1) { seti(WR_VAR(0, 20, 11), val, conf, Level(256, MISSING_INT, 259, 3), Trange(254, 0, 0)); } /** Set the value of "Cloud amount (N3)" from a ::dba_var */ inline void set_cloud_n3_var(const wreport::Var& val) { set(val, WR_VAR(0, 20, 11), Level(256, MISSING_INT, 259, 3), Trange(254, 0, 0)); } /** Get the "Cloud amount (N3)" physical value stored in the message */ inline const wreport::Var* get_cloud_n3_var() const { return find_by_id(DBA_MSG_CLOUD_N3); } /** Set the value of "Cloud amount (C3)" from a variable of type int */ inline void set_cloud_c3(int val, int conf=-1) { seti(WR_VAR(0, 20, 12), val, conf, Level(256, MISSING_INT, 259, 3), Trange(254, 0, 0)); } /** Set the value of "Cloud amount (C3)" from a ::dba_var */ inline void set_cloud_c3_var(const wreport::Var& val) { set(val, WR_VAR(0, 20, 12), Level(256, MISSING_INT, 259, 3), Trange(254, 0, 0)); } /** Get the "Cloud amount (C3)" physical value stored in the message */ inline const wreport::Var* get_cloud_c3_var() const { return find_by_id(DBA_MSG_CLOUD_C3); } /** Set the value of "Height of base of cloud (H3)" from a variable of type double */ inline void set_cloud_h3(double val, int conf=-1) { setd(WR_VAR(0, 20, 13), val, conf, Level(256, MISSING_INT, 259, 3), Trange(254, 0, 0)); } /** Set the value of "Height of base of cloud (H3)" from a ::dba_var */ inline void set_cloud_h3_var(const wreport::Var& val) { set(val, WR_VAR(0, 20, 13), Level(256, MISSING_INT, 259, 3), Trange(254, 0, 0)); } /** Get the "Height of base of cloud (H3)" physical value stored in the message */ inline const wreport::Var* get_cloud_h3_var() const { return find_by_id(DBA_MSG_CLOUD_H3); } /** Set the value of "Cloud amount (N2)" from a variable of type int */ inline void set_cloud_n2(int val, int conf=-1) { seti(WR_VAR(0, 20, 11), val, conf, Level(256, MISSING_INT, 259, 2), Trange(254, 0, 0)); } /** Set the value of "Cloud amount (N2)" from a ::dba_var */ inline void set_cloud_n2_var(const wreport::Var& val) { set(val, WR_VAR(0, 20, 11), Level(256, MISSING_INT, 259, 2), Trange(254, 0, 0)); } /** Get the "Cloud amount (N2)" physical value stored in the message */ inline const wreport::Var* get_cloud_n2_var() const { return find_by_id(DBA_MSG_CLOUD_N2); } /** Set the value of "Cloud amount (C2)" from a variable of type int */ inline void set_cloud_c2(int val, int conf=-1) { seti(WR_VAR(0, 20, 12), val, conf, Level(256, MISSING_INT, 259, 2), Trange(254, 0, 0)); } /** Set the value of "Cloud amount (C2)" from a ::dba_var */ inline void set_cloud_c2_var(const wreport::Var& val) { set(val, WR_VAR(0, 20, 12), Level(256, MISSING_INT, 259, 2), Trange(254, 0, 0)); } /** Get the "Cloud amount (C2)" physical value stored in the message */ inline const wreport::Var* get_cloud_c2_var() const { return find_by_id(DBA_MSG_CLOUD_C2); } /** Set the value of "Height of base of cloud (H2)" from a variable of type double */ inline void set_cloud_h2(double val, int conf=-1) { setd(WR_VAR(0, 20, 13), val, conf, Level(256, MISSING_INT, 259, 2), Trange(254, 0, 0)); } /** Set the value of "Height of base of cloud (H2)" from a ::dba_var */ inline void set_cloud_h2_var(const wreport::Var& val) { set(val, WR_VAR(0, 20, 13), Level(256, MISSING_INT, 259, 2), Trange(254, 0, 0)); } /** Get the "Height of base of cloud (H2)" physical value stored in the message */ inline const wreport::Var* get_cloud_h2_var() const { return find_by_id(DBA_MSG_CLOUD_H2); } /** Set the value of "Cloud amount (N1)" from a variable of type int */ inline void set_cloud_n1(int val, int conf=-1) { seti(WR_VAR(0, 20, 11), val, conf, Level(256, MISSING_INT, 259, 1), Trange(254, 0, 0)); } /** Set the value of "Cloud amount (N1)" from a ::dba_var */ inline void set_cloud_n1_var(const wreport::Var& val) { set(val, WR_VAR(0, 20, 11), Level(256, MISSING_INT, 259, 1), Trange(254, 0, 0)); } /** Get the "Cloud amount (N1)" physical value stored in the message */ inline const wreport::Var* get_cloud_n1_var() const { return find_by_id(DBA_MSG_CLOUD_N1); } /** Set the value of "Cloud amount (C1)" from a variable of type int */ inline void set_cloud_c1(int val, int conf=-1) { seti(WR_VAR(0, 20, 12), val, conf, Level(256, MISSING_INT, 259, 1), Trange(254, 0, 0)); } /** Set the value of "Cloud amount (C1)" from a ::dba_var */ inline void set_cloud_c1_var(const wreport::Var& val) { set(val, WR_VAR(0, 20, 12), Level(256, MISSING_INT, 259, 1), Trange(254, 0, 0)); } /** Get the "Cloud amount (C1)" physical value stored in the message */ inline const wreport::Var* get_cloud_c1_var() const { return find_by_id(DBA_MSG_CLOUD_C1); } /** Set the value of "Height of base of cloud (H1)" from a variable of type double */ inline void set_cloud_h1(double val, int conf=-1) { setd(WR_VAR(0, 20, 13), val, conf, Level(256, MISSING_INT, 259, 1), Trange(254, 0, 0)); } /** Set the value of "Height of base of cloud (H1)" from a ::dba_var */ inline void set_cloud_h1_var(const wreport::Var& val) { set(val, WR_VAR(0, 20, 13), Level(256, MISSING_INT, 259, 1), Trange(254, 0, 0)); } /** Get the "Height of base of cloud (H1)" physical value stored in the message */ inline const wreport::Var* get_cloud_h1_var() const { return find_by_id(DBA_MSG_CLOUD_H1); } /** Set the value of "Cloud type (CH)" from a variable of type int */ inline void set_cloud_ch(int val, int conf=-1) { seti(WR_VAR(0, 20, 12), val, conf, Level(256, MISSING_INT, 258, 3), Trange(254, 0, 0)); } /** Set the value of "Cloud type (CH)" from a ::dba_var */ inline void set_cloud_ch_var(const wreport::Var& val) { set(val, WR_VAR(0, 20, 12), Level(256, MISSING_INT, 258, 3), Trange(254, 0, 0)); } /** Get the "Cloud type (CH)" physical value stored in the message */ inline const wreport::Var* get_cloud_ch_var() const { return find_by_id(DBA_MSG_CLOUD_CH); } /** Set the value of "Cloud type (CM)" from a variable of type int */ inline void set_cloud_cm(int val, int conf=-1) { seti(WR_VAR(0, 20, 12), val, conf, Level(256, MISSING_INT, 258, 2), Trange(254, 0, 0)); } /** Set the value of "Cloud type (CM)" from a ::dba_var */ inline void set_cloud_cm_var(const wreport::Var& val) { set(val, WR_VAR(0, 20, 12), Level(256, MISSING_INT, 258, 2), Trange(254, 0, 0)); } /** Get the "Cloud type (CM)" physical value stored in the message */ inline const wreport::Var* get_cloud_cm_var() const { return find_by_id(DBA_MSG_CLOUD_CM); } /** Set the value of "Cloud type (CL)" from a variable of type int */ inline void set_cloud_cl(int val, int conf=-1) { seti(WR_VAR(0, 20, 12), val, conf, Level(256, MISSING_INT, 258, 1), Trange(254, 0, 0)); } /** Set the value of "Cloud type (CL)" from a ::dba_var */ inline void set_cloud_cl_var(const wreport::Var& val) { set(val, WR_VAR(0, 20, 12), Level(256, MISSING_INT, 258, 1), Trange(254, 0, 0)); } /** Get the "Cloud type (CL)" physical value stored in the message */ inline const wreport::Var* get_cloud_cl_var() const { return find_by_id(DBA_MSG_CLOUD_CL); } /** Set the value of "Cloud amount (NH)" from a variable of type int */ inline void set_cloud_nh(int val, int conf=-1) { seti(WR_VAR(0, 20, 11), val, conf, Level(256, MISSING_INT, 258, 0), Trange(254, 0, 0)); } /** Set the value of "Cloud amount (NH)" from a ::dba_var */ inline void set_cloud_nh_var(const wreport::Var& val) { set(val, WR_VAR(0, 20, 11), Level(256, MISSING_INT, 258, 0), Trange(254, 0, 0)); } /** Get the "Cloud amount (NH)" physical value stored in the message */ inline const wreport::Var* get_cloud_nh_var() const { return find_by_id(DBA_MSG_CLOUD_NH); } /** Set the value of "Height of base of cloud (HH)" from a variable of type double */ inline void set_cloud_hh(double val, int conf=-1) { setd(WR_VAR(0, 20, 13), val, conf, Level(256, MISSING_INT, 258, 0), Trange(254, 0, 0)); } /** Set the value of "Height of base of cloud (HH)" from a ::dba_var */ inline void set_cloud_hh_var(const wreport::Var& val) { set(val, WR_VAR(0, 20, 13), Level(256, MISSING_INT, 258, 0), Trange(254, 0, 0)); } /** Get the "Height of base of cloud (HH)" physical value stored in the message */ inline const wreport::Var* get_cloud_hh_var() const { return find_by_id(DBA_MSG_CLOUD_HH); } /** Set the value of "Wind direction at 10 metres above ground" from a variable of type double */ inline void set_wind_dir(double val, int conf=-1) { setd(WR_VAR(0, 11, 1), val, conf, Level(103, 10000, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Set the value of "Wind direction at 10 metres above ground" from a ::dba_var */ inline void set_wind_dir_var(const wreport::Var& val) { set(val, WR_VAR(0, 11, 1), Level(103, 10000, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Get the "Wind direction at 10 metres above ground" physical value stored in the message */ inline const wreport::Var* get_wind_dir_var() const { return find_by_id(DBA_MSG_WIND_DIR); } /** Set the value of "Wind speed at 10 metres above ground" from a variable of type double */ inline void set_wind_speed(double val, int conf=-1) { setd(WR_VAR(0, 11, 2), val, conf, Level(103, 10000, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Set the value of "Wind speed at 10 metres above ground" from a ::dba_var */ inline void set_wind_speed_var(const wreport::Var& val) { set(val, WR_VAR(0, 11, 2), Level(103, 10000, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Get the "Wind speed at 10 metres above ground" physical value stored in the message */ inline const wreport::Var* get_wind_speed_var() const { return find_by_id(DBA_MSG_WIND_SPEED); } /** Set the value of "Extreme counterclockwise wind direction of a variable wind at 10 metres above ground" from a variable of type double */ inline void set_ex_ccw_wind(double val, int conf=-1) { setd(WR_VAR(0, 11, 16), val, conf, Level(103, 10000, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Set the value of "Extreme counterclockwise wind direction of a variable wind at 10 metres above ground" from a ::dba_var */ inline void set_ex_ccw_wind_var(const wreport::Var& val) { set(val, WR_VAR(0, 11, 16), Level(103, 10000, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Get the "Extreme counterclockwise wind direction of a variable wind at 10 metres above ground" physical value stored in the message */ inline const wreport::Var* get_ex_ccw_wind_var() const { return find_by_id(DBA_MSG_EX_CCW_WIND); } /** Set the value of "Extreme clockwise wind direction of a variable wind at 10 metres above ground" from a variable of type double */ inline void set_ex_cw_wind(double val, int conf=-1) { setd(WR_VAR(0, 11, 17), val, conf, Level(103, 10000, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Set the value of "Extreme clockwise wind direction of a variable wind at 10 metres above ground" from a ::dba_var */ inline void set_ex_cw_wind_var(const wreport::Var& val) { set(val, WR_VAR(0, 11, 17), Level(103, 10000, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Get the "Extreme clockwise wind direction of a variable wind at 10 metres above ground" physical value stored in the message */ inline const wreport::Var* get_ex_cw_wind_var() const { return find_by_id(DBA_MSG_EX_CW_WIND); } /** Set the value of "Maximum wind gust speed at 10 metres above ground" from a variable of type double */ inline void set_wind_gust_max_speed(double val, int conf=-1) { setd(WR_VAR(0, 11, 41), val, conf, Level(103, 10000, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Set the value of "Maximum wind gust speed at 10 metres above ground" from a ::dba_var */ inline void set_wind_gust_max_speed_var(const wreport::Var& val) { set(val, WR_VAR(0, 11, 41), Level(103, 10000, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Get the "Maximum wind gust speed at 10 metres above ground" physical value stored in the message */ inline const wreport::Var* get_wind_gust_max_speed_var() const { return find_by_id(DBA_MSG_WIND_GUST_MAX_SPEED); } /** Set the value of "Maximum wind gust direction at 10 metres above ground" from a variable of type double */ inline void set_wind_gust_max_dir(double val, int conf=-1) { setd(WR_VAR(0, 11, 43), val, conf, Level(103, 10000, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Set the value of "Maximum wind gust direction at 10 metres above ground" from a ::dba_var */ inline void set_wind_gust_max_dir_var(const wreport::Var& val) { set(val, WR_VAR(0, 11, 43), Level(103, 10000, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Get the "Maximum wind gust direction at 10 metres above ground" physical value stored in the message */ inline const wreport::Var* get_wind_gust_max_dir_var() const { return find_by_id(DBA_MSG_WIND_GUST_MAX_DIR); } /** Set the value of "Altimeter setting (QNH)" from a variable of type double */ inline void set_qnh(double val, int conf=-1) { setd(WR_VAR(0, 10, 52), val, conf, Level(103, 2000, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Set the value of "Altimeter setting (QNH)" from a ::dba_var */ inline void set_qnh_var(const wreport::Var& val) { set(val, WR_VAR(0, 10, 52), Level(103, 2000, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Get the "Altimeter setting (QNH)" physical value stored in the message */ inline const wreport::Var* get_qnh_var() const { return find_by_id(DBA_MSG_QNH); } /** Set the value of "Wet bulb temperature at 2 metres above ground" from a variable of type double */ inline void set_wet_temp_2m(double val, int conf=-1) { setd(WR_VAR(0, 12, 2), val, conf, Level(103, 2000, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Set the value of "Wet bulb temperature at 2 metres above ground" from a ::dba_var */ inline void set_wet_temp_2m_var(const wreport::Var& val) { set(val, WR_VAR(0, 12, 2), Level(103, 2000, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Get the "Wet bulb temperature at 2 metres above ground" physical value stored in the message */ inline const wreport::Var* get_wet_temp_2m_var() const { return find_by_id(DBA_MSG_WET_TEMP_2M); } /** Set the value of "Temperature at 2 metres above ground" from a variable of type double */ inline void set_temp_2m(double val, int conf=-1) { setd(WR_VAR(0, 12, 101), val, conf, Level(103, 2000, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Set the value of "Temperature at 2 metres above ground" from a ::dba_var */ inline void set_temp_2m_var(const wreport::Var& val) { set(val, WR_VAR(0, 12, 101), Level(103, 2000, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Get the "Temperature at 2 metres above ground" physical value stored in the message */ inline const wreport::Var* get_temp_2m_var() const { return find_by_id(DBA_MSG_TEMP_2M); } /** Set the value of "Dew point at 2 metres above ground" from a variable of type double */ inline void set_dewpoint_2m(double val, int conf=-1) { setd(WR_VAR(0, 12, 103), val, conf, Level(103, 2000, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Set the value of "Dew point at 2 metres above ground" from a ::dba_var */ inline void set_dewpoint_2m_var(const wreport::Var& val) { set(val, WR_VAR(0, 12, 103), Level(103, 2000, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Get the "Dew point at 2 metres above ground" physical value stored in the message */ inline const wreport::Var* get_dewpoint_2m_var() const { return find_by_id(DBA_MSG_DEWPOINT_2M); } /** Set the value of "Humidity at 2 metres above ground" from a variable of type double */ inline void set_humidity(double val, int conf=-1) { setd(WR_VAR(0, 13, 3), val, conf, Level(103, 2000, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Set the value of "Humidity at 2 metres above ground" from a ::dba_var */ inline void set_humidity_var(const wreport::Var& val) { set(val, WR_VAR(0, 13, 3), Level(103, 2000, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Get the "Humidity at 2 metres above ground" physical value stored in the message */ inline const wreport::Var* get_humidity_var() const { return find_by_id(DBA_MSG_HUMIDITY); } /** Set the value of "Pressure reduced to mean sea level" from a variable of type double */ inline void set_press_msl(double val, int conf=-1) { setd(WR_VAR(0, 10, 51), val, conf, Level(101, MISSING_INT, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Set the value of "Pressure reduced to mean sea level" from a ::dba_var */ inline void set_press_msl_var(const wreport::Var& val) { set(val, WR_VAR(0, 10, 51), Level(101, MISSING_INT, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Get the "Pressure reduced to mean sea level" physical value stored in the message */ inline const wreport::Var* get_press_msl_var() const { return find_by_id(DBA_MSG_PRESS_MSL); } /** Set the value of "Direction of motion of moving observing platform" from a variable of type int */ inline void set_st_dir(int val, int conf=-1) { seti(WR_VAR(0, 1, 12), val, conf, Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Set the value of "Direction of motion of moving observing platform" from a ::dba_var */ inline void set_st_dir_var(const wreport::Var& val) { set(val, WR_VAR(0, 1, 12), Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Get the "Direction of motion of moving observing platform" physical value stored in the message */ inline const wreport::Var* get_st_dir_var() const { return find_by_id(DBA_MSG_ST_DIR); } /** Set the value of "Speed of motion of moving observing platform" from a variable of type int */ inline void set_st_speed(int val, int conf=-1) { seti(WR_VAR(0, 1, 13), val, conf, Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Set the value of "Speed of motion of moving observing platform" from a ::dba_var */ inline void set_st_speed_var(const wreport::Var& val) { set(val, WR_VAR(0, 1, 13), Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Get the "Speed of motion of moving observing platform" physical value stored in the message */ inline const wreport::Var* get_st_speed_var() const { return find_by_id(DBA_MSG_ST_SPEED); } /** Set the value of "Type of measuring equipment used" from a variable of type int */ inline void set_meas_equip_type(int val, int conf=-1) { seti(WR_VAR(0, 2, 3), val, conf, Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Set the value of "Type of measuring equipment used" from a ::dba_var */ inline void set_meas_equip_type_var(const wreport::Var& val) { set(val, WR_VAR(0, 2, 3), Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Get the "Type of measuring equipment used" physical value stored in the message */ inline const wreport::Var* get_meas_equip_type_var() const { return find_by_id(DBA_MSG_MEAS_EQUIP_TYPE); } /** Set the value of "Radiosonde type" from a variable of type int */ inline void set_sonde_type(int val, int conf=-1) { seti(WR_VAR(0, 2, 11), val, conf, Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Set the value of "Radiosonde type" from a ::dba_var */ inline void set_sonde_type_var(const wreport::Var& val) { set(val, WR_VAR(0, 2, 11), Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Get the "Radiosonde type" physical value stored in the message */ inline const wreport::Var* get_sonde_type_var() const { return find_by_id(DBA_MSG_SONDE_TYPE); } /** Set the value of "Radiosonde computational method" from a variable of type int */ inline void set_sonde_method(int val, int conf=-1) { seti(WR_VAR(0, 2, 12), val, conf, Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Set the value of "Radiosonde computational method" from a ::dba_var */ inline void set_sonde_method_var(const wreport::Var& val) { set(val, WR_VAR(0, 2, 12), Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Get the "Radiosonde computational method" physical value stored in the message */ inline const wreport::Var* get_sonde_method_var() const { return find_by_id(DBA_MSG_SONDE_METHOD); } /** Set the value of "Solar and infrared radiation correction" from a variable of type int */ inline void set_sonde_correction(int val, int conf=-1) { seti(WR_VAR(0, 2, 13), val, conf, Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Set the value of "Solar and infrared radiation correction" from a ::dba_var */ inline void set_sonde_correction_var(const wreport::Var& val) { set(val, WR_VAR(0, 2, 13), Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Get the "Solar and infrared radiation correction" physical value stored in the message */ inline const wreport::Var* get_sonde_correction_var() const { return find_by_id(DBA_MSG_SONDE_CORRECTION); } /** Set the value of "Tracking technique/status of system used" from a variable of type int */ inline void set_sonde_tracking(int val, int conf=-1) { seti(WR_VAR(0, 2, 14), val, conf, Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Set the value of "Tracking technique/status of system used" from a ::dba_var */ inline void set_sonde_tracking_var(const wreport::Var& val) { set(val, WR_VAR(0, 2, 14), Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Get the "Tracking technique/status of system used" physical value stored in the message */ inline const wreport::Var* get_sonde_tracking_var() const { return find_by_id(DBA_MSG_SONDE_TRACKING); } /** Set the value of "Pressure at ground level" from a variable of type double */ inline void set_press(double val, int conf=-1) { setd(WR_VAR(0, 10, 4), val, conf, Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Set the value of "Pressure at ground level" from a ::dba_var */ inline void set_press_var(const wreport::Var& val) { set(val, WR_VAR(0, 10, 4), Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Get the "Pressure at ground level" physical value stored in the message */ inline const wreport::Var* get_press_var() const { return find_by_id(DBA_MSG_PRESS); } /** Set the value of "Anemometer height" from a variable of type double */ inline void set_height_anem(double val, int conf=-1) { setd(WR_VAR(0, 10, 197), val, conf, Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Set the value of "Anemometer height" from a ::dba_var */ inline void set_height_anem_var(const wreport::Var& val) { set(val, WR_VAR(0, 10, 197), Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Get the "Anemometer height" physical value stored in the message */ inline const wreport::Var* get_height_anem_var() const { return find_by_id(DBA_MSG_HEIGHT_ANEM); } /** Set the value of "Total show depth" from a variable of type double */ inline void set_tot_snow(double val, int conf=-1) { setd(WR_VAR(0, 13, 13), val, conf, Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Set the value of "Total show depth" from a ::dba_var */ inline void set_tot_snow_var(const wreport::Var& val) { set(val, WR_VAR(0, 13, 13), Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Get the "Total show depth" physical value stored in the message */ inline const wreport::Var* get_tot_snow_var() const { return find_by_id(DBA_MSG_TOT_SNOW); } /** Set the value of "Visibility" from a variable of type double */ inline void set_visibility(double val, int conf=-1) { setd(WR_VAR(0, 20, 1), val, conf, Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Set the value of "Visibility" from a ::dba_var */ inline void set_visibility_var(const wreport::Var& val) { set(val, WR_VAR(0, 20, 1), Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Get the "Visibility" physical value stored in the message */ inline const wreport::Var* get_visibility_var() const { return find_by_id(DBA_MSG_VISIBILITY); } /** Set the value of "Present weather" from a variable of type int */ inline void set_pres_wtr(int val, int conf=-1) { seti(WR_VAR(0, 20, 3), val, conf, Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Set the value of "Present weather" from a ::dba_var */ inline void set_pres_wtr_var(const wreport::Var& val) { set(val, WR_VAR(0, 20, 3), Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Get the "Present weather" physical value stored in the message */ inline const wreport::Var* get_pres_wtr_var() const { return find_by_id(DBA_MSG_PRES_WTR); } /** Set the value of "General weather indicator (TAF/METAR)" from a variable of type int */ inline void set_metar_wtr(int val, int conf=-1) { seti(WR_VAR(0, 20, 9), val, conf, Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Set the value of "General weather indicator (TAF/METAR)" from a ::dba_var */ inline void set_metar_wtr_var(const wreport::Var& val) { set(val, WR_VAR(0, 20, 9), Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Get the "General weather indicator (TAF/METAR)" physical value stored in the message */ inline const wreport::Var* get_metar_wtr_var() const { return find_by_id(DBA_MSG_METAR_WTR); } /** Set the value of "State of ground (with or without snow)" from a variable of type double */ inline void set_state_ground(double val, int conf=-1) { setd(WR_VAR(0, 20, 62), val, conf, Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Set the value of "State of ground (with or without snow)" from a ::dba_var */ inline void set_state_ground_var(const wreport::Var& val) { set(val, WR_VAR(0, 20, 62), Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Get the "State of ground (with or without snow)" physical value stored in the message */ inline const wreport::Var* get_state_ground_var() const { return find_by_id(DBA_MSG_STATE_GROUND); } /** Set the value of "Sea/water surface temperature" from a variable of type double */ inline void set_water_temp(double val, int conf=-1) { setd(WR_VAR(0, 22, 43), val, conf, Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Set the value of "Sea/water surface temperature" from a ::dba_var */ inline void set_water_temp_var(const wreport::Var& val) { set(val, WR_VAR(0, 22, 43), Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(254, 0, 0)); } /** Get the "Sea/water surface temperature" physical value stored in the message */ inline const wreport::Var* get_water_temp_var() const { return find_by_id(DBA_MSG_WATER_TEMP); } /** Set the value of "Past weather (1 - 6h)" from a variable of type int */ inline void set_past_wtr1_6h(int val, int conf=-1) { seti(WR_VAR(0, 20, 4), val, conf, Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(205, 0, 21600)); } /** Set the value of "Past weather (1 - 6h)" from a ::dba_var */ inline void set_past_wtr1_6h_var(const wreport::Var& val) { set(val, WR_VAR(0, 20, 4), Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(205, 0, 21600)); } /** Get the "Past weather (1 - 6h)" physical value stored in the message */ inline const wreport::Var* get_past_wtr1_6h_var() const { return find_by_id(DBA_MSG_PAST_WTR1_6H); } /** Set the value of "Past weather (2 - 6h)" from a variable of type int */ inline void set_past_wtr2_6h(int val, int conf=-1) { seti(WR_VAR(0, 20, 5), val, conf, Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(205, 0, 21600)); } /** Set the value of "Past weather (2 - 6h)" from a ::dba_var */ inline void set_past_wtr2_6h_var(const wreport::Var& val) { set(val, WR_VAR(0, 20, 5), Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(205, 0, 21600)); } /** Get the "Past weather (2 - 6h)" physical value stored in the message */ inline const wreport::Var* get_past_wtr2_6h_var() const { return find_by_id(DBA_MSG_PAST_WTR2_6H); } /** Set the value of "Characteristic of pressure tendency" from a variable of type double */ inline void set_press_tend(double val, int conf=-1) { setd(WR_VAR(0, 10, 63), val, conf, Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(205, 0, 10800)); } /** Set the value of "Characteristic of pressure tendency" from a ::dba_var */ inline void set_press_tend_var(const wreport::Var& val) { set(val, WR_VAR(0, 10, 63), Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(205, 0, 10800)); } /** Get the "Characteristic of pressure tendency" physical value stored in the message */ inline const wreport::Var* get_press_tend_var() const { return find_by_id(DBA_MSG_PRESS_TEND); } /** Set the value of "Past weather (1 - 3h)" from a variable of type int */ inline void set_past_wtr1_3h(int val, int conf=-1) { seti(WR_VAR(0, 20, 4), val, conf, Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(205, 0, 10800)); } /** Set the value of "Past weather (1 - 3h)" from a ::dba_var */ inline void set_past_wtr1_3h_var(const wreport::Var& val) { set(val, WR_VAR(0, 20, 4), Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(205, 0, 10800)); } /** Get the "Past weather (1 - 3h)" physical value stored in the message */ inline const wreport::Var* get_past_wtr1_3h_var() const { return find_by_id(DBA_MSG_PAST_WTR1_3H); } /** Set the value of "Past weather (2 - 3h)" from a variable of type int */ inline void set_past_wtr2_3h(int val, int conf=-1) { seti(WR_VAR(0, 20, 5), val, conf, Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(205, 0, 10800)); } /** Set the value of "Past weather (2 - 3h)" from a ::dba_var */ inline void set_past_wtr2_3h_var(const wreport::Var& val) { set(val, WR_VAR(0, 20, 5), Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(205, 0, 10800)); } /** Get the "Past weather (2 - 3h)" physical value stored in the message */ inline const wreport::Var* get_past_wtr2_3h_var() const { return find_by_id(DBA_MSG_PAST_WTR2_3H); } /** Set the value of "24 hour pressure change at ground level" from a variable of type double */ inline void set_press_24h(double val, int conf=-1) { setd(WR_VAR(0, 10, 60), val, conf, Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(4, 0, 86400)); } /** Set the value of "24 hour pressure change at ground level" from a ::dba_var */ inline void set_press_24h_var(const wreport::Var& val) { set(val, WR_VAR(0, 10, 60), Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(4, 0, 86400)); } /** Get the "24 hour pressure change at ground level" physical value stored in the message */ inline const wreport::Var* get_press_24h_var() const { return find_by_id(DBA_MSG_PRESS_24H); } /** Set the value of "3 hour pressure change at ground level" from a variable of type double */ inline void set_press_3h(double val, int conf=-1) { setd(WR_VAR(0, 10, 60), val, conf, Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(4, 0, 10800)); } /** Set the value of "3 hour pressure change at ground level" from a ::dba_var */ inline void set_press_3h_var(const wreport::Var& val) { set(val, WR_VAR(0, 10, 60), Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(4, 0, 10800)); } /** Get the "3 hour pressure change at ground level" physical value stored in the message */ inline const wreport::Var* get_press_3h_var() const { return find_by_id(DBA_MSG_PRESS_3H); } /** Set the value of "Total precipitation in the last 24 hours" from a variable of type double */ inline void set_tot_prec24(double val, int conf=-1) { setd(WR_VAR(0, 13, 11), val, conf, Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(1, 0, 86400)); } /** Set the value of "Total precipitation in the last 24 hours" from a ::dba_var */ inline void set_tot_prec24_var(const wreport::Var& val) { set(val, WR_VAR(0, 13, 11), Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(1, 0, 86400)); } /** Get the "Total precipitation in the last 24 hours" physical value stored in the message */ inline const wreport::Var* get_tot_prec24_var() const { return find_by_id(DBA_MSG_TOT_PREC24); } /** Set the value of "Total precipitation in the last 12 hours" from a variable of type double */ inline void set_tot_prec12(double val, int conf=-1) { setd(WR_VAR(0, 13, 11), val, conf, Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(1, 0, 43200)); } /** Set the value of "Total precipitation in the last 12 hours" from a ::dba_var */ inline void set_tot_prec12_var(const wreport::Var& val) { set(val, WR_VAR(0, 13, 11), Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(1, 0, 43200)); } /** Get the "Total precipitation in the last 12 hours" physical value stored in the message */ inline const wreport::Var* get_tot_prec12_var() const { return find_by_id(DBA_MSG_TOT_PREC12); } /** Set the value of "Total precipitation in the last 6 hours" from a variable of type double */ inline void set_tot_prec6(double val, int conf=-1) { setd(WR_VAR(0, 13, 11), val, conf, Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(1, 0, 21600)); } /** Set the value of "Total precipitation in the last 6 hours" from a ::dba_var */ inline void set_tot_prec6_var(const wreport::Var& val) { set(val, WR_VAR(0, 13, 11), Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(1, 0, 21600)); } /** Get the "Total precipitation in the last 6 hours" physical value stored in the message */ inline const wreport::Var* get_tot_prec6_var() const { return find_by_id(DBA_MSG_TOT_PREC6); } /** Set the value of "Total precipitation in the last 3 hours" from a variable of type double */ inline void set_tot_prec3(double val, int conf=-1) { setd(WR_VAR(0, 13, 11), val, conf, Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(1, 0, 10800)); } /** Set the value of "Total precipitation in the last 3 hours" from a ::dba_var */ inline void set_tot_prec3_var(const wreport::Var& val) { set(val, WR_VAR(0, 13, 11), Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(1, 0, 10800)); } /** Get the "Total precipitation in the last 3 hours" physical value stored in the message */ inline const wreport::Var* get_tot_prec3_var() const { return find_by_id(DBA_MSG_TOT_PREC3); } /** Set the value of "Total precipitation in the last hour" from a variable of type double */ inline void set_tot_prec1(double val, int conf=-1) { setd(WR_VAR(0, 13, 11), val, conf, Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(1, 0, 3600)); } /** Set the value of "Total precipitation in the last hour" from a ::dba_var */ inline void set_tot_prec1_var(const wreport::Var& val) { set(val, WR_VAR(0, 13, 11), Level(1, MISSING_INT, MISSING_INT, MISSING_INT), Trange(1, 0, 3600)); } /** Get the "Total precipitation in the last hour" physical value stored in the message */ inline const wreport::Var* get_tot_prec1_var() const { return find_by_id(DBA_MSG_TOT_PREC1); } dballe-5.18/dballe/msg/repinfo.h0000644000175000017500000000236011443506500013436 00000000000000/* * DB-ALLe - Archive for punctual meteorological data * * Copyright (C) 2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #ifndef DBA_MSG_REPINFO_H #define DBA_MSG_REPINFO_H /** @file * @ingroup msg * * rep_cod/rep_memo handling functions */ namespace dballe { /** * Return the file name for the default repinfo.csv * * @returns * The file name (which either points to the environment or to a static * string, and does not need to be deallocated) */ const char* repinfo_default_filename(); } // vim:set ts=4 sw=4: #endif dballe-5.18/dballe/msg/test-utils-lua.cc0000644000175000017500000001077711444162025015042 00000000000000/** * Copyright (C) 2008--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * Author: Enrico Zini */ #include "test-utils-lua.h" #include #include using namespace std; namespace dballe { namespace tests { Lua::Lua(const std::string& src) : L(NULL) { // Initialise the lua logic L = lua_open(); // NOTE: This one is optional: only use it for debugging #if LUA_VERSION_NUM >= 501 luaL_openlibs(L); #else luaopen_base(L); /* opens the basic library */ luaopen_table(L); /* opens the table library */ luaopen_io(L); /* opens the I/O library */ luaopen_string(L); /* opens the string lib. */ luaopen_math(L); /* opens the math lib. */ luaopen_loadlib(L); /* loadlib function */ luaopen_debug(L); /* debug library */ lua_settop(L, 0); #endif if (!src.empty()) loadString(src); } Lua::~Lua() { if (L) lua_close(L); } /// Load the test code from the given file void Lua::loadFile(const std::string& fname) { /// Load the prettyprinting functions m_filename = fname; if (luaL_loadfile(L, fname.c_str())) throw std::runtime_error(lua_tostring(L, -1)); create_lua_object(); } /// Load the test code from the given string containing Lua source code void Lua::loadString(const std::string& buf) { m_filename = "memory buffer"; if (luaL_loadbuffer(L, buf.data(), buf.size(), m_filename.c_str())) throw std::runtime_error(lua_tostring(L, -1)); create_lua_object(); } /// Runs the parsed code to let it define the 'test' function we are going /// to use void Lua::create_lua_object() { if (lua_pcall(L, 0, 0, 0)) { string error = lua_tostring(L, -1); lua_pop(L, 1); throw std::runtime_error(error); } // ensure that there is a 'test' function lua_getglobal(L, "test"); int type = lua_type(L, -1); if (type == LUA_TNIL) throw std::runtime_error("code did not define a function called 'test'"); if (type != LUA_TFUNCTION) throw std::runtime_error("the 'test' variable is not a function"); // Pop the 'test' function from the stack lua_pop(L, 1); } // From src/lbaselib.c in lua 5.1 /* ** If your system does not support `stdout', you can just remove this function. ** If you need, you can define your own `print' function, following this ** model but changing `fputs' to put the strings at a proper place ** (a console window or a log file, for instance). */ static int lua_ostream_print(lua_State *L) { // Access the closure parameters int outidx = lua_upvalueindex(1); void* ud = lua_touserdata(L, outidx); if (!ud) return luaL_error(L, "lua_report_print must be called as a closure with one userdata"); std::ostream& out = **(std::ostream**)ud; int n = lua_gettop(L); /* number of arguments */ int i; lua_getglobal(L, "tostring"); for (i=1; i<=n; i++) { const char *s; lua_pushvalue(L, -1); /* function to be called */ lua_pushvalue(L, i); /* value to print */ lua_call(L, 1, 1); s = lua_tostring(L, -1); /* get result */ if (s == NULL) return luaL_error(L, LUA_QL("tostring") " must return a string to " LUA_QL("print")); if (i>1) out << '\t'; out << s; lua_pop(L, 1); /* pop result */ } out << endl; return 0; } void Lua::captureOutput(std::ostream& buf) { // Create a C closure with the print function and the ostream to use std::ostream** s = (std::ostream**)lua_newuserdata(L, sizeof(std::ostream*)); *s = &buf; lua_pushcclosure(L, lua_ostream_print, 1); // redefine print lua_setglobal(L, "print"); } std::string Lua::run() { // Call the function without arguments lua_getglobal(L, "test"); if (lua_pcall(L, 0, 1, 0)) { string error = lua_tostring(L, -1); lua_pop(L, 1); throw std::runtime_error(error); } const char* res = lua_tostring(L, -1); lua_pop(L, 1); return res == NULL ? string() : res; } } } // vim:set ts=4 sw=4: dballe-5.18/dballe/msg/mkvars0000755000175000017500000001471111636644354013075 00000000000000#!/usr/bin/python # # DB-ALLe - Archive for punctual meteorological data # # Copyright (C) 2005--2010 ARPA-SIM # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # # Author: Enrico Zini import sys, re, os DESTDIR = "." if len(sys.argv) > 1: DESTDIR = sys.argv[1] class VC: def __init__(self, name): m = re.match(r"B(\d\d)(\d\d\d)", name) if not m: raise "Invalid B local" self.x = int(m.group(1)) self.y = int(m.group(2)) def __str__(self): return "B%02d%03d" % (self.x, self.y) def __cmp__(self, o): c = self.x.__cmp__(o.x) if c != 0: return c return self.y.__cmp__(o.y) class Var: def __init__(self, line): def cleanint(x): if x == '-': return "MISSING_INT" return str(int(x)) vals = re.split(r"\s*,\s*", line[:-1].strip()) self.name, self.type = vals[0:2] self.b = VC(vals[2]) self.letr = [cleanint(x) for x in vals[3:-1]] self.desc = vals[-1] def __str__(self): return ", ".join([self.name, str(self.b), ":".join([str(x) for x in self.letr[0:4]]), ":".join([str(x) for x in self.letr[4:]]), self.desc]) def __cmp__(self, o): def cmpval(a, b): if a == "MISSING_INT" and b == "MISSING_INT": return 0 if a == "MISSING_INT": return -1; if b == "MISSING_INT": return 1; return int(b) - int(a) for i in range(len(self.letr)): c = cmpval(self.letr[i], o.letr[i]) if c != 0: return c return self.b.__cmp__(o.b) vars = [Var(line) for line in sys.stdin if not re.match(r"^\s*(?:#.+)?$", line)] vars.sort() fh = open("%s/vars.h" % DESTDIR, "w") print >>fh, """#ifndef DBA_MSG_VARS_H #define DBA_MSG_VARS_H /** @file * @ingroup msg * Shortcut IDs and functions to quickly refer to commonly used values inside a * ::dba_msg. * * The shortcuts are defined in the file vars.csv, which maps a name to the tuple * (preferred C type, BLocal, Level type, L1, L2, P indicator, P1, P2). The file * vars.csv is used to generate code (vars.h and vars.c) that provides a set of * getters and setters for every named value. */ #include namespace dballe { /** * Full data corresponding to a shortcut ID */ struct MsgVarShortcut { /** Variable description code */ wreport::Varcode code; /** Type of the first level. See @ref level_table. */ int ltype1; /** L1 value of the level. See @ref level_table. */ int l1; /** Type of the second level. See @ref level_table. */ int ltype2; /** L2 value of the level. See @ref level_table. */ int l2; /** Time range type indicator. See @ref trange_table. */ int pind; /** Time range P1 indicator. See @ref trange_table. */ int p1; /** Time range P2 indicator. See @ref trange_table. */ int p2; }; /** Array with all the full expansions of the shortcut IDs, indexed by shortcut * ID */ extern struct MsgVarShortcut shortcutTable[]; /** Resolve a var name to a var ID */ int resolve_var(const char* name); /** Resolve a var name to a var ID, avoiding to compute the length of name */ int resolve_var_substring(const char* name, int len); """ for i, v in enumerate(vars): print >>fh, "/** %s */" % v.desc print >>fh, "#define DBA_MSG_%s %d" % (v.name, i) print >>fh, "/** Number of items in dba_msg_vartable */"; print >>fh, "#define DBA_MSG_VARTABLE_SIZE %d" % i; print >>fh, """ } #endif """ fh.close() fh = open("%s/msg-extravars.h" % DESTDIR, "w") types = dict(int = 'int', num = 'double', str = 'const char*') ftypes = dict(int = 'i', num = 'd', str = 'c') for v in vars: print >>fh, "/** Set the value of \"%s\" from a variable of type %s */" % (v.desc, types[v.type]) print >>fh, "inline void set_%s(%s val, int conf=-1) " % (v.name.lower(), types[v.type]), #print >>sys.stderr, v #print >>sys.stderr, "--", [ftypes[v.type], v.b.x, v.b.y] + v.letr; print >>fh, "{ set%s(WR_VAR(0, %d, %d), val, conf, Level(%s, %s, %s, %s), Trange(%s, %s, %s)); }" % \ tuple([ftypes[v.type], v.b.x, v.b.y] + v.letr); print >>fh, "/** Set the value of \"%s\" from a ::dba_var */" % v.desc; print >>fh, "inline void set_%s_var(const wreport::Var& val) " % v.name.lower(), print >>fh, "{ set(val, WR_VAR(0, %d, %d), Level(%s, %s, %s, %s), Trange(%s, %s, %s)); }" % \ tuple([v.b.x, v.b.y] + v.letr) print >>fh, "/** Get the \"%s\" physical value stored in the message */" % v.desc; print >>fh, "inline const wreport::Var* get_%s_var() const" % v.name.lower(); print >>fh, "{ return find_by_id(DBA_MSG_%s); }" % \ v.name; fh.close() fc = open("%s/vars.gperf" % DESTDIR, "w") print >>fc, """ %define slot-name name %define class-name MsgVarLookup %define lookup-function-name find %struct-type %language=C++ %global-table %compare-strncmp /* Using %switch may be faster (remember to check when doing optimizations) */ %{ #include #include #include namespace dballe { %} struct msgvardef { const char* name; int var; }; %%""" for v in vars: print >>fc, "%s, DBA_MSG_%s" % (v.name.lower(), v.name) print >>fc, """%% int resolve_var(const char* name) { struct msgvardef* res = MsgVarLookup::find(name, strlen(name)); if (res == NULL) return -1; else return res->var; } int resolve_var_substring(const char* name, int len) { struct msgvardef* res = MsgVarLookup::find(name, len); if (res == NULL) return -1; else return res->var; } """ print >>fc, "struct MsgVarShortcut shortcutTable[] = {" for v in vars: print >>fc, " { WR_VAR(0, %d, %d), %s, %s, %s, %s, %s, %s, %s }," % tuple([v.b.x, v.b.y] + v.letr) print >>fc, "};" print >>fc, "} // namespace dballe" fc.close() sys.exit() dballe-5.18/dballe/msg/msg.cc0000644000175000017500000007032111732344323012726 00000000000000/* * dballe/msg - Hold an interpreted weather bulletin * * Copyright (C) 2005--2011 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #include "msg.h" #include "context.h" #include "dballe/msg/vars.h" #include #include #include #include #include #include #include #include #include using namespace wreport; using namespace std; namespace dballe { const char* msg_type_name(MsgType type) { switch (type) { case MSG_GENERIC: return "generic"; case MSG_SYNOP: return "synop"; case MSG_PILOT: return "pilot"; case MSG_TEMP: return "temp"; case MSG_TEMP_SHIP: return "temp_ship"; case MSG_AIREP: return "airep"; case MSG_AMDAR: return "amdar"; case MSG_ACARS: return "acars"; case MSG_SHIP: return "ship"; case MSG_BUOY: return "buoy"; case MSG_METAR: return "metar"; case MSG_SAT: return "sat"; case MSG_POLLUTION: return "pollution"; } return "(unknown)"; } Msg::Msg() { type = MSG_GENERIC; } Msg::~Msg() { for (vector::iterator i = data.begin(); i != data.end(); ++i) delete *i; } Msg::Msg(const Msg& m) : type(m.type) { // Reserve space for the new contexts data.reserve(m.data.size()); // Copy the contexts for (vector::const_iterator i = m.data.begin(); i != m.data.end(); ++i) data.push_back(new msg::Context(**i)); } Msg& Msg::operator=(const Msg& m) { // Manage a = a if (this == &m) return *this; type = m.type; // Delete existing vars for (vector::iterator i = data.begin(); i != data.end(); ++i) delete *i; data.clear(); // Reserve space for the new contexts data.reserve(m.data.size()); // Copy the contexts for (vector::const_iterator i = m.data.begin(); i != m.data.end(); ++i) data.push_back(new msg::Context(**i)); return *this; } void Msg::clear() { type = MSG_GENERIC; for (vector::iterator i = data.begin(); i != data.end(); ++i) delete *i; data.clear(); } int Msg::find_index(const Level& lev, const Trange& tr) const { /* Binary search */ int low = 0, high = data.size() - 1; while (low <= high) { int middle = low + (high - low)/2; //fprintf(stderr, "DMFC lo %d hi %d mid %d\n", low, high, middle); int cmp = -data[middle]->compare(lev, tr); if (cmp < 0) high = middle - 1; else if (cmp > 0) low = middle + 1; else return middle; } return -1; } const msg::Context* Msg::find_context(const Level& lev, const Trange& tr) const { int pos = find_index(lev, tr); if (pos == -1) return NULL; return data[pos]; } const msg::Context* Msg::find_station_context() const { return find_context(Level::ana(), Trange::ana()); } msg::Context* Msg::edit_context(const Level& lev, const Trange& tr) { int pos = find_index(lev, tr); if (pos == -1) return NULL; return data[pos]; } msg::Context& Msg::obtain_context(const Level& lev, const Trange& tr) { int pos = find_index(lev, tr); if (pos == -1) { auto_ptr c(new msg::Context(lev, tr)); msg::Context* res = c.get(); add_context(c); return *res; } return *data[pos]; } void Msg::add_context(auto_ptr ctx) { // Enlarge the data data.resize(data.size() + 1); /* Insertionsort. Crude, but our datasets should be too small for an * RB-Tree to be worth */ int pos; for (pos = data.size() - 1; pos > 0; --pos) { int cmp = data[pos - 1]->compare(*ctx); if (cmp > 0) data[pos] = data[pos - 1]; else if (cmp == 0) { data.erase(data.begin() + pos); throw error_consistency("attempting to add a context that already exists in the message"); } else break; } data[pos] = ctx.release(); } bool Msg::remove_context(const Level& lev, const Trange& tr) { int pos = find_index(lev, tr); if (pos == -1) return false; delete data[pos]; data.erase(data.begin() + pos); return true; } const Var* Msg::find(Varcode code, const Level& lev, const Trange& tr) const { const msg::Context* ctx = find_context(lev, tr); if (ctx == NULL) return NULL; return ctx->find(code); } wreport::Var* Msg::edit(wreport::Varcode code, const Level& lev, const Trange& tr) { msg::Context* ctx = edit_context(lev, tr); if (ctx == NULL) return NULL; return ctx->edit(code); } const Var* Msg::find_by_id(int id) const { const MsgVarShortcut& v = shortcutTable[id]; return find(v.code, Level(v.ltype1, v.l1, v.ltype2, v.l2), Trange(v.pind, v.p1, v.p2)); } const msg::Context* Msg::find_context_by_id(int id) const { const MsgVarShortcut& v = shortcutTable[id]; return find_context(Level(v.ltype1, v.l1, v.ltype2, v.l2), Trange(v.pind, v.p1, v.p2)); } Var* Msg::edit_by_id(int id) { const MsgVarShortcut& v = shortcutTable[id]; return edit(v.code, Level(v.ltype1, v.l1, v.ltype2, v.l2), Trange(v.pind, v.p1, v.p2)); } namespace { struct VarContext { // Extract datetime, lat, lon const Var* lat; const Var* lon; const Var* year; const Var* month; const Var* day; const Var* hour; const Var* minute; const Var* second; const Var* memo; const char* rep_memo; VarContext(const Msg& m) { // Extract datetime, lat, lon lat = m.get_latitude_var(); lon = m.get_longitude_var(); year = m.get_year_var(); month = m.get_month_var(); day = m.get_day_var(); hour = m.get_hour_var(); minute = m.get_minute_var(); second = m.get_second_var(); memo = m.get_rep_memo_var(); if (memo) rep_memo = memo->enqc(); else rep_memo = Msg::repmemo_from_type(m.type); } void print(ostream& out, msg::Context& c) { // Longitude if (lon) out << setprecision(5) << lon->enqd() << ","; else out << ","; // Latitude if (lat) out << setprecision(5) << lat->enqd() << ","; else out << ","; // Report type out << rep_memo << ","; if (c.level.ltype1 != 257) { // Datetime out << setfill('0') << setw(4) << (year ? year->enq(0) : 0) << "-"; out << setfill('0') << setw(2) << (month ? month->enq(0) : 0) << "-"; out << setfill('0') << setw(2) << (day ? day->enq(0) : 0) << " "; out << setfill('0') << setw(2) << (hour ? hour->enq(0) : 0) << ":"; out << setfill('0') << setw(2) << (minute ? minute->enq(0) : 0) << ":"; out << setfill('0') << setw(2) << (second ? second->enq(0) : 0) << ","; // Level c.level.format(out, ""); out << ","; // Time range c.trange.format(out, ""); out << ","; } else out << ",,,,,,,,"; } }; } void Msg::to_csv(std::ostream& out) const { VarContext vc(*this); for (std::vector::const_iterator ci = data.begin(); ci != data.end(); ++ci) { msg::Context& c = **ci; for (std::vector::const_iterator vi = c.data.begin(); vi != c.data.end(); ++vi) { Var& v = **vi; vc.print(out, c); out << format_code(v.code()) << ","; // B code csv_output_quoted_string(out, v.format("")); out << endl; // Add attribute columns for (const Var* a = v.next_attr(); a != NULL; a = a->next_attr()) { vc.print(out, c); out << format_code(v.code()) << "." << format_code(a->code()) << ","; // B code csv_output_quoted_string(out, a->format("")); out << endl; } } } } void Msg::csv_header(std::ostream& out) { out << "Longitude,Latitude,Report,Date,Level1,L1,Level2,L2,Time range,P1,P2,Varcode,Value" << endl; } bool Msg::from_csv(CSVReader& in) { // Seek to beginning, skipping empty lines if (!in.move_to_data()) return false; string old_lat, old_lon, old_rep, old_date; bool first = true; while (true) { // If there are empty lines, use them as separators if (in.cols.empty()) break; if (in.cols.size() != 13) error_consistency::throwf("cannot parse CSV line has %zd fields instead of 13", in.cols.size()); if (first) { // If we are the first run, initialse old_* markers with the contents of this line old_lon = in.cols[0]; old_lat = in.cols[1]; old_rep = in.cols[2]; old_date = in.cols[3]; set_latitude(strtod(old_lat.c_str(), NULL)); set_longitude(strtod(old_lon.c_str(), NULL)); set_rep_memo(old_rep.c_str()); if (!old_date.empty()) set_date(old_date.c_str()); type = type_from_repmemo(old_rep.c_str()); first = false; } else if (old_lon != in.cols[0] || old_lat != in.cols[1] || old_rep != in.cols[2]) { // If Longitude, Latitude or Report change, we are done break; } else if (old_date != in.cols[3]) { // In case of Date differences, we need to deal with station // information for which the date is left empty if (old_date.empty()) { // previous lines were station information, next line is data old_date = in.cols[3]; set_date(old_date.c_str()); } else if (in.cols[3].empty()) // previous lines were data, next line is station information ; // Keep the old date else // The date has changed, we are done. break; } // 0 1 2 3 4 5 6 7 8 9 10 11 12 // out << "Longitude,Latitude,Report,Date,Level1,L1,Level2,L2,Time range,P1,P2,Varcode,Value" << endl; // Acquire the data Level lev(in.cols[4].c_str(), in.cols[5].c_str(), in.cols[6].c_str(), in.cols[7].c_str()); if (in.cols[3].empty()) // If we have station info, set level accordingly lev = Level::ana(); Trange tr(in.cols[8].c_str(), in.cols[9].c_str(), in.cols[10].c_str()); // Parse variable code if (in.cols[11].size() == 13) { // Bxxyyy.Bxxyyy: attribute Varcode vcode = descriptor_code(in.cols[11].substr(0, 6).c_str()); // Find master variable wreport::Var* var = edit(vcode, lev, tr); if (var == NULL) error_consistency::throwf("cannot find corresponding variable for attribute %s", in.cols[11].c_str()); Varcode acode = descriptor_code(in.cols[11].substr(7).c_str()); auto_ptr attr = newvar(acode); Varinfo info = attr->info(); attr->set_from_formatted(in.cols[12].c_str()); var->seta(attr); } else if (in.cols[11].size() == 6) { // Bxxyyy: variable Varcode vcode = descriptor_code(in.cols[11].c_str()); auto_ptr var = newvar(vcode); var->set_from_formatted(in.cols[12].c_str()); set(var, lev, tr); } else error_consistency::throwf("cannot parse variable code %s", in.cols[11].c_str()); if (!in.next()) break; } return true; } void Msg::print(FILE* out) const { fprintf(out, "%s message ", msg_type_name(type)); if (data.empty()) { fprintf(stderr, "(empty)\n"); return; } fprintf(out, "with %zd contexts:\n", data.size()); switch (type) { case MSG_PILOT: case MSG_TEMP: case MSG_TEMP_SHIP: for (vector::const_iterator i = data.begin(); i != data.end(); ++i) { const Var* vsig = (*i)->find_vsig(); if (vsig != NULL) { int vs = vsig->enqi(); fprintf(out, "Sounding #%zd (level %d -", (i - data.begin()) + 1, vs); if (vs & BUFR08042::MISSING) fprintf(out, " missing"); if (vs & BUFR08042::H2PRESS) fprintf(out, " h2press"); if (vs & BUFR08042::RESERVED) fprintf(out, " reserved"); if (vs & BUFR08042::REGIONAL) fprintf(out, " regional"); if (vs & BUFR08042::TOPWIND) fprintf(out, " topwind"); if (vs & BUFR08042::ENDMISSW) fprintf(out, " endmissw"); if (vs & BUFR08042::BEGMISSW) fprintf(out, " begmissw"); if (vs & BUFR08042::ENDMISSH) fprintf(out, " endmissh"); if (vs & BUFR08042::BEGMISSH) fprintf(out, " begmissh"); if (vs & BUFR08042::ENDMISST) fprintf(out, " endmisst"); if (vs & BUFR08042::BEGMISST) fprintf(out, " begmisst"); if (vs & BUFR08042::SIGWIND) fprintf(out, " sigwind"); if (vs & BUFR08042::SIGHUM) fprintf(out, " sighum"); if (vs & BUFR08042::SIGTEMP) fprintf(out, " sigtemp"); if (vs & BUFR08042::MAXWIND) fprintf(out, " maxwind"); if (vs & BUFR08042::TROPO) fprintf(out, " tropo"); if (vs & BUFR08042::STD) fprintf(out, " std"); if (vs & BUFR08042::SURFACE) fprintf(out, " surface"); fprintf(out, ") "); } (*i)->print(out); } break; default: for (vector::const_iterator i = data.begin(); i != data.end(); ++i) (*i)->print(out); break; } } static void context_summary(const msg::Context& c, ostream& out) { out << "c(" << c.level << ", " << c.trange << ")"; } unsigned Msg::diff(const Msg& msg) const { unsigned diffs = 0; if (type != msg.type) { notes::logf("the messages have different type (first is %s (%d), second is %s (%d))\n", msg_type_name(type), type, msg_type_name(msg.type), msg.type); ++diffs; } size_t i1 = 0, i2 = 0; while (i1 < data.size() || i2 < msg.data.size()) { if (i1 == data.size()) { notes::log() << "Context "; context_summary(*msg.data[i2], notes::log()); notes::log() << " exists only in the second message" << endl; ++i2; ++diffs; } else if (i2 == msg.data.size()) { notes::log() << "Context "; context_summary(*data[i1], notes::log()); notes::log() << " exists only in the first message" << endl; ++i1; ++diffs; } else { int cmp = data[i1]->compare(*msg.data[i2]); if (cmp == 0) { diffs += data[i1]->diff(*msg.data[i2]); ++i1; ++i2; } else if (cmp < 0) { if (data[i1]->data.size() != 0) { notes::log() << "Context "; context_summary(*data[i1], notes::log()); notes::log() << " exists only in the first message" << endl; ++diffs; } ++i1; } else { if (msg.data[i2]->data.size() != 0) { notes::log() << "Context "; context_summary(*msg.data[i2], notes::log()); notes::log() << " exists only in the second message" << endl; ++diffs; } ++i2; } } } return diffs; } void Msg::set_by_id(const wreport::Var& var, int shortcut) { const MsgVarShortcut& v = shortcutTable[shortcut]; return set(var, v.code, Level(v.ltype1, v.l1, v.ltype2, v.l2), Trange(v.pind, v.p1, v.p2)); } void Msg::set(const Var& var, Varcode code, const Level& lev, const Trange& tr) { set(var_copy_without_unset_attrs(var, code), lev, tr); } void Msg::set(std::auto_ptr var, const Level& lev, const Trange& tr) { msg::Context& ctx = obtain_context(lev, tr); ctx.set(var); } void Msg::seti(Varcode code, int val, int conf, const Level& lev, const Trange& tr) { auto_ptr var(newvar(code, val)); if (conf != -1) var->seta(auto_ptr(newvar(WR_VAR(0, 33, 7), conf))); set(var, lev, tr); } void Msg::setd(Varcode code, double val, int conf, const Level& lev, const Trange& tr) { auto_ptr var(newvar(code, val)); if (conf != -1) var->seta(auto_ptr(newvar(WR_VAR(0, 33, 7), conf))); set(var, lev, tr); } void Msg::setc(Varcode code, const char* val, int conf, const Level& lev, const Trange& tr) { auto_ptr var(newvar(code, val)); if (conf != -1) var->seta(auto_ptr(newvar(WR_VAR(0, 33, 7), conf))); set(var, lev, tr); } void Msg::set_date(const char* date) { int ye, mo, da, ho, mi, se; if (sscanf(date, "%04d-%02d-%02d %02d:%02d:%02d", &ye, &mo, &da, &ho, &mi, &se) != 6) error_consistency::throwf("cannot parse date/time string \"%s\"", date); set_year(ye); set_month(mo); set_day(da); set_hour(ho); set_minute(mi); set_second(se); } MsgType Msg::type_from_repmemo(const char* repmemo) { if (repmemo == NULL || repmemo[0] == 0) return MSG_GENERIC; switch (tolower(repmemo[0])) { case 'a': if (strcasecmp(repmemo+1, "cars")==0) return MSG_ACARS; if (strcasecmp(repmemo+1, "irep")==0) return MSG_AIREP; if (strcasecmp(repmemo+1, "mdar")==0) return MSG_AMDAR; break; case 'b': if (strcasecmp(repmemo+1, "uoy")==0) return MSG_BUOY; break; case 'm': if (strcasecmp(repmemo+1, "etar")==0) return MSG_METAR; break; case 'p': if (strcasecmp(repmemo+1, "ilot")==0) return MSG_PILOT; if (strcasecmp(repmemo+1, "ollution")==0) return MSG_POLLUTION; break; case 's': if (strcasecmp(repmemo+1, "atellite")==0) return MSG_SAT; if (strcasecmp(repmemo+1, "hip")==0) return MSG_SHIP; if (strcasecmp(repmemo+1, "ynop")==0) return MSG_SYNOP; break; case 't': if (strcasecmp(repmemo+1, "emp")==0) return MSG_TEMP; if (strcasecmp(repmemo+1, "empship")==0) return MSG_TEMP_SHIP; break; } return MSG_GENERIC; } const char* Msg::repmemo_from_type(MsgType type) { switch (type) { case MSG_SYNOP: return "synop"; case MSG_METAR: return "metar"; case MSG_SHIP: return "ship"; case MSG_BUOY: return "buoy"; case MSG_AIREP: return "airep"; case MSG_AMDAR: return "amdar"; case MSG_ACARS: return "acars"; case MSG_PILOT: return "pilot"; case MSG_TEMP: return "temp"; case MSG_TEMP_SHIP: return "tempship"; case MSG_SAT: return "satellite"; case MSG_POLLUTION: return "pollution"; case MSG_GENERIC: default: return "generic"; } } void Msg::sounding_pack_levels(Msg& dst) const { dst.clear(); dst.type = type; for (size_t i = 0; i < data.size(); ++i) { const msg::Context& ctx = *data[i]; // If it is not a sounding level, just copy it if (ctx.find_vsig() == NULL) { auto_ptr newctx(new msg::Context(ctx)); dst.add_context(newctx); continue; } // FIXME: shouldn't this also set significance bits in the output level? for (size_t j = 0; j < ctx.data.size(); ++j) { auto_ptr copy(new Var(*ctx.data[j])); dst.set(copy, Level(ctx.level.ltype1, ctx.level.l1), ctx.trange); } } } #if 0 void Msg::sounding_unpack_levels(Msg& dst) const { dst.clear(); dst.type = type; for (size_t i = 0; i < data.size(); ++i) { const msg::Context& ctx = *data[i]; const Var* vsig_var = ctx.find_vsig(); if (!vsig_var) { auto_ptr newctx(new msg::Context(ctx)); dst.add_context(newctx); continue; } int vsig = vsig_var->enqi(); if (vsig & VSIG_MISSING) { // If there is no vsig, then we consider it a normal level auto_ptr newctx(new msg::Context(ctx)); dst.add_context(newctx); continue; } /* DBA_RUN_OR_GOTO(fail, dba_var_enqi(msg->data[i].var_press, &press)); */ /* TODO: delete the dba_msg_datum that do not belong in that level */ if (vsig & VSIG_SIGWIND) { auto_ptr copy(new msg::Context(ctx)); copy->level.l2 = 6; dst.add_context(copy); } if (vsig & VSIG_SIGTEMP) { auto_ptr copy(new msg::Context(ctx)); copy->level.l2 = 5; dst.add_context(copy); } if (vsig & VSIG_MAXWIND) { auto_ptr copy(new msg::Context(ctx)); copy->level.l2 = 4; dst.add_context(copy); } if (vsig & VSIG_TROPOPAUSE) { auto_ptr copy(new msg::Context(ctx)); copy->level.l2 = 3; dst.add_context(copy); } if (vsig & VSIG_STANDARD) { auto_ptr copy(new msg::Context(ctx)); copy->level.l2 = 2; dst.add_context(copy); } if (vsig & VSIG_SURFACE) { auto_ptr copy(new msg::Context(ctx)); copy->level.l2 = 1; dst.add_context(copy); } } } #endif void Msg::parse_date(int* values) const { const msg::Context* c = find_station_context(); if (!c) { for (int i = 0; i < 6; ++i) values[i] = -1; return; } int macros[] = { DBA_MSG_YEAR, DBA_MSG_MONTH, DBA_MSG_DAY, DBA_MSG_HOUR, DBA_MSG_MINUTE, DBA_MSG_SECOND }; const char* names[] = { "year", "month", "day", "hour", "minute", "second" }; for (int i = 0; i < 6; i++) { const wreport::Var* v = c->find_by_id(macros[i]); if (v) values[i] = v->enq(-1); else values[i] = -1; if (i > 0 && (values[i-1] == -1 && values[i] != -1)) error_consistency::throwf("%s is unset but %s is set", names[i-1], names[i]); } /* Now values is either 6 times -1, 6 values, or X values followed by 6-X times -1 */ /* If one of the extremes has been selected, fill in the blanks */ if (values[0] != -1) { values[1] = values[1] != -1 ? values[1] : 1; values[2] = values[2] != -1 ? values[2] : 1; values[3] = values[3] != -1 ? values[3] : 0; values[4] = values[4] != -1 ? values[4] : 0; values[5] = values[5] != -1 ? values[5] : 0; } } MatchedMsg::MatchedMsg(const Msg& m) : m(m) { } MatchedMsg::~MatchedMsg() { } matcher::Result MatchedMsg::match_var_id(int val) const { for (std::vector::const_iterator ci = m.data.begin(); ci != m.data.end(); ++ci) for (std::vector::const_iterator vi = (*ci)->data.begin(); vi != (*ci)->data.end(); ++vi) if (const Var* a = (*vi)->enqa(WR_VAR(0, 33, 195))) if (a->enqi() == val) return matcher::MATCH_YES; return matcher::MATCH_NA; } matcher::Result MatchedMsg::match_station_id(int val) const { if (const wreport::Var* var = m.find(WR_VAR(0, 1, 192), Level::ana(), Trange::ana())) { return var->enqi() == val ? matcher::MATCH_YES : matcher::MATCH_NO; } else return matcher::MATCH_NA; } matcher::Result MatchedMsg::match_station_wmo(int block, int station) const { const msg::Context* c = m.find_station_context(); if (!c) return matcher::MATCH_NA; if (const wreport::Var* var = c->find_by_id(DBA_MSG_BLOCK)) { // Match block if (var->enqi() != block) return matcher::MATCH_NO; // If station was not requested, we are done if (station == -1) return matcher::MATCH_YES; // Match station if (const wreport::Var* var = c->find_by_id(DBA_MSG_STATION)) { if (var->enqi() != station) return matcher::MATCH_NO; return matcher::MATCH_YES; } } return matcher::MATCH_NA; } matcher::Result MatchedMsg::match_date(const int* min, const int* max) const { int date[6]; m.parse_date(date); if (date[0] == -1) return matcher::MATCH_NA; return Matched::date_in_range(date, min, max); } matcher::Result MatchedMsg::match_coords(int latmin, int latmax, int lonmin, int lonmax) const { const msg::Context* c = m.find_station_context(); if (!c) return matcher::MATCH_NA; matcher::Result r1 = matcher::MATCH_NA; if (const wreport::Var* var = c->find_by_id(DBA_MSG_LATITUDE)) r1 = Matched::int_in_range(var->enqi(), latmin, latmax); else if (latmin == MISSING_INT && latmax == MISSING_INT) r1 = matcher::MATCH_YES; matcher::Result r2 = matcher::MATCH_NA; if (const wreport::Var* var = c->find_by_id(DBA_MSG_LONGITUDE)) r2 = Matched::int_in_range(var->enqi(), lonmin, lonmax); else if (lonmin == MISSING_INT && lonmax == MISSING_INT) r2 = matcher::MATCH_YES; if (r1 == matcher::MATCH_YES && r2 == matcher::MATCH_YES) return matcher::MATCH_YES; if (r1 == matcher::MATCH_NO || r2 == matcher::MATCH_NO) return matcher::MATCH_NO; return matcher::MATCH_NA; } matcher::Result MatchedMsg::match_rep_memo(const char* memo) const { if (const Var* var = m.get_rep_memo_var()) { const char* val = var->value(); if (!val) return matcher::MATCH_NA; return strcmp(memo, val) == 0 ? matcher::MATCH_YES : matcher::MATCH_NO; } else return matcher::MATCH_NA; } #if 0 static dba_err dba_msg_add_context(dba_msg msg, dba_msg_context ctx) { dba_err err; dba_msg_context copy = NULL; DBA_RUN_OR_RETURN(dba_msg_context_copy(ctx, ©)); DBA_RUN_OR_GOTO(fail, dba_msg_add_context_nocopy(msg, copy)); return dba_error_ok(); fail: if (copy) dba_msg_context_delete(copy); return err; } dba_err dba_msg_set_nocopy_by_id(dba_msg msg, dba_var var, int id) { dba_msg_var v = &dba_msg_vartable[id]; return dba_msg_set_nocopy(msg, var, v->ltype1, v->l1, v->ltype2, v->l2, v->pind, v->p1, v->p2); } dba_err dba_msg_set_by_id(dba_msg msg, dba_var var, int id) { dba_msg_var v = &dba_msg_vartable[id]; dba_err err; dba_var copy = NULL; /* Make a copy of the variable, to give it to dba_msg_add_nocopy */ DBA_RUN_OR_RETURN(dba_var_create_local(v->code, ©)); /* Use copy_val to ensure we get the variable code we want */ DBA_RUN_OR_GOTO(fail, dba_var_copy_val(copy, var)); DBA_RUN_OR_GOTO(fail, dba_msg_set_nocopy(msg, copy, v->ltype1, v->l1, v->ltype2, v->l2, v->pind, v->p1, v->p2)); return dba_error_ok(); fail: if (copy != NULL) dba_var_delete(copy); return err; } dba_msg_type dba_msg_get_type(dba_msg msg) { return msg->type; } #endif } // namespace dballe /* vim:set ts=4 sw=4: */ dballe-5.18/dballe/msg/wr_codec.h0000644000175000017500000001650411627713531013576 00000000000000/* * dballe/wr_codec - BUFR/CREX import and export * * Copyright (C) 2005--2010 ARPA-SIM * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Author: Enrico Zini */ #ifndef DBALLE_MSG_WR_CODEC_H #define DBALLE_MSG_WR_CODEC_H #include #include #include #include #include #include namespace wreport { struct Bulletin; struct Subset; } namespace dballe { struct Msg; namespace msg { class WRImporter : public Importer { public: WRImporter(const Options& opts); /** * Import a decoded BUFR/CREX message */ virtual void from_bulletin(const wreport::Bulletin& msg, Msgs& msgs) const; }; class BufrImporter : public WRImporter { public: BufrImporter(const Options& opts=Options()); virtual ~BufrImporter(); virtual void from_rawmsg(const Rawmsg& msg, Msgs& msgs) const; }; class CrexImporter : public WRImporter { public: CrexImporter(const Options& opts=Options()); virtual ~CrexImporter(); virtual void from_rawmsg(const Rawmsg& msg, Msgs& msgs) const; }; class WRExporter : public Exporter { public: WRExporter(const Options& opts); /** * Import a decoded BUFR/CREX message */ virtual void to_bulletin(const Msgs& msgs, wreport::Bulletin& msg) const; /** * Infer a template name from the message contents */ std::string infer_template(const Msgs& msgs) const; }; class BufrExporter : public WRExporter { public: BufrExporter(const Options& opts=Options()); virtual ~BufrExporter(); virtual void to_rawmsg(const Msgs& msgs, Rawmsg& msg) const; virtual std::auto_ptr make_bulletin() const; }; class CrexExporter : public WRExporter { public: CrexExporter(const Options& opts=Options()); virtual ~CrexExporter(); virtual void to_rawmsg(const Msgs& msgs, Rawmsg& msg) const; virtual std::auto_ptr make_bulletin() const; }; namespace wr { struct TemplateRegistry; class Template { protected: virtual void setupBulletin(wreport::Bulletin& bulletin); virtual void to_subset(const Msg& msg, wreport::Subset& subset); void add(wreport::Varcode code, const msg::Context* ctx, int shortcut) const; void add(wreport::Varcode code, const msg::Context* ctx, wreport::Varcode srccode) const; void add(wreport::Varcode code, const msg::Context* ctx) const; void add(wreport::Varcode code, int shortcut) const; void add(wreport::Varcode code, wreport::Varcode srccode, const Level& level, const Trange& trange) const; void add(wreport::Varcode code, const wreport::Var* var) const; // Set station name, truncating it if it's too long void add_st_name(wreport::Varcode dstcode, const msg::Context* ctx) const; void do_ecmwf_past_wtr() const; void do_D01001() const; void do_D01004() const; void do_D01011() const; int do_D01012() const; // Return the number of hours void do_D01013() const; void do_D01021() const; public: const Exporter::Options& opts; const Msgs& msgs; const Msg* msg; // Msg being read const msg::Context* c_station; const msg::Context* c_gnd_instant; wreport::Subset* subset; // Subset being written Template(const Exporter::Options& opts, const Msgs& msgs) : opts(opts), msgs(msgs), msg(0), subset(0) {} virtual ~Template() {} virtual const char* name() const = 0; virtual const char* description() const = 0; virtual void to_bulletin(wreport::Bulletin& bulletin); }; struct TemplateFactory { std::string name; std::string description; virtual ~TemplateFactory() {} virtual std::auto_ptr